[bug#77990,v2] gnu: Add emacs-ffi.

Message ID bf785b91e8c2fe9844c2fc3c472d86d2e39e61e4.1745335913.git.suhail@bayesians.ca
State New
Headers
Series [bug#77990,v2] gnu: Add emacs-ffi. |

Commit Message

Suhail Singh April 22, 2025, 2:51 p.m. UTC
  * gnu/packages/emacs-xyz.scm (emacs-ffi): New variable.

Change-Id: I3379ff4728d3e3f45d5327978b5e284fcc0e664e
---
 gnu/packages/emacs-xyz.scm | 53 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)


base-commit: c8194a529724721e2b96e0fe259cd92b63ff57aa
  

Comments

Cayetano Santos April 22, 2025, 6:49 p.m. UTC | #1
>mar. 22 avril 2025 at 10:51, "Suhail Singh" <suhailsingh247@gmail.com> wrote:

> * gnu/packages/emacs-xyz.scm (emacs-ffi): New variable.
>
> Change-Id: I3379ff4728d3e3f45d5327978b5e284fcc0e664e
> ---
>  gnu/packages/emacs-xyz.scm | 53 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 53 insertions(+)
>
> diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
> index 08bd88fd08..e6253089e8 100644
> --- a/gnu/packages/emacs-xyz.scm
> +++ b/gnu/packages/emacs-xyz.scm
> @@ -236,6 +236,7 @@ (define-module (gnu packages emacs-xyz)
>    #:use-module (gnu packages llvm)
>    #:use-module (gnu packages image)
>    #:use-module (gnu packages image-viewers)
> +  #:use-module (gnu packages libffi)
>    #:use-module (gnu packages linux)
>    #:use-module (gnu packages libevent)
>    #:use-module (gnu packages lisp)
> @@ -23092,6 +23093,58 @@ (define-public emacs-display-wttr
>  @uref{https://wttr.in} and then displays it on the mode line.")
>      (license license:gpl3+)))
>
> +(define-public emacs-ffi
> +  (package
> +    (name "emacs-ffi")
> +    (version "0.2.1")
> +    (source
> +     (origin
> +       (method git-fetch)
> +       (uri (git-reference
> +             (url "https://github.com/emacs-ffi/emacs-ffi")
> +             (commit version)))
> +       (file-name (git-file-name name version))
> +       (sha256
> +        (base32 "05crpgscpbzkg4k0ylbfjz2wyw2r8lki8q9w2kmdpljsqrpdrwl0"))))
> +    (build-system emacs-build-system)
> +    (arguments
> +     (list
> +      #:tests? (not (%current-target-system))
> +      #:phases
> +      #~(modify-phases %standard-phases
> +          (add-after 'unpack 'patch-module-load
> +            (lambda _
> +              (make-file-writable "src/ffi.el")
> +              (emacs-substitute-sexps "src/ffi.el"
> +                ("(require 'ffi-module nil t)"
> +                 `(module-load
> +                   ,(string-append #$output "/lib/ffi-module.so"))))))
> +          (add-before 'check 'build-emacs-module
> +            (lambda _
> +              ;; Compile the shared object file.
> +              (invoke "make"
> +                      #$(string-append "CC="
> +                                       (cc-for-target)))
> +              ;; Copy the build artifacts to root and let the install phase do
> +              ;; its thing
> +              (copy-recursively "build/lib" ".")
> +              ;; Install the shared object file into /lib.
> +              (install-file "build/lib/ffi-module.so"
> +                            (string-append #$output "/lib"))))

I have a doubt about where do we  put .so files.

- lib
- lib/package
- lib/emacs (see emacs-jinx)

Other than this, LFTM.

C.
  
Suhail Singh April 23, 2025, 2:32 a.m. UTC | #2
Cayetano Santos <csantosb@inventati.org> writes:

>> +              ;; Install the shared object file into /lib.
>> +              (install-file "build/lib/ffi-module.so"
>> +                            (string-append #$output "/lib"))))
>
> I have a doubt about where do we  put .so files.
>
> - lib
> - lib/package
> - lib/emacs (see emacs-jinx)
>
> Other than this, LFTM.

IIUC the standard place for shared libraries is in #$output/lib.  I
don't know of any reason to deviate from that in this case.  To the
extent it matters, at least one other dynamic module (emacs-sqlite3-api)
also uses that convention.

I'm no authority, but it seems that Emacs dynamic modules are simply
less consistent about storing libraries in the standard location, rather
than there being a principled reason against using the standard
convention.

Thanks for the review.
  

Patch

diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index 08bd88fd08..e6253089e8 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -236,6 +236,7 @@  (define-module (gnu packages emacs-xyz)
   #:use-module (gnu packages llvm)
   #:use-module (gnu packages image)
   #:use-module (gnu packages image-viewers)
+  #:use-module (gnu packages libffi)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages libevent)
   #:use-module (gnu packages lisp)
@@ -23092,6 +23093,58 @@  (define-public emacs-display-wttr
 @uref{https://wttr.in} and then displays it on the mode line.")
     (license license:gpl3+)))
 
+(define-public emacs-ffi
+  (package
+    (name "emacs-ffi")
+    (version "0.2.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/emacs-ffi/emacs-ffi")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "05crpgscpbzkg4k0ylbfjz2wyw2r8lki8q9w2kmdpljsqrpdrwl0"))))
+    (build-system emacs-build-system)
+    (arguments
+     (list
+      #:tests? (not (%current-target-system))
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'patch-module-load
+            (lambda _
+              (make-file-writable "src/ffi.el")
+              (emacs-substitute-sexps "src/ffi.el"
+                ("(require 'ffi-module nil t)"
+                 `(module-load
+                   ,(string-append #$output "/lib/ffi-module.so"))))))
+          (add-before 'check 'build-emacs-module
+            (lambda _
+              ;; Compile the shared object file.
+              (invoke "make"
+                      #$(string-append "CC="
+                                       (cc-for-target)))
+              ;; Copy the build artifacts to root and let the install phase do
+              ;; its thing
+              (copy-recursively "build/lib" ".")
+              ;; Install the shared object file into /lib.
+              (install-file "build/lib/ffi-module.so"
+                            (string-append #$output "/lib"))))
+          (add-before 'install 'installinfo
+            (lambda _
+              (install-file "build/doc/emacs-ffi.info"
+                            (string-append #$output "/share/info")))))))
+    (inputs (list emacs-compat libltdl libffi))
+    (native-inputs (list texinfo))
+    (home-page "https://emacs-ffi.github.io/emacs-ffi/")
+    (synopsis "FFI for Emacs based on libffi")
+    (description
+     "This package provides an FFI for Emacs.  It is based on
+libffi and relies on the dynamic module support in order to be loaded into
+Emacs.  It is relatively full-featured, but for the time being low-level.")
+    (license license:gpl3+)))
+
 (define-public emacs-free-keys
   (package
     (name "emacs-free-keys")