Message ID | b8c5bafe7e600d9e58e7cd2ddaf0a85301dc7c87.1692105836.git.t1m@phrogstar.de |
---|---|
State | New |
Headers | show |
Series | gnu: Add erlang-lfe. | expand |
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.
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 ------------------------------------------------------------------------
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 --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)))