Subject: [bug#73458] [PATCH 1/2] build-system: mix: Allow loading Erlang dependencies in Mix driven builds.

From: Giacomo Leidi <[email-masked]>
Date: Wed, 25 Sep 2024 10:24:32 +0200

Fixes <https://issues.guix.gnu.org/73453>

* guix/build/mix-build-system.scm (elixir-relative-libdir): New
variable;
(elixir-libdir): call elixir-relative-libdir;
(set-erl-env): this new phase sets ERL_LIBS to allow Erlang's virtual
machine to load Erlang dependencies in Mix builds, in addition to Elixir
ones;
(%standard-phases): add set-erl-env phases.

Change-Id: Ic1ef5db20680bfd265fbac72bafb760d21135f68
---
 guix/build/mix-build-system.scm | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/guix/build/mix-build-system.scm b/guix/build/mix-build-system.scm
index 0b021da791..41f6061444 100644
--- a/guix/build/mix-build-system.scm
+++ b/guix/build/mix-build-system.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2023 Pierre-Henry Fröhring <[email-masked]>
 ;;; Copyright © 2024 Igor Goryachev <[email-masked]>
+;;; Copyright © 2024 Giacomo Leidi <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -39,10 +40,15 @@ (define-module (guix build mix-build-system)
 ;; minor version number of the Elixir used in the build.
 (define %elixir-version (make-parameter "X.Y"))
 
+(define (elixir-relative-libdir version)
+  "Return the relative path inside a package namespace in the store where all
+libraries for a specified Elixir VERSION are installed."
+  (string-append "lib/elixir/" version))
+
 (define* (elixir-libdir path #:optional (version (%elixir-version)))
   "Return the path where all libraries under PATH for a specified Elixir
 VERSION are installed."
-  (string-append path "/lib/elixir/" version))
+  (string-append path "/" (elixir-relative-libdir version)))
 
 (define* (strip-prefix name #:optional (prefix "elixir-"))
   "Return NAME without the prefix PREFIX."
@@ -94,6 +100,17 @@ (define* (set-mix-env #:key inputs mix-path mix-exs #:allow-other-keys)
   (setenv "MIX_PATH" (or mix-path ""))
   (setenv "MIX_REBAR3" (string-append (assoc-ref inputs "rebar3") "/bin/rebar3")))
 
+(define* (set-erl-env #:key inputs #:allow-other-keys)
+  "Add dependencies in Elixir's load path."
+  (setenv "ERL_LIBS"
+          (string-join (search-path-as-list
+                        `("lib/erlang/lib"
+                          ,(elixir-relative-libdir (elixir-version inputs)))
+                        (map (match-lambda
+                               ((label . package) package))
+                             inputs))
+                       ":")))
+
 (define* (set-elixir-version #:key inputs #:allow-other-keys)
   "Store the version number of the Elixir input in a parameter."
   (%elixir-version (elixir-version inputs))
@@ -152,6 +169,7 @@ (define %standard-phases
     (delete 'configure)
     (add-after 'install-locale 'set-mix-env set-mix-env)
     (add-after 'set-mix-env 'set-elixir-version set-elixir-version)
+    (add-after 'set-elixir-version 'set-erl-env set-erl-env)
     (replace 'unpack unpack)
     (replace 'build build)
     (replace 'check check)

base-commit: 3ac69c1a757430d6dfdd37eb948ba1d6967967cc
-- 
2.46.0