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

From: Roman Scherer <[email-masked]>
Date: Sun, 27 Mar 2022 19:55:16 +0200

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

From b1568732c8aa95aa8f6cd914a903be2f807c252d Mon Sep 17 00:00:00 2001
From: r0man <[email-masked]>
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 | 48 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index 42fc13f4c2..dad0fe62e8 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -5731,6 +5731,54 @@ (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)
+               ;; 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))
+      (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

From f2726c3c87d890dfb547e7e9de880c5c57954ccf Mon Sep 17 00:00:00 2001
From: r0man <[email-masked]>
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

Maxime Devos <[email-masked]> 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]]