summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2019-04-04 17:18:06 +0200
committerLudovic Courtès <ludo@gnu.org>2019-04-04 17:47:02 +0200
commita31174e896047e6a0f42b69db331fdeebb3cc995 (patch)
tree63091a0cf4937f4b43df10eb219a9751a3de0781
parentaff0cce9175aaf836dd78941eb17549e3bfa7188 (diff)
downloadguix-a31174e896047e6a0f42b69db331fdeebb3cc995.tar.gz
gexp: 'compiled-modules' loads modules before compiling them.
This works around <https://bugs.gnu.org/15602> in the context of
modules specified with 'with-imported-modules'.

* guix/gexp.scm (gexp->derivation): Add #:pre-load-modules? parameter
and pass it to 'compiled-modules'.
(compiled-modules): Add #:pre-load-modules? parameter and honor it.
* guix/packages.scm (patch-and-repack): Pass #:pre-load-modules? to
'gexp->derivation'.
-rw-r--r--guix/gexp.scm47
-rw-r--r--guix/packages.scm3
2 files changed, 48 insertions, 2 deletions
diff --git a/guix/gexp.scm b/guix/gexp.scm
index 5b5b064b59..4f2adba90a 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -634,6 +634,11 @@ names and file names suitable for the #:allowed-references argument to
                            local-build? (substitutable? #t)
                            (properties '())
 
+                           ;; TODO: This parameter is transitional; it's here
+                           ;; to avoid a full rebuild.  Remove it on the next
+                           ;; rebuild cycle.
+                           (pre-load-modules? #t)
+
                            deprecation-warnings
                            (script-name (string-append name "-builder")))
   "Return a derivation NAME that runs EXP (a gexp) with GUILE-FOR-BUILD (a
@@ -738,6 +743,8 @@ The other arguments are as for 'derivation'."
                                                        #:module-path module-path
                                                        #:extensions extensions
                                                        #:guile guile-for-build
+                                                       #:pre-load-modules?
+                                                       pre-load-modules?
                                                        #:deprecation-warnings
                                                        deprecation-warnings)
                                      (return #f)))
@@ -1213,7 +1220,11 @@ last one is created from the given <scheme-file> object."
                            (guile (%guile-for-build))
                            (module-path %load-path)
                            (extensions '())
-                           (deprecation-warnings #f))
+                           (deprecation-warnings #f)
+
+                           ;; TODO: This flag is here to prevent a full
+                           ;; rebuild.  Remove it on the next rebuild cycle.
+                           (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."
@@ -1246,7 +1257,12 @@ they can refer to each other."
                (let* ((base   (basename entry ".scm"))
                       (output (string-append output "/" base ".go")))
                  (format #t "[~2@a/~2@a] Compiling '~a'...~%"
-                         (+ 1 processed) (ungexp total) entry)
+                         (+ 1 processed
+                              (ungexp-splicing (if pre-load-modules?
+                                                   (gexp ((ungexp total)))
+                                                   (gexp ()))))
+                         (ungexp (* total (if pre-load-modules? 2 1)))
+                         entry)
                  (compile-file entry
                                #:output-file output
                                #:opts %auto-compilation-options)
@@ -1293,6 +1309,33 @@ they can refer to each other."
 
          (mkdir (ungexp output))
          (chdir (ungexp modules))
+
+         (ungexp-splicing
+          (if pre-load-modules?
+              (gexp ((define* (load-from-directory directory
+                                                   #:optional (loaded 0))
+                       "Load all the source files found in DIRECTORY."
+                       ;; XXX: This works around <https://bugs.gnu.org/15602>.
+                       (let ((entries (map (cut string-append directory "/" <>)
+                                           (scandir directory regular?))))
+                         (fold (lambda (file loaded)
+                                 (if (file-is-directory? file)
+                                     (load-from-directory file loaded)
+                                     (begin
+                                       (format #t "[~2@a/~2@a] Loading '~a'...~%"
+                                               (+ 1 loaded)
+                                               (ungexp (* 2 total))
+                                               file)
+                                       (save-module-excursion
+                                        (lambda ()
+                                          (primitive-load file)))
+                                       (+ 1 loaded))))
+                               loaded
+                               entries)))
+
+                     (load-from-directory ".")))
+              (gexp ())))
+
          (process-directory "." (ungexp output) 0))))
 
     ;; TODO: Pass MODULES as an environment variable.
diff --git a/guix/packages.scm b/guix/packages.scm
index c2981dda8b..c94a651f27 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -642,6 +642,9 @@ specifies modules in scope when evaluating SNIPPET."
 
     (let ((name (tarxz-name original-file-name)))
       (gexp->derivation name build
+                        ;; TODO: Remove this on the next rebuild cycle.
+                        #:pre-load-modules? #f
+
                         #:graft? #f
                         #:system system
                         #:deprecation-warnings #t ;to avoid a rebuild