[PATCH 0/1] gnu: Add erlang-lfe.

  • Done
  • quality assurance status badge
Details
2 participants
  • Maxim Cournoyer
  • Tim Johann
Owner
unassigned
Submitted by
Tim Johann
Severity
normal
T
T
Tim Johann wrote on 15 Aug 2023 17:23
(address . guix-patches@gnu.org)(name . Tim Johann)(address . t1m@phrogstar.de)
cover.1692105836.git.t1m@phrogstar.de
Please, find attached a package definition for Lisp Flavoured Erlang.

I am aware of the earlier attempt to package LFE by jgart [1] (since a few days), but I was already on track with everything, including the replacement of the 'check' phase, and did not take anything from that solution.

I guess, that jgart's problem was the same as I encountered: while the binaries are built with a standard gnu Makefile, the tests use rebar3. rebar3 would download the dependencies instead of reusing existing Guix packages. My solution was 'inspired' by how the rebar3 build method handles dependencies. The rebar3-build-system links the dependencies to a subdirectory _checkouts from which the later _build directory is copied and used for fetching all rebar3 plugins, overriding the download locations in rebar.config [2,3]. But with linking the dependencies, the file permissions stay read-only, and with rebar trying multiple times to copy to _build, the 'check' phase would fail with permission denied. This is the reason for copying dependencies from the store, to be able to modify the permissions.




Tim Johann (1):
* gnu/packages/erlang.scm (erlang-lfe): New variable.

gnu/packages/erlang.scm | 77 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)


base-commit: 2279e3e60479e91838db2d7261e86e91f9891650
--
2.41.0
T
T
Tim Johann wrote on 15 Aug 2023 17:27
[PATCH 1/1] * gnu/packages/erlang.scm (erlang-lfe): New variable.
(address . 65313@debbugs.gnu.org)(name . Tim Johann)(address . t1m@phrogstar.de)
b8c5bafe7e600d9e58e7cd2ddaf0a85301dc7c87.1692105836.git.t1m@phrogstar.de
---
gnu/packages/erlang.scm | 77 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)

Toggle diff (87 lines)
diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index a7f161647b..df7212b0e5 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -738,3 +738,80 @@ (define-public rebar3-proper
(description "This plugin allows running PropEr test suites from within
rebar3.")
(license license:bsd-3)))
+
+(define-public erlang-lfe
+ (package
+ (name "erlang-lfe")
+ (version "2.1.2")
+ (source
+ (origin
+ (method git-fetch)
+ ;; The tarball from http://erlang.org/download contains many
+ ;; pre-compiled files, so we use this snapshot of the source
+ ;; repository.
+ (uri (git-reference
+ (url "https://github.com/lfe/lfe")
+ (commit "v2.1.2")))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "180hz1p2v3vb6yyzcfwircmljlnd86ln8z80lzy3mwlyrcxblvxy"))))
+ (build-system gnu-build-system)
+ (native-inputs
+ (list rebar3 rebar3-proper erlang-proper))
+ (propagated-inputs
+ (list erlang))
+ (arguments
+ `(#:phases
+ (modify-phases %standard-phases
+ (delete 'configure)
+
+ ;; The following is inspired by rebar-build-system.scm
+ (add-before 'check 'erlang-depends
+ (lambda* (#:key inputs #:allow-other-keys)
+ (use-modules (ice-9 ftw))
+ (define input-directories
+ (map (lambda (p) (cdr (assoc p inputs)))
+ '("rebar3-proper" "erlang-proper")))
+ (mkdir-p "_checkouts")
+ (for-each
+ (lambda (input-dir)
+ (let ((elibdir (string-append input-dir "/lib/erlang/lib")))
+ (when (directory-exists? elibdir)
+ (for-each
+ (lambda (dirname)
+ (let ((src (string-append elibdir "/" dirname))
+ (dest (string-append "_checkouts/" dirname)))
+ (when (not (file-exists? dest))
+ ;; symlinking will not work, since rebar3 will try
+ ;; to overwrite the _build directory several times
+ ;; with the contents of _checkout, so we copy the
+ ;; directory tree to _checkout and make it writeable.
+ (copy-recursively src dest #:follow-symlinks? #t)
+ (for-each
+ (lambda (file)
+ (chmod file #o777))
+ (find-files dest)))))
+ (scandir elibdir
+ (lambda (file)
+ (and (not (member file '("." "..")))
+ (file-is-directory? (string-append elibdir "/" file)))))))))
+ input-directories)))
+
+ (replace 'check
+ (lambda* (#:key tests? #:allow-other-keys)
+ (when tests?
+ (begin
+ ;;(setenv "DEBUG" "1")
+ (setenv "REBAR_CACHE_DIR" "/tmp")
+ (invoke "make" "tests"))))))
+ #:make-flags
+ (list (string-append "PREFIX=" (assoc-ref %outputs "out"))
+ "CC=gcc")))
+ (home-page "https://github.com/lfe/lfe")
+ (synopsis "Lisp Flavoured Erlang")
+ (description
+ "LFE, Lisp Flavoured Erlang, is a lisp syntax front-end to the Erlang
+compiler. Code produced with it is compatible with \"normal\" Erlang
+ code. An LFE evaluator and shell is also included.")
+ (license license:asl2.0)))
--
2.41.0
M
M
Maxim Cournoyer wrote on 5 Sep 2023 15:41
Re: bug#65313: [PATCH 0/1] gnu: Add erlang-lfe.
(name . Tim Johann)(address . t1m@phrogstar.de)(address . 65313@debbugs.gnu.org)
874jk8lot5.fsf_-_@gmail.com
tags 65313 + moreinfo
quit

Hello,

Tim Johann <t1m@phrogstar.de> writes:

Toggle quote (36 lines)
> ---
> gnu/packages/erlang.scm | 77 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 77 insertions(+)
>
> diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
> index a7f161647b..df7212b0e5 100644
> --- a/gnu/packages/erlang.scm
> +++ b/gnu/packages/erlang.scm
> @@ -738,3 +738,80 @@ (define-public rebar3-proper
> (description "This plugin allows running PropEr test suites from within
> rebar3.")
> (license license:bsd-3)))
> +
> +(define-public erlang-lfe
> + (package
> + (name "erlang-lfe")
> + (version "2.1.2")
> + (source
> + (origin
> + (method git-fetch)
> + ;; The tarball from http://erlang.org/download contains many
> + ;; pre-compiled files, so we use this snapshot of the source
> + ;; repository.
> + (uri (git-reference
> + (url "https://github.com/lfe/lfe")
> + (commit "v2.1.2")))
> + (file-name (git-file-name name version))
> + (sha256
> + (base32
> + "180hz1p2v3vb6yyzcfwircmljlnd86ln8z80lzy3mwlyrcxblvxy"))))
> + (build-system gnu-build-system)
> + (native-inputs
> + (list rebar3 rebar3-proper erlang-proper))
> + (propagated-inputs
> + (list erlang))

Nitpick: less than 5 dependencies can fit be formatted on the same line,
if it fits, e.g.

(native-inputs (list rebar3 rebar3-proper erlang-proper))

Otherwise the convention is to use something like

(native-inputs
(list package1
package2
...))

Or let 'guix style' take care of it.

Toggle quote (3 lines)
> + (arguments
> + `(#:phases

New packages should use gexps for arguments, so something like
(arguments
(list #:phases #~(modify-phases %standard-phases
...)))

Toggle quote (11 lines)
> + (modify-phases %standard-phases
> + (delete 'configure)
> +
> + ;; The following is inspired by rebar-build-system.scm
> + (add-before 'check 'erlang-depends
> + (lambda* (#:key inputs #:allow-other-keys)
> + (use-modules (ice-9 ftw))
> + (define input-directories
> + (map (lambda (p) (cdr (assoc p inputs)))
> + '("rebar3-proper" "erlang-proper")))

It's not typically safe to call use-modules elsewhere than at the top
level (it would cause problems with macros). For imports, you should
use the #:modules build argument. Here you could also simply use

(define input-directories (list #$(this-package-input "rebar3-proper")
#$(this-package-input "erlang-proper")))

since there are only 2 items.


Toggle quote (20 lines)
> + (mkdir-p "_checkouts")
> + (for-each
> + (lambda (input-dir)
> + (let ((elibdir (string-append input-dir "/lib/erlang/lib")))
> + (when (directory-exists? elibdir)
> + (for-each
> + (lambda (dirname)
> + (let ((src (string-append elibdir "/" dirname))
> + (dest (string-append "_checkouts/" dirname)))
> + (when (not (file-exists? dest))
> + ;; symlinking will not work, since rebar3 will try
> + ;; to overwrite the _build directory several times
> + ;; with the contents of _checkout, so we copy the
> + ;; directory tree to _checkout and make it writeable.
> + (copy-recursively src dest #:follow-symlinks? #t)
> + (for-each
> + (lambda (file)
> + (chmod file #o777))
> + (find-files dest)))))

If you add (srfi srfi-26) to #:modules, you can express this more
succintly with:

(for-each (cut chmod <> #o777)
(find-files dest))

Toggle quote (5 lines)
> + (scandir elibdir
> + (lambda (file)
> + (and (not (member file '("." "..")))
> + (file-is-directory? (string-append elibdir "/" file)))))))))

Please format the code to stay within 80 columns of text. 'guix lint'
should report that.

Toggle quote (10 lines)
> + input-directories)))
> +
> + (replace 'check
> + (lambda* (#:key tests? #:allow-other-keys)
> + (when tests?
> + (begin
> + ;;(setenv "DEBUG" "1")
> + (setenv "REBAR_CACHE_DIR" "/tmp")
> + (invoke "make" "tests"))))))

If the tests take time and they can not in parallel, the "-j" option
should be provided with the (number->string (parallel-job-count)) value.

Toggle quote (4 lines)
> + #:make-flags
> + (list (string-append "PREFIX=" (assoc-ref %outputs "out"))
> + "CC=gcc")))

This should use gexps as well, replacing the assoc-ref above with just
#$output.

--
Thanks,
Maxim
T
T
Tim Johann wrote on 6 Sep 2023 17:53
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)(address . 65313@debbugs.gnu.org)
87tts7i633.fsf@phrogstar.de
Attachment: file
M
M
Maxim Cournoyer wrote on 6 Sep 2023 19:21
(name . Tim Johann)(address . t1m@phrogstar.de)(address . 65313@debbugs.gnu.org)
875y4n5ib0.fsf@gmail.com
Hi Tim,

Tim Johann <t1m@phrogstar.de> writes:

Toggle quote (4 lines)
> Hi Maxim,
>
> Thanks for the review. I learned a lot.

Happy to read it!

Toggle quote (13 lines)
> Is there more documentation on the #:modules specification? I would
> like to know if there is a variable containing the modules added to
> the builder file when not specifying #:modules in the arguments? Or
> do I need to repeat them there, as I have done so far:
> #:modules '((ice-9 ftw)
> (srfi srfi-26)
> (guix build gnu-build-system)
> (guix build utils))
>
> The (guix build _) modules are the ones that are present when I don't
> use the #:modules argument. ftw is for 'scandir' and srfi-26 - as you
> suggested - for 'cut'

Your approach is the correct one. You have to look at the
guix/build/*.scm files to see what are their default #:modules, and
combine that value with the ones you want to add. For
#:imported-modules (which is for external scheme modules to be made
available in the environment), there are sometimes public variables that
can be used.

To make it more convenient, an improvement could be to either export
public variables for the base modules for each build system, or we could
go even farther and change the #:modules semantic so that it'd extend
rather than override what the build systems uses by default.

I hope that helps,

--
Thanks,
Maxim
T
T
Tim Johann wrote on 6 Sep 2023 22:57
[PATCH v2] * gnu/packages/erlang.scm (erlang-lfe): New variable.
(address . 65313@debbugs.gnu.org)
43d67dfca58a7dd9384f5c566a50f3f647ce23ab.1694033873.git.t1m@phrogstar.de
---
gnu/packages/erlang.scm | 72 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 72 insertions(+)

Toggle diff (91 lines)
diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index a7f161647b..b0ad4ea2a7 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -27,6 +27,7 @@
(define-module (gnu packages erlang)
#:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix gexp)
#:use-module (guix build-system gnu)
#:use-module (guix build-system emacs)
#:use-module (guix build-system rebar)
@@ -738,3 +739,74 @@ (define-public rebar3-proper
(description "This plugin allows running PropEr test suites from within
rebar3.")
(license license:bsd-3)))
+
+(define-public erlang-lfe
+ (package
+ (name "erlang-lfe")
+ (version "2.1.2")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/lfe/lfe")
+ (commit "v2.1.2")))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "180hz1p2v3vb6yyzcfwircmljlnd86ln8z80lzy3mwlyrcxblvxy"))))
+ (build-system gnu-build-system)
+ (native-inputs (list rebar3 rebar3-proper erlang-proper))
+ (propagated-inputs (list erlang))
+ (arguments
+ (list
+ #:modules '((ice-9 ftw)
+ (srfi srfi-26)
+ (guix build gnu-build-system)
+ (guix build utils))
+ #:phases
+ #~(modify-phases %standard-phases
+ (delete 'configure)
+ ;; The following is inspired by rebar-build-system.scm
+ (add-before 'check 'erlang-depends
+ (lambda* (#:key inputs #:allow-other-keys)
+ (define input-directories
+ (list #$(this-package-native-input "rebar3-proper")
+ #$(this-package-native-input "erlang-proper")))
+ (mkdir-p "_checkouts")
+ (for-each
+ (lambda (input-dir)
+ (let ((elibdir (string-append input-dir "/lib/erlang/lib")))
+ (when (directory-exists? elibdir)
+ (for-each
+ (lambda (dirname)
+ (let ((src (string-append elibdir "/" dirname))
+ (dest (string-append "_checkouts/" dirname)))
+ (when (not (file-exists? dest))
+ ;; symlinking will not work, since rebar3 will
+ ;; try to overwrite the _build directory several
+ ;; times with the contents of _checkout, so we
+ ;; copy the directory tree to _checkout and make
+ ;; it writeable.
+ (copy-recursively src dest #:follow-symlinks? #t)
+ (for-each (cut chmod <> #o777) (find-files dest)))))
+ (scandir elibdir (lambda (file)
+ (and (not (member file '("." "..")))
+ (file-is-directory?
+ (string-append elibdir
+ "/"
+ file)))))))))
+ input-directories)))
+ (replace 'check
+ (lambda* (#:key tests? #:allow-other-keys)
+ (when tests?
+ (begin
+ (setenv "REBAR_CACHE_DIR" "/tmp")
+ (invoke "make" "-j" "tests"))))))
+ #:make-flags
+ #~(list (string-append "PREFIX=" #$output) "CC=gcc")))
+ (home-page "https://github.com/lfe/lfe")
+ (synopsis "Lisp Flavoured Erlang")
+ (description
+ "LFE, Lisp Flavoured Erlang, is a lisp syntax front-end to the Erlang
+compiler. Code produced with it is compatible with \"normal\" Erlang
+ code. An LFE evaluator and shell is also included.")
+ (license license:asl2.0)))

base-commit: 65dcfb3f3865d08467da747041263fd22460d393
--
2.41.0
M
M
Maxim Cournoyer wrote on 7 Sep 2023 04:32
(name . Tim Johann)(address . t1m@phrogstar.de)(address . 65313-done@debbugs.gnu.org)
87pm2uogqa.fsf@gmail.com
Hi Tim,

Tim Johann <t1m@phrogstar.de> writes:

Toggle quote (4 lines)
> ---
> gnu/packages/erlang.scm | 72 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 72 insertions(+)

I've adjusted the commit message like so:

Toggle snippet (5 lines)
gnu: Add erlang-lfe.
* gnu/packages/erlang.scm (erlang-lfe): New variable.

Made other small cosmetic changes such as moving the #:make-flags above
the #:phases, the inputs after the build arguments, added a copyright
line with your name, and installed it with commit 5ef28595e.

Thank you for your contribution!

--
Maxim
Closed
?