diff mbox series

[bug#65313,1/1] * gnu/packages/erlang.scm (erlang-lfe): New variable.

Message ID b8c5bafe7e600d9e58e7cd2ddaf0a85301dc7c87.1692105836.git.t1m@phrogstar.de
State New
Headers show
Series gnu: Add erlang-lfe. | expand

Commit Message

Tim Johann Aug. 15, 2023, 3:27 p.m. UTC
---
 gnu/packages/erlang.scm | 77 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 77 insertions(+)

Comments

Maxim Cournoyer Sept. 5, 2023, 1:41 p.m. UTC | #1
tags 65313 + moreinfo
quit

Hello,

Tim Johann <t1m@phrogstar.de> writes:

> ---
>  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.

> +    (arguments
> +     `(#:phases

New packages should use gexps for arguments, so something like
       (arguments
        (list #:phases #~(modify-phases %standard-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")))

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.


> +             (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))

> +                     (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.

> +              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.

> +       #: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.
Tim Johann Sept. 6, 2023, 3:53 p.m. UTC | #2
Hi Maxim,

Thanks for the review.  I learned a lot.

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'

Other than that, I have a working package declaration for erlang-lfe with your suggestions incorporated.  I would just like to know the answer to above question, before I submit the revision.

Thank you very much indeed.

- Tim

Maxim Cournoyer <maxim.cournoyer@gmail.com> writes:

> tags 65313 + moreinfo
> quit
>
> Hello,
>
> Tim Johann <t1m@phrogstar.de> writes:
>
>> ---
>>  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.
>
>> +    (arguments
>> +     `(#:phases
>
> New packages should use gexps for arguments, so something like
>        (arguments
>         (list #:phases #~(modify-phases %standard-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")))
>
> 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.
>
>
>> +             (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))
>
>> +                     (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.
>
>> +              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.
>
>> +       #: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.



------------------------------------------------------------------------
Tim Johann
AIH Staff Scientist

Klaus-Tschira-Institute for Computational Cardiology, Bioinformatics,
Internal Medicine III
University Hospital Heidelberg
Im Neuenheimer Feld 669
D-69120 Heidelberg

Tel.: (+49) 6221 56 39 12 6

*AI Health innovation Cluster*

<https://www.aih-cluster.ai/>

</home/t1m/.emacs.d/user/org-msg-signature/aih-cluster-logo.png>

A collaboration of DKFZ, EMBL, Heidelberg University, Heidelberg University Hospital,
University Hospital Mannheim, Central Institute of Mental Health, and the Max Planck
Institute for Medical Research
------------------------------------------------------------------------
Maxim Cournoyer Sept. 6, 2023, 5:21 p.m. UTC | #3
Hi Tim,

Tim Johann <t1m@phrogstar.de> writes:

> Hi Maxim,
>
> Thanks for the review.  I learned a lot.

Happy to read it!

> 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,
diff mbox series

Patch

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)))