diff mbox series

[bug#68964,v2] gnu: elixir: Remove wrap for mix.

Message ID e3860c80d88125ab6cb593e9f2dc6c4fd303eb18.1707293586.git.andrew@trop.in
State New
Headers show
Series [bug#68964,v2] gnu: elixir: Remove wrap for mix. | expand

Commit Message

Andrew Tropin Feb. 7, 2024, 8:13 a.m. UTC
* gnu/packages/elixir.scm (elixir)[#:phases]: Instead of wrapping mix into
shell script, which sets environment variables, we patch mix itself and set
environmnet variables via elixir code.

Change-Id: Ia4643e18fe927491242a0541938b7570bd56fca1

Co-authored-by: Ivan Sokolov <ivan-p-sokolov@ya.ru>
Change-Id: I29d2c61299a8a54125f0e15190c526a860d501da
---
Changes since v1: Added Ivan's copyright and co-authored-by.

 gnu/packages/elixir.scm | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)


base-commit: cce7a6d2d2b18f51d1fcab67b02a38c11d6f4f2d

Comments

Liliana Marie Prikler Feb. 7, 2024, 6:22 p.m. UTC | #1
Am Mittwoch, dem 07.02.2024 um 11:13 +0300 schrieb Andrew Tropin:
> * gnu/packages/elixir.scm (elixir)[#:phases]: Instead of wrapping mix
> into
> shell script, which sets environment variables, we patch mix itself
> and set
> environmnet variables via elixir code.
> 
> Change-Id: Ia4643e18fe927491242a0541938b7570bd56fca1
> 
> Co-authored-by: Ivan Sokolov <ivan-p-sokolov@ya.ru>
> Change-Id: I29d2c61299a8a54125f0e15190c526a860d501da
> ---
> Changes since v1: Added Ivan's copyright and co-authored-by.
> 
>  gnu/packages/elixir.scm | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/gnu/packages/elixir.scm b/gnu/packages/elixir.scm
> index ef8c39d0d7..2d11707711 100644
> --- a/gnu/packages/elixir.scm
> +++ b/gnu/packages/elixir.scm
> @@ -7,6 +7,8 @@
>  ;;; Copyright © 2018 Nikita <nikita@n0.is>
>  ;;; Copyright © 2021 Oskar Köök <oskar@maatriks.ee>
>  ;;; Copyright © 2021 Cees de Groot <cg@evrl.com>
> +;;; Copyright © 2024 Andrew Tropin <andrew@trop.in>
> +;;; Copyright © 2024 Ivan Sokolov <ivan-p-sokolov@ya.ru>
>  ;;;
>  ;;; This file is part of GNU Guix.
>  ;;;
> @@ -101,7 +103,18 @@ (define-public elixir
>            (add-after 'install 'wrap-programs
>              (lambda* (#:key inputs outputs #:allow-other-keys)
>                (let* ((out (assoc-ref outputs "out"))
> -                     (programs '("elixir" "elixirc" "iex" "mix")))
> +                     (programs '("elixir" "elixirc" "iex")))
> +                ;; mix can be sourced as an elixir script by other
> elixir
> +                ;; program, for example `iex -S mix`, so we should
> not wrap
> +                ;; mix into shell script.
> +                (substitute* (string-append out "/bin/mix")
> +                  (("Mix.start\\(\\)") "\
> +~w[GUIX_ELIXIR_LIBS ERL_LIBS]
> +|> Enum.map(&System.get_env/1)
> +|> Enum.reject(&is_nil/1)
> +|> Enum.join(\":\")
> +|> case do \"\" -> :ok; erl_libs -> System.put_env(\"ERL_LIBS\",
> erl_libs) end
> +Mix.start()"))
You might want to make a patch for that.  I don't speak Elixir, but
from what I understand, this LGTM.

Cheers
Andrew Tropin Feb. 8, 2024, 9:39 a.m. UTC | #2
On 2024-02-07 19:22, Liliana Marie Prikler wrote:

> Am Mittwoch, dem 07.02.2024 um 11:13 +0300 schrieb Andrew Tropin:
>> * gnu/packages/elixir.scm (elixir)[#:phases]: Instead of wrapping mix
>> into
>> shell script, which sets environment variables, we patch mix itself
>> and set
>> environmnet variables via elixir code.
>> 
>> Change-Id: Ia4643e18fe927491242a0541938b7570bd56fca1
>> 
>> Co-authored-by: Ivan Sokolov <ivan-p-sokolov@ya.ru>
>> Change-Id: I29d2c61299a8a54125f0e15190c526a860d501da
>> ---
>> Changes since v1: Added Ivan's copyright and co-authored-by.
>> 
>>  gnu/packages/elixir.scm | 15 ++++++++++++++-
>>  1 file changed, 14 insertions(+), 1 deletion(-)
>> 
>> diff --git a/gnu/packages/elixir.scm b/gnu/packages/elixir.scm
>> index ef8c39d0d7..2d11707711 100644
>> --- a/gnu/packages/elixir.scm
>> +++ b/gnu/packages/elixir.scm
>> @@ -7,6 +7,8 @@
>>  ;;; Copyright © 2018 Nikita <nikita@n0.is>
>>  ;;; Copyright © 2021 Oskar Köök <oskar@maatriks.ee>
>>  ;;; Copyright © 2021 Cees de Groot <cg@evrl.com>
>> +;;; Copyright © 2024 Andrew Tropin <andrew@trop.in>
>> +;;; Copyright © 2024 Ivan Sokolov <ivan-p-sokolov@ya.ru>
>>  ;;;
>>  ;;; This file is part of GNU Guix.
>>  ;;;
>> @@ -101,7 +103,18 @@ (define-public elixir
>>            (add-after 'install 'wrap-programs
>>              (lambda* (#:key inputs outputs #:allow-other-keys)
>>                (let* ((out (assoc-ref outputs "out"))
>> -                     (programs '("elixir" "elixirc" "iex" "mix")))
>> +                     (programs '("elixir" "elixirc" "iex")))
>> +                ;; mix can be sourced as an elixir script by other
>> elixir
>> +                ;; program, for example `iex -S mix`, so we should
>> not wrap
>> +                ;; mix into shell script.
>> +                (substitute* (string-append out "/bin/mix")
>> +                  (("Mix.start\\(\\)") "\
>> +~w[GUIX_ELIXIR_LIBS ERL_LIBS]
>> +|> Enum.map(&System.get_env/1)
>> +|> Enum.reject(&is_nil/1)
>> +|> Enum.join(\":\")
>> +|> case do \"\" -> :ok; erl_libs -> System.put_env(\"ERL_LIBS\",
>> erl_libs) end
>> +Mix.start()"))
> You might want to make a patch for that.  I don't speak Elixir, but
> from what I understand, this LGTM.

Thank you for reply!  Patch make sense for the consistency with similiar
fixes for other applications, however, it is also reasonable to keep the
logic of adding support for GUIX_ELIXIR_LIBS to all elixir binaries in
one build phase.  Both options seems viable to me, I'll stick with
substitute solution for now.

Applied and pushed as
https://git.savannah.gnu.org/cgit/guix.git/commit/?id=a903558577
diff mbox series

Patch

diff --git a/gnu/packages/elixir.scm b/gnu/packages/elixir.scm
index ef8c39d0d7..2d11707711 100644
--- a/gnu/packages/elixir.scm
+++ b/gnu/packages/elixir.scm
@@ -7,6 +7,8 @@ 
 ;;; Copyright © 2018 Nikita <nikita@n0.is>
 ;;; Copyright © 2021 Oskar Köök <oskar@maatriks.ee>
 ;;; Copyright © 2021 Cees de Groot <cg@evrl.com>
+;;; Copyright © 2024 Andrew Tropin <andrew@trop.in>
+;;; Copyright © 2024 Ivan Sokolov <ivan-p-sokolov@ya.ru>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -101,7 +103,18 @@  (define-public elixir
           (add-after 'install 'wrap-programs
             (lambda* (#:key inputs outputs #:allow-other-keys)
               (let* ((out (assoc-ref outputs "out"))
-                     (programs '("elixir" "elixirc" "iex" "mix")))
+                     (programs '("elixir" "elixirc" "iex")))
+                ;; mix can be sourced as an elixir script by other elixir
+                ;; program, for example `iex -S mix`, so we should not wrap
+                ;; mix into shell script.
+                (substitute* (string-append out "/bin/mix")
+                  (("Mix.start\\(\\)") "\
+~w[GUIX_ELIXIR_LIBS ERL_LIBS]
+|> Enum.map(&System.get_env/1)
+|> Enum.reject(&is_nil/1)
+|> Enum.join(\":\")
+|> case do \"\" -> :ok; erl_libs -> System.put_env(\"ERL_LIBS\", erl_libs) end
+Mix.start()"))
                 (for-each (lambda (program)
                             (wrap-program (string-append out "/bin/" program)
                               '("ERL_LIBS" prefix ("${GUIX_ELIXIR_LIBS}"))))