X-Git-Url: https://git.hcoop.net/jackhill/guix/guix.git/blobdiff_plain/cc294bcee6bfaa4524ac43450e41f083539f9cb1..0cb9bacbfaa3eac0d97fd56924da276b48363528:/gnu/packages/make-bootstrap.scm diff --git a/gnu/packages/make-bootstrap.scm b/gnu/packages/make-bootstrap.scm index 492ccb8114..c6002eb63a 100644 --- a/gnu/packages/make-bootstrap.scm +++ b/gnu/packages/make-bootstrap.scm @@ -1,6 +1,8 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès +;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès ;;; Copyright © 2017 Efraim Flashner +;;; Copyright © 2018 Tobias Geerinckx-Rice +;;; Copyright © 2018 Mark H Weaver ;;; ;;; This file is part of GNU Guix. ;;; @@ -20,7 +22,7 @@ (define-module (gnu packages make-bootstrap) #:use-module (guix utils) #:use-module (guix packages) - #:use-module (guix licenses) + #:use-module ((guix licenses) #:select (gpl3+)) #:use-module (guix build-system trivial) #:use-module (guix build-system gnu) #:use-module ((gnu packages) #:select (search-patch)) @@ -32,6 +34,7 @@ #:use-module (gnu packages gcc) #:use-module (gnu packages guile) #:use-module (gnu packages bdw-gc) + #:use-module (gnu packages libunistring) #:use-module (gnu packages linux) #:use-module (gnu packages hurd) #:use-module (gnu packages multiprecision) @@ -104,10 +107,12 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." ("cross-binutils" ,(cross-binutils target)) ,@(%final-inputs))) `(("libc" ,(glibc-for-bootstrap)) + ("libc:static" ,(glibc-for-bootstrap) "static") ("gcc" ,(package (inherit gcc) (outputs '("out")) ; all in one so libgcc_s is easily found (inputs - `(("libc",(glibc-for-bootstrap)) + `(("libc" ,(glibc-for-bootstrap)) + ("libc:static" ,(glibc-for-bootstrap) "static") ,@(package-inputs gcc))))) ,@(fold alist-delete (%final-inputs) '("libc" "gcc"))))) @@ -141,24 +146,24 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (arguments (substitute-keyword-arguments (package-arguments bzip2) ((#:phases phases) - `(alist-cons-before - 'build 'dash-static - (lambda _ - (substitute* "Makefile" - (("^LDFLAGS[[:blank:]]*=.*$") - "LDFLAGS = -static"))) - ,phases)))))) + `(modify-phases ,phases + (add-before 'build 'dash-static + (lambda _ + (substitute* "Makefile" + (("^LDFLAGS[[:blank:]]*=.*$") + "LDFLAGS = -static")) + #t)))))))) (xz (package (inherit xz) (arguments `(#:strip-flags '("--strip-all") - #:phases (alist-cons-before - 'configure 'static-executable - (lambda _ - ;; Ask Libtool for a static executable. - (substitute* "src/xz/Makefile.in" - (("^xz_LDADD =") - "xz_LDADD = -all-static"))) - %standard-phases))))) + #:phases (modify-phases %standard-phases + (add-before 'configure 'static-executable + (lambda _ + ;; Ask Libtool for a static executable. + (substitute* "src/xz/Makefile.in" + (("^xz_LDADD =") + "xz_LDADD = -all-static")) + #t))))))) (gawk (package (inherit gawk) (source (origin (inherit (package-source gawk)) (patches (cons (search-patch "gawk-shell.patch") @@ -173,28 +178,42 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." ,@(substitute-keyword-arguments (package-arguments gawk) ((#:phases phases) - `(alist-cons-before - 'configure 'no-export-dynamic - (lambda _ - ;; Since we use `-static', remove - ;; `-export-dynamic'. - (substitute* "configure" - (("-Wl,-export-dynamic") ""))) - ,phases))))) + `(modify-phases ,phases + (add-before 'configure 'no-export-dynamic + (lambda _ + ;; Since we use `-static', remove + ;; `-export-dynamic'. + (substitute* "configure" + (("-Wl,-export-dynamic") "")) + #t))))))) (inputs (if (%current-target-system) `(("bash" ,static-bash)) '())))) (tar (package (inherit tar) (arguments - '(#:phases (modify-phases %standard-phases - (add-before 'build 'set-shell-file-name - (lambda _ - ;; Do not use "/bin/sh" to run programs; see - ;; . - (substitute* "src/system.c" - (("/bin/sh") "sh") - (("execv ") "execvp ")) - #t))))))) + (substitute-keyword-arguments (package-arguments tar) + ((#:phases phases) + `(modify-phases ,phases + (replace 'set-shell-file-name + (lambda _ + ;; Do not use "/bin/sh" to run programs; see + ;; . + (substitute* "src/system.c" + (("/bin/sh") "sh") + (("execv ") "execvp ")) + #t)))))))) + ;; We don't want to retain a reference to /gnu/store in the bootstrap + ;; versions of egrep/fgrep, so we remove the custom phase added since + ;; grep@2.25. The effect is 'egrep' and 'fgrep' look for 'grep' in + ;; $PATH. + (grep (package + (inherit grep) + (inputs '()) ;remove PCRE, which is optional + (arguments + (substitute-keyword-arguments (package-arguments grep) + ((#:phases phases) + `(modify-phases ,phases + (delete 'fix-egrep-and-fgrep))))))) (finalize (compose static-package package-with-relocatable-glibc))) `(,@(map (match-lambda @@ -207,17 +226,7 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." ("patch" ,patch) ("coreutils" ,coreutils) ("sed" ,sed) - ;; We don't want to retain a reference to /gnu/store in the - ;; bootstrap versions of egrep/fgrep, so we remove the custom - ;; phase added since grep@2.25. The effect is 'egrep' and - ;; 'fgrep' look for 'grep' in $PATH. - ("grep" ,(package - (inherit grep) - (arguments - (substitute-keyword-arguments (package-arguments grep) - ((#:phases phases) - `(modify-phases ,phases - (delete 'fix-egrep-and-fgrep))))))) + ("grep" ,grep) ("gawk" ,gawk))) ("bash" ,static-bash)))) @@ -302,19 +311,19 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." ((#:configure-flags flags _ ...) flags))) #:strip-flags '("--strip-all") - #:phases (alist-cons-before - 'configure 'all-static - (lambda _ - ;; The `-all-static' libtool flag can only be passed - ;; after `configure', since configure tests don't use - ;; libtool, and only for executables built with libtool. - (substitute* '("binutils/Makefile.in" - "gas/Makefile.in" - "ld/Makefile.in") - (("^LDFLAGS =(.*)$" line) - (string-append line - "\nAM_LDFLAGS = -static -all-static\n")))) - %standard-phases))))) + #:phases (modify-phases %standard-phases + (add-before 'configure 'all-static + (lambda _ + ;; The `-all-static' libtool flag can only be passed + ;; after `configure', since configure tests don't use + ;; libtool, and only for executables built with libtool. + (substitute* '("binutils/Makefile.in" + "gas/Makefile.in" + "ld/Makefile.in") + (("^LDFLAGS =(.*)$" line) + (string-append line + "\nAM_LDFLAGS = -static -all-static\n"))) + #t))))))) (define %binutils-static-stripped ;; The subset of Binutils that we need. @@ -373,6 +382,8 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (parameterize ((%current-target-system #f)) (cross-libc target))) glibc))))) + (native-inputs '()) + (propagated-inputs '()) ;; Only one output. (outputs '("out"))))) @@ -420,18 +431,21 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (remove (cut string-match "--(.*plugin|enable-languages)" <>) ,flags))) ((#:phases phases) - `(alist-cons-after - 'pre-configure 'remove-lgcc_s - (lambda _ - ;; Remove the '-lgcc_s' added to GNU_USER_TARGET_LIB_SPEC in - ;; the 'pre-configure phase of our main gcc package, because - ;; that shared library is not present in this static gcc. See - ;; . - (substitute* (cons "gcc/config/rs6000/sysv4.h" - (find-files "gcc/config" - "^gnu-user.*\\.h$")) - ((" -lgcc_s}}") "}}"))) - ,phases))))) + `(modify-phases ,phases + (add-after 'pre-configure 'remove-lgcc_s + (lambda _ + ;; Remove the '-lgcc_s' added to GNU_USER_TARGET_LIB_SPEC in + ;; the 'pre-configure phase of our main gcc package, because + ;; that shared library is not present in this static gcc. See + ;; . + (substitute* (cons "gcc/config/rs6000/sysv4.h" + (find-files "gcc/config" + "^gnu-user.*\\.h$")) + ((" -lgcc_s}}") "}}")) + #t))))))) + (inputs + `(("zlib:static" ,zlib "static") + ,@(package-inputs gcc))) (native-inputs (if (%current-target-system) `(;; When doing a Canadian cross, we need GMP/MPFR/MPC both @@ -489,12 +503,14 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (string-append includedir "/c++")) ;; For native builds, check whether the binaries actually work. - ,(if (%current-target-system) - '#t - '(every (lambda (prog) - (zero? (system* (string-append gcc "/bin/" prog) - "--version"))) - '("gcc" "g++" "cpp"))))))) + ,@(if (%current-target-system) + '() + '((for-each (lambda (prog) + (invoke (string-append gcc "/bin/" prog) + "--version")) + '("gcc" "g++" "cpp")))) + + #t)))) (inputs `(("gcc" ,%gcc-static))))) (define %guile-static @@ -515,35 +531,47 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." ;; Remove the 'debug' output (see above for the reason.) (outputs (delete "debug" (package-outputs guile-2.2))) + (inputs + `(("libunistring:static" ,libunistring "static") + ,@(package-inputs guile-2.2))) + (propagated-inputs `(("bdw-gc" ,libgc) ,@(alist-delete "bdw-gc" (package-propagated-inputs guile-2.2)))) (arguments - `(;; When `configure' checks for ltdl availability, it - ;; doesn't try to link using libtool, and thus fails - ;; because of a missing -ldl. Work around that. - #:configure-flags '("LDFLAGS=-ldl") - - #:phases (alist-cons-before - 'configure 'static-guile - (lambda _ - (substitute* "libguile/Makefile.in" - ;; Create a statically-linked `guile' - ;; executable. - (("^guile_LDFLAGS =") - "guile_LDFLAGS = -all-static") - - ;; Add `-ldl' *after* libguile-2.2.la. - (("^guile_LDADD =(.*)$" _ ldadd) - (string-append "guile_LDADD = " - (string-trim-right ldadd) - " -ldl\n")))) - %standard-phases) - - ;; There are uses of `dynamic-link' in - ;; {foreign,coverage}.test that don't fly here. - #:tests? #f))))) + (substitute-keyword-arguments (package-arguments guile-2.2) + ((#:configure-flags flags '()) + ;; When `configure' checks for ltdl availability, it + ;; doesn't try to link using libtool, and thus fails + ;; because of a missing -ldl. Work around that. + ''("LDFLAGS=-ldl")) + ((#:phases phases '%standard-phases) + `(modify-phases ,phases + + ;; Do not record the absolute file name of 'sh' in + ;; (ice-9 popen). This makes 'open-pipe' unusable in + ;; a build chroot ('open-pipe*' is fine) but avoids + ;; keeping a reference to Bash. + (delete 'pre-configure) + + (add-before 'configure 'static-guile + (lambda _ + (substitute* "libguile/Makefile.in" + ;; Create a statically-linked `guile' + ;; executable. + (("^guile_LDFLAGS =") + "guile_LDFLAGS = -all-static") + + ;; Add `-ldl' *after* libguile-2.2.la. + (("^guile_LDADD =(.*)$" _ ldadd) + (string-append "guile_LDADD = " + (string-trim-right ldadd) + " -ldl\n"))))))) + ((#:tests? _ #f) + ;; There are uses of `dynamic-link' in + ;; {foreign,coverage}.test that don't fly here. + #f)))))) (package-with-relocatable-glibc (static-package guile)))) (define %guile-static-stripped @@ -552,7 +580,9 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (name "guile-static-stripped") (build-system trivial-build-system) (arguments - `(#:modules ((guix build utils)) + ;; The end result should depend on nothing but itself. + `(#:allowed-references ("out") + #:modules ((guix build utils)) #:builder (let () (use-modules (guix build utils)) @@ -572,21 +602,22 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (mkdir (string-append out "/bin")) (copy-file guile1 guile2) - ;; Does the relocated Guile work? - (and ,(if (%current-target-system) - #t - '(zero? (system* guile2 "--version"))) - (begin - ;; Strip store references. - (remove-store-references guile2) - - ;; Does the stripped Guile work? If it aborts, it could be - ;; that it tries to open iconv descriptors and fails because - ;; libc's iconv data isn't available (see - ;; `guile-default-utf8.patch'.) - ,(if (%current-target-system) - #t - '(zero? (system* guile2 "--version"))))))))) + ;; Verify that the relocated Guile works. + ,@(if (%current-target-system) + '() + '((invoke guile2 "--version"))) + + ;; Strip store references. + (remove-store-references guile2) + + ;; Verify that the stripped Guile works. If it aborts, it could be + ;; that it tries to open iconv descriptors and fails because libc's + ;; iconv data isn't available (see `guile-default-utf8.patch'.) + ,@(if (%current-target-system) + '() + '((invoke guile2 "--version"))) + + #t)))) (inputs `(("guile" ,%guile-static))) (outputs '("out")) (synopsis "Minimal statically-linked and relocatable Guile"))) @@ -613,17 +644,17 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (mkdir out) (set-path-environment-variable "PATH" '("bin") (list tar xz)) (with-directory-excursion input - (zero? (system* "tar" "cJvf" - (string-append out "/" - ,name "-" ,version - "-" - ,(or (%current-target-system) - (%current-system)) - ".tar.xz") - "." - ;; avoid non-determinism in the archive - "--sort=name" "--mtime=@0" - "--owner=root:0" "--group=root:0")))))))))) + (invoke "tar" "cJvf" + (string-append out "/" + ,name "-" ,version + "-" + ,(or (%current-target-system) + (%current-system)) + ".tar.xz") + "." + ;; avoid non-determinism in the archive + "--sort=name" "--mtime=@0" + "--owner=root:0" "--group=root:0"))))))))) (define %bootstrap-binaries-tarball ;; A tarball with the statically-linked bootstrap binaries.