diff options
author | Ludovic Courtès <ludo@gnu.org> | 2016-10-31 15:41:14 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2016-10-31 16:06:30 +0100 |
commit | 5bde4503eeaa1d772744abcf87afc29eb0e9329d (patch) | |
tree | 299b414bb4d560fbc90d8fee5f5c52d565b144ae /gnu/packages/base.scm | |
parent | 77e9c9931e7b849d82def2b1cc657dc89f85d05b (diff) | |
download | guix-5bde4503eeaa1d772744abcf87afc29eb0e9329d.tar guix-5bde4503eeaa1d772744abcf87afc29eb0e9329d.tar.gz |
gnu: ld-wrapper-boot0: Work around strict evaluation of (%current-system).
Reported by Mark H Weaver <mhw@netris.org>
Partly fixes <http://bugs.gnu.org/24832>.
'ld-wrapper-boot0' was evaluating strictly instead of lazily, leading to
invalid system types.
* gnu/packages/base.scm (make-ld-wrapper): Turn #:target into a
one-argument procedure. Honor it.
* gnu/packages/commencement.scm (ld-wrapper-boot0): Fix 'name' argument
to 'make-ld-wrapper'. Make #:target argument a procedure.
* gnu/packages/cross-base.scm (cross-gcc): Adjust #:target argument.
Diffstat (limited to 'gnu/packages/base.scm')
-rw-r--r-- | gnu/packages/base.scm | 93 |
1 files changed, 51 insertions, 42 deletions
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index 5aea2cee0e..76052ef902 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -422,14 +422,22 @@ included.") (license gpl3+) (home-page "http://www.gnu.org/software/binutils/"))) -(define* (make-ld-wrapper name #:key binutils +(define* (make-ld-wrapper name #:key + (target (const #f)) + binutils (guile (canonical-package guile-2.0)) - (bash (canonical-package bash)) target + (bash (canonical-package bash)) (guile-for-build guile)) "Return a package called NAME that contains a wrapper for the 'ld' program -of BINUTILS, which adds '-rpath' flags to the actual 'ld' command line. When -TARGET is not #f, make a wrapper for the cross-linker for TARGET, called -'TARGET-ld'. The wrapper uses GUILE and BASH." +of BINUTILS, which adds '-rpath' flags to the actual 'ld' command line. The +wrapper uses GUILE and BASH. + +TARGET must be a one-argument procedure that, given a system type, returns a +cross-compilation target triplet or #f. When the result is not #f, make a +wrapper for the cross-linker for that target, called 'TARGET-ld'." + ;; Note: #:system->target-triplet is a procedure so that the evaluation of + ;; its result can be delayed until the 'arguments' field is evaluated, thus + ;; in a context where '%current-system' is accurate. (package (name name) (version "0") @@ -441,43 +449,44 @@ TARGET is not #f, make a wrapper for the cross-linker for TARGET, called ("wrapper" ,(search-path %load-path "gnu/packages/ld-wrapper.in")))) (arguments - `(#:guile ,guile-for-build - #:modules ((guix build utils)) - #:builder (begin - (use-modules (guix build utils) - (system base compile)) - - (let* ((out (assoc-ref %outputs "out")) - (bin (string-append out "/bin")) - (ld ,(if target - `(string-append bin "/" ,target "-ld") - '(string-append bin "/ld"))) - (go (string-append ld ".go"))) - - (setvbuf (current-output-port) _IOLBF) - (format #t "building ~s/bin/ld wrapper in ~s~%" - (assoc-ref %build-inputs "binutils") - out) - - (mkdir-p bin) - (copy-file (assoc-ref %build-inputs "wrapper") ld) - (substitute* ld - (("@SELF@") - ld) - (("@GUILE@") - (string-append (assoc-ref %build-inputs "guile") - "/bin/guile")) - (("@BASH@") - (string-append (assoc-ref %build-inputs "bash") - "/bin/bash")) - (("@LD@") - (string-append (assoc-ref %build-inputs "binutils") - ,(if target - (string-append "/bin/" - target "-ld") - "/bin/ld")))) - (chmod ld #o555) - (compile-file ld #:output-file go))))) + (let ((target (target (%current-system)))) + `(#:guile ,guile-for-build + #:modules ((guix build utils)) + #:builder (begin + (use-modules (guix build utils) + (system base compile)) + + (let* ((out (assoc-ref %outputs "out")) + (bin (string-append out "/bin")) + (ld ,(if target + `(string-append bin "/" ,target "-ld") + '(string-append bin "/ld"))) + (go (string-append ld ".go"))) + + (setvbuf (current-output-port) _IOLBF) + (format #t "building ~s/bin/ld wrapper in ~s~%" + (assoc-ref %build-inputs "binutils") + out) + + (mkdir-p bin) + (copy-file (assoc-ref %build-inputs "wrapper") ld) + (substitute* ld + (("@SELF@") + ld) + (("@GUILE@") + (string-append (assoc-ref %build-inputs "guile") + "/bin/guile")) + (("@BASH@") + (string-append (assoc-ref %build-inputs "bash") + "/bin/bash")) + (("@LD@") + (string-append (assoc-ref %build-inputs "binutils") + ,(if target + (string-append "/bin/" + target "-ld") + "/bin/ld")))) + (chmod ld #o555) + (compile-file ld #:output-file go)))))) (synopsis "The linker wrapper") (description "The linker wrapper (or 'ld-wrapper') wraps the linker to add any |