[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

14/14: gexp: 'compiled-modules' no longer overrides (guix build utils).

From: Ludovic Courtès
Subject: 14/14: gexp: 'compiled-modules' no longer overrides (guix build utils).
Date: Fri, 1 Jun 2018 07:52:20 -0400 (EDT)

civodul pushed a commit to branch master
in repository guix.

commit 5d669883ecc104403c5d3ba7d172e9c02234577c
Author: Ludovic Courtès <address@hidden>
Date:   Fri Jun 1 13:45:36 2018 +0200

    gexp: 'compiled-modules' no longer overrides (guix build utils).
    Until now 'compiled-modules' would override (guix build utils) with its
    own.  Thus, when asked to build a different (guix build utils),
    via #:module-path, it would fail badly because a (guix build utils)
    module was already loaded and possibly incompatible with the new one.
    This happened when running 'guix pull --branch=core-updates' from
    current master: in 'core-updates', (guix build utils) exports
    'ignore-error?' but in 'master' it does not.  Thus, 'guix pull' would
    fail with:
      no binding `invoke-error?' in module (guix build utils)
      builder for `/gnu/store/…-module-import-compiled.drv' failed with exit 
code 1
      cannot build derivation `/gnu/store/…-compute-guix-derivation.drv': 1 
dependencies couldn't be built
    This patch fixes it.
    * guix/gexp.scm (compiled-modules)[build-utils-hack?]: New variable.
    [build]: Load MODULES/build/utils.scm when it exists.
 guix/gexp.scm | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/guix/gexp.scm b/guix/gexp.scm
index dd5eb81..fdfd734 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -1075,6 +1075,14 @@ last one is created from the given <scheme-file> object."
   "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."
+  (define build-utils-hack?
+    ;; To avoid a full rebuild, we limit the fix below to the case where
+    ;; MODULE-PATH is different from %LOAD-PATH.  This happens when building
+    ;; modules for 'compute-guix-derivation' upon 'guix pull'.  TODO: Make
+    ;; this unconditional on the next rebuild cycle.
+    (and (member '(guix build utils) modules)
+         (not (equal? module-path %load-path))))
   (mlet %store-monad ((modules (imported-modules modules
                                                  #:system system
                                                  #:guile guile
@@ -1114,7 +1122,27 @@ they can refer to each other."
+         (ungexp-splicing
+          (if build-utils-hack?
+              (gexp ((define mkdir-p
+                       ;; Capture 'mkdir-p'.
+                       (@ (guix build utils) mkdir-p))))
+              '()))
          (set! %load-path (cons (ungexp modules) %load-path))
+         (ungexp-splicing
+          (if build-utils-hack?
+              ;; Above we loaded our own (guix build utils) but now we may
+              ;; need to load a compile a different one.  Thus, force a
+              ;; reload.
+              (gexp ((let ((utils (ungexp
+                                   (file-append modules
+                                                "/guix/build/utils.scm"))))
+                       (when (file-exists? utils)
+                         (load utils)))))
+              '()))
          (mkdir (ungexp output))
          (chdir (ungexp modules))
          (process-directory "." (ungexp output)))))

reply via email to

[Prev in Thread] Current Thread [Next in Thread]