diff mbox series

[bug#54581] Add emacs-sqlite3-api package

Message ID 87zglbs1hp.fsf@burningswell.com
State Accepted
Headers show
Series [bug#54581] Add emacs-sqlite3-api package | expand

Commit Message

Roman Scherer March 27, 2022, 5:55 p.m. UTC
Hi Maxime,

thanks for the review. I attached 2 patches.

0001-Add-emacs-sqlite3-api-package.patch

In this one I addressed your following comments:

- I changed the synopsis and the description
- Removed the make flags
- I'm using cc-for-target now
- Enabled tests

The tests are passing, and I tested it manually by evaluating the Emacs
Lisp code snippets in [1]. Everything seems to work fine.

0001-Add-emacs-sqlite3-api-package-generate-constants.patch

In this patch I did the same as above, and I generated the consts.c file
by running make in the "tools" directory. The tests are passing fine,
but when I manually test it by evaluating the Elisp snippets in [1] I
get an error that the sqlite-open-readwrite and sqlite-open-create are
not defined in Emacs. The .so file is loaded by Emacs but somehow it
does not work.

I looked at the diff between the consts.c committed in the repository
and the generated one, but I could not see any changes related to those
functions. I'm still a bit lost about this and could need some help.

But I also wonder if generating the consts.c file is actually better
than just using the checked in consts.c file. The command to generate
the file fetches a web page from the Sqlite website and builds the
consts.c file with this information. And I think this is kind of a
brittle approach. How would this approach would even work with Software
heritage?

I think my preference would be to go without generating the consts.c
file, the patch works, it uses the same file the maintainer of the
packages is using, and I believe it is less brittle. :)

What do you think?

[1] https://github.com/pekingduck/emacs-sqlite3-api#introduction
Maxime Devos <maximedevos@telenet.be> writes:

> [[PGP Signed Part:Undecided]]
> Roman Scherer schreef op za 26-03-2022 om 15:09 [+0100]:
>> +         #:phases
>> +         (modify-phases %standard-phases
>
> Could consts.c be built from source?
>
> [[End of PGP Signed Part]]

Comments

M March 27, 2022, 7:19 p.m. UTC | #1
Roman Scherer schreef op zo 27-03-2022 om 19:55 [+0200]:
> +           (add-before 'check 'build-emacs-module
> +             (lambda* (#:key (make-flags '()) outputs #:allow-other-
> keys)

'make-flags' can be removed here.
M March 27, 2022, 7:20 p.m. UTC | #2
Roman Scherer schreef op zo 27-03-2022 om 19:55 [+0200]:
> +         #:tests? #t

To allow (*) cross-compilation, this needs to be #:tests? ,(%current-
target-system).

(*) cross-compilation won't work yet because Emacs is not yet cross-
compilable.

Greetings,
Maxime.
M March 27, 2022, 7:34 p.m. UTC | #3
Roman Scherer schreef op zo 27-03-2022 om 19:55 [+0200]:
> But I also wonder if generating the consts.c file is actually better
> than just using the checked in consts.c file. The command to generate
> the file fetches a web page from the Sqlite website and builds the
> consts.c file with this information. And I think this is kind of a
> brittle approach. How would this approach would even work with
> Software
> heritage?

As-is, it won't even build, because the build container does not have
network access.  Something you could try, is adding an origin to the
'inputs':

(package
  (name "emacs-sqlite...")
  (inputs `(("web-page" ,(origin [...]
https://sqlite.org/c3ref/constlist.html [...])))))

and do some appropriate substitutions.  Problem is that this page is
not stable ...

To resolve this, you could modify gen-consts.py to not use the web page
to filter things out, basically, delete:

useful_codes = []
with open(sys.argv[1]) as f:
  for l in f.readlines():
    useful_codes.append(l.rstrip())

and

  #print("{0}".format(fields[1]))
  if not fields[1] in useful_codes:
    #print("{0} excluded".format(fields[1]))
    continue

and strip out the curl stuff from gen-consts.sh.

If you do this, don't forget to remove the non-deterministic NOW=$(date
...).

Greetings,
Maxime.
M March 27, 2022, 7:45 p.m. UTC | #4
Roman Scherer schreef op zo 27-03-2022 om 19:55 [+0200]:
> I think my preference would be to go without generating the consts.c
> file, the patch works, it uses the same file the maintainer of the
> packages is using, and I believe it is less brittle. :)

I don't expect any practical problems but technically it isn't source
code, and rather a binary (or, as GPL words it, ‘object code’), at
least according to the GPL's definition:

  The "source code" for a work means the preferred form of the work
  for making modifications to it.  "Object code" means any non-source
  form of a work.

, and Guix builds things from source. I don't think constants.c is in
preferred form, rather it seems to be sqlite.h

Maybe it's not much of a problem here though, I donk't know.

I don't see the relevancy of what files the maintainer is using.  What
does maintainerhood have to do with anything?

Greetings,
Maxime.
diff mbox series

Patch

From f2726c3c87d890dfb547e7e9de880c5c57954ccf Mon Sep 17 00:00:00 2001
From: r0man <roman@burningswell.com>
Date: Sat, 26 Mar 2022 14:59:01 +0100
Subject: [PATCH] Add emacs-sqlite3-api package

This patch adds the emacs-sqlite3-api package to Guix.

The package provides a dynamic module for Emacs that allows direct access to
the SQLite C interface.  It only exposes a subset of the full SQLite C
interface, but should satisfy most user's needs.
---
 gnu/packages/emacs-xyz.scm | 51 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index 42fc13f4c2..87595db74c 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -5731,6 +5731,57 @@  (define-public emacs-sqlite
 It is not intended as a user interface.")
       (license license:gpl3+))))
 
+(define-public emacs-sqlite3-api
+  (let ((version "0.15")
+        (revision "0")
+        (commit "7cb4b660fe30deb8a4229f3abb18bd99ca9c971c"))
+    (package
+      (name "emacs-sqlite3-api")
+      (version (git-version version revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/pekingduck/emacs-sqlite3-api")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "1b7if1dp6i5kqwhq25gna89xbca66i4mmgx1a5yn12kncfdgs6d7"))))
+      (build-system emacs-build-system)
+      (arguments
+       `(#:modules ((guix build emacs-build-system)
+                    (guix build emacs-utils)
+                    (guix build utils))
+         #:phases
+         (modify-phases %standard-phases
+           (add-after 'unpack 'patch-module-load
+             (lambda* (#:key outputs #:allow-other-keys)
+               (chmod "sqlite3.el" #o644)
+               (emacs-substitute-sexps "sqlite3.el"
+                 ("(require 'sqlite3-api nil t)"
+                  `(module-load ,(string-append (assoc-ref outputs "out")
+                                                "/lib/sqlite3-api.so"))))))
+           (add-before 'check 'build-emacs-module
+             (lambda* (#:key (make-flags '()) outputs #:allow-other-keys)
+               ;; Generate the consts.c file.
+               (invoke "make" "--directory=tools")
+               ;; Compile the shared object file.
+               (invoke "make" (string-append "CC=" ,(cc-for-target)))
+               ;; Move the shared object file into /lib.
+               (install-file "sqlite3-api.so"
+                             (string-append (assoc-ref outputs "out")
+                                            "/lib")))))
+         #:tests? #t
+         #:test-command '("make" "test" "EMACS=emacs")))
+      (inputs (list sqlite))
+      (native-inputs (list curl pandoc python))
+      (home-page "https://github.com/pekingduck/emacs-sqlite3-api")
+      (synopsis "SQLite dynamic module for Emacs Lisp")
+      (description "This package provides a dynamic module for Emacs that allows
+direct access to the SQLite C interface.  It only exposes a subset of the full
+SQLite C interface, but should satisfy most user's needs.")
+      (license license:gpl3+))))
+
 (define-public emacs-sr-speedbar
   (let ((commit "77a83fb50f763a465c021eca7343243f465b4a47")
         (revision "0"))
-- 
2.34.0