From 2cc5ec7f0d64e9e94f6ae637e1f9573d4b948f0a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@gnu.org>
Date: Fri, 26 Jul 2019 23:22:28 +0200
Subject: [PATCH] gexp: 'compiled-modules' can cross-compile.

* guix/gexp.scm (compiled-modules): Add #:target and honor it.
---
 guix/gexp.scm | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/guix/gexp.scm b/guix/gexp.scm
index eef308b0006..a83d7168d21 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -1345,6 +1345,7 @@ (define* (imported-modules modules
 (define* (compiled-modules modules
                            #:key (name "module-import-compiled")
                            (system (%current-system))
+                           target
                            (guile (%guile-for-build))
                            (module-path %load-path)
                            (extensions '())
@@ -1355,7 +1356,8 @@ (define* (compiled-modules modules
                            (pre-load-modules? #t))
   "Return a derivation that builds a tree containing the `.go' files
 corresponding to MODULES.  All the MODULES are built in a context where
-they can refer to each other."
+they can refer to each other.  When TARGET is true, cross-compile MODULES for
+TARGET, a GNU triplet."
   (define total (length modules))
 
   (mlet %store-monad ((modules (imported-modules modules
@@ -1374,6 +1376,12 @@ (define build
                       (srfi srfi-26)
                       (system base compile))
 
+         ;; TODO: Inline this on the next rebuild cycle.
+         (ungexp-splicing
+          (if target
+              (gexp ((use-modules (system base target))))
+              (gexp ())))
+
          (define (regular? file)
            (not (member file '("." ".."))))
 
@@ -1391,9 +1399,19 @@ (define (process-entry entry output processed)
                                                    (gexp ()))))
                          (ungexp (* total (if pre-load-modules? 2 1)))
                          entry)
-                 (compile-file entry
-                               #:output-file output
-                               #:opts %auto-compilation-options)
+
+                 (ungexp-splicing
+                  (if target
+                      (gexp ((with-target (ungexp target)
+                               (lambda ()
+                                 (compile-file entry
+                                               #:output-file output
+                                               #:opts
+                                               %auto-compilation-options)))))
+                      (gexp ((compile-file entry
+                                           #:output-file output
+                                           #:opts %auto-compilation-options)))))
+
                  (+ 1 processed))))
 
          (define (process-directory directory output processed)
-- 
GitLab