From a410a0105d9517ccc0982b396588835899f6fc3f Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Tue, 25 Jun 2013 23:39:14 +0200 Subject: gnu: make-bootstrap: Allow cross-compilation of the bootstrap tarballs. * gnu/packages/make-bootstrap.scm (package-with-relocatable-glibc): Turn `inputs' into a thunk. Add `native-inputs', and pass it to `package-with-explicit-inputs'. (%static-inputs): Add %BASH-STATIC as an input to gawk when cross building. (%glibc-stripped): When cross compiling, use (glibc-for-bootstrap (cross-libc)) as the basis. (%gcc-static): Base on GCC-4.7, not GCC-FINAL. (tarball-package): TAR and XZ are native inputs. Choose the tarball file name based on (%current-target-system) too. --- gnu/packages/make-bootstrap.scm | 193 +++++++++++++++++++++++----------------- 1 file changed, 112 insertions(+), 81 deletions(-) (limited to 'gnu/packages') diff --git a/gnu/packages/make-bootstrap.scm b/gnu/packages/make-bootstrap.scm index c8de969b1a..13f858adc6 100644 --- a/gnu/packages/make-bootstrap.scm +++ b/gnu/packages/make-bootstrap.scm @@ -24,6 +24,7 @@ #:use-module (guix build-system gnu) #:use-module ((gnu packages) #:select (search-patch)) #:use-module (gnu packages base) + #:use-module (gnu packages cross-base) #:use-module (gnu packages bash) #:use-module (gnu packages compression) #:use-module (gnu packages gawk) @@ -49,20 +50,20 @@ ;;; ;;; Code: -(define* (glibc-for-bootstrap #:optional (base glibc-final)) +(define* (glibc-for-bootstrap #:optional (base glibc)) "Return a libc deriving from BASE whose `system' and `popen' functions looks for `sh' in $PATH, and without nscd, and with static NSS modules." (package (inherit base) (arguments (substitute-keyword-arguments (package-arguments base) ((#:patches patches) - `(cons (assoc-ref %build-inputs "patch/system") ,patches)) + `(cons (assoc-ref %build-inputs "patch/system") ,patches)) ((#:configure-flags flags) - ;; Arrange so that getaddrinfo & co. do not contact the nscd, - ;; and can use statically-linked NSS modules. - `(cons* "--disable-nscd" "--disable-build-nscd" - "--enable-static-nss" - ,flags)))) + ;; Arrange so that getaddrinfo & co. do not contact the nscd, + ;; and can use statically-linked NSS modules. + `(cons* "--disable-nscd" "--disable-build-nscd" + "--enable-static-nss" + ,flags)))) (inputs `(("patch/system" ,(search-patch "glibc-bootstrap-system.patch")) ,@(package-inputs base))))) @@ -71,17 +72,39 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." "Return a variant of P that uses the libc as defined by `glibc-for-bootstrap'." - (define inputs - `(("libc", (glibc-for-bootstrap)) - ("gcc" ,(package-with-explicit-inputs - gcc-4.7 - `(("libc",(glibc-for-bootstrap)) - ,@(alist-delete "libc" %final-inputs)) - (current-source-location))) - ,@(fold alist-delete %final-inputs '("libc" "gcc")))) + (define (cross-bootstrap-libc) + (let ((target (%current-target-system))) + (glibc-for-bootstrap + ;; `cross-libc' already returns a cross libc, so clear + ;; %CURRENT-TARGET-SYSTEM. + (parameterize ((%current-target-system #f)) + (cross-libc target))))) + + ;; Standard inputs with the above libc and corresponding GCC. + + (define (inputs) + (if (%current-target-system) ; is this package cross built? + `(("cross-libc" ,(cross-bootstrap-libc))) + '())) + + (define (native-inputs) + (if (%current-target-system) + (let ((target (%current-target-system))) + `(("cross-gcc" ,(cross-gcc target + (cross-binutils target) + (cross-bootstrap-libc))) + ("cross-binutils" ,(cross-binutils target)) + ,@%final-inputs)) + `(("libc" ,(glibc-for-bootstrap)) + ("gcc" ,(package (inherit gcc-4.7) + (inputs + `(("libc",(glibc-for-bootstrap)) + ,@(package-inputs gcc-4.7))))) + ,@(fold alist-delete %final-inputs '("libc" "gcc"))))) (package-with-explicit-inputs p inputs - (current-source-location))) + (current-source-location) + #:native-inputs native-inputs)) (define %bash-static (static-package bash-light)) @@ -140,9 +163,12 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (substitute* "configure" (("-export-dynamic") ""))) ,phases))))) - (inputs `(("patch/sh" ,(search-patch "gawk-shell.patch")))))) - (finalize (compose static-package - package-with-relocatable-glibc))) + (inputs `(("patch/sh" ,(search-patch "gawk-shell.patch")) + ,@(if (%current-target-system) + `(("bash" ,%bash-static)) + '()))))) + (finalize (compose static-package + package-with-relocatable-glibc))) `(,@(map (match-lambda ((name package) (list name (finalize package)))) @@ -155,12 +181,7 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." ("sed" ,sed) ("grep" ,grep) ("gawk" ,gawk))) - ("bash" ,%bash-static) - ;; ("ld-wrapper" ,ld-wrapper) - ;; ("binutils" ,binutils-final) - ;; ("gcc" ,gcc-final) - ;; ("libc" ,glibc-final) - ))) + ("bash" ,%bash-static)))) (define %static-binaries (package @@ -330,7 +351,12 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (copy-recursively (string-append linux "/include/asm-generic") (string-append incdir "/asm-generic")) #t)))) - (inputs `(("libc" ,glibc) + (inputs `(("libc" ,(let ((target (%current-target-system))) + (if target + (glibc-for-bootstrap + (parameterize ((%current-target-system #f)) + (cross-libc target))) + glibc))) ("linux-headers" ,linux-libre-headers))) ;; Only one output. @@ -339,7 +365,7 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (define %gcc-static ;; A statically-linked GCC, with stripped-down functionality. (package-with-relocatable-glibc - (package (inherit gcc-final) + (package (inherit gcc-4.7) (name "gcc-static") (arguments `(#:modules ((guix build utils) @@ -347,7 +373,7 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (srfi srfi-1) (srfi srfi-26) (ice-9 regex)) - ,@(substitute-keyword-arguments (package-arguments gcc-final) + ,@(substitute-keyword-arguments (package-arguments gcc-4.7) ((#:guile _) #f) ((#:implicit-inputs? _) #t) ((#:configure-flags flags) @@ -365,10 +391,10 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." ((#:make-flags flags) `(cons "BOOT_LDFLAGS=-static" ,flags))))) (inputs `(("gmp-source" ,(package-source gmp)) - ("mpfr-source" ,(package-source mpfr)) - ("mpc-source" ,(package-source mpc)) - ("binutils" ,binutils-final) - ,@(package-inputs gcc-4.7)))))) + ("mpfr-source" ,(package-source mpfr)) + ("mpc-source" ,(package-source mpc)) + ("binutils" ,binutils) + ,@(package-inputs gcc-4.7)))))) (define %gcc-stripped ;; The subset of GCC files needed for bootstrap. @@ -411,51 +437,54 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." ;; .scm and .go files relative to its installation directory, rather ;; than in hard-coded configure-time paths. (let* ((guile (package (inherit guile-2.0) - (name (string-append (package-name guile-2.0) "-static")) - (inputs - `(("patch/relocatable" - ,(search-patch "guile-relocatable.patch")) - ("patch/utf8" - ,(search-patch "guile-default-utf8.patch")) - ("patch/syscalls" - ,(search-patch "guile-linux-syscalls.patch")) - ,@(package-inputs guile-2.0))) - (propagated-inputs - `(("bdw-gc" ,libgc) - ,@(alist-delete "bdw-gc" - (package-propagated-inputs guile-2.0)))) - (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.0.la. - (("^guile_LDADD =(.*)$" _ ldadd) - (string-append "guile_LDADD = " - (string-trim-right ldadd) - " -ldl\n")))) - %standard-phases) - - ;; Allow Guile to be relocated, as is needed during - ;; bootstrap. - #:patches - (list (assoc-ref %build-inputs "patch/relocatable") - (assoc-ref %build-inputs "patch/utf8") - (assoc-ref %build-inputs "patch/syscalls")) - - ;; There are uses of `dynamic-link' in - ;; {foreign,coverage}.test that don't fly here. - #:tests? #f))))) + (name (string-append (package-name guile-2.0) "-static")) + (inputs + `(("patch/relocatable" + ,(search-patch "guile-relocatable.patch")) + ("patch/utf8" + ,(search-patch "guile-default-utf8.patch")) + ("patch/syscalls" + ,(search-patch "guile-linux-syscalls.patch")) + ,@(package-inputs guile-2.0))) + (propagated-inputs + `(("bdw-gc" ,libgc) + ,@(alist-delete "bdw-gc" + (package-propagated-inputs guile-2.0)))) + (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" + ,@(if (%current-target-system) + '("CC_FOR_BUILD=gcc") + '())) + + #: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.0.la. + (("^guile_LDADD =(.*)$" _ ldadd) + (string-append "guile_LDADD = " + (string-trim-right ldadd) + " -ldl\n")))) + %standard-phases) + + ;; Allow Guile to be relocated, as is needed during + ;; bootstrap. + #:patches + (list (assoc-ref %build-inputs "patch/relocatable") + (assoc-ref %build-inputs "patch/utf8") + (assoc-ref %build-inputs "patch/syscalls")) + + ;; There are uses of `dynamic-link' in + ;; {foreign,coverage}.test that don't fly here. + #:tests? #f))))) (package-with-relocatable-glibc (static-package guile)))) (define %guile-static-stripped @@ -492,9 +521,9 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (location (source-properties->location (current-source-location))) (name (string-append (package-name pkg) "-tarball")) (build-system trivial-build-system) - (inputs `(("tar" ,tar) - ("xz" ,xz) - ("input" ,pkg))) + (native-inputs `(("tar" ,tar) + ("xz" ,xz))) + (inputs `(("input" ,pkg))) (arguments (let ((name (package-name pkg)) (version (package-version pkg))) @@ -512,7 +541,9 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (zero? (system* "tar" "cJvf" (string-append out "/" ,name "-" ,version - "-" ,(%current-system) + "-" + ,(or (%current-target-system) + (%current-system)) ".tar.xz") ".")))))))))) -- cgit v1.2.3