diff --git guix-1.5.0/gnu/packages/commencement.scm guix-1.5.0/gnu/packages/commencement.scm index 852fa2d..2dfb6a3 100644 --- guix-1.5.0/gnu/packages/commencement.scm +++ guix-1.5.0/gnu/packages/commencement.scm @@ -1225,21 +1225,43 @@ ac_cv_c_float_format='IEEE (little-endian)' ("libc" ,glibc-mesboot0) ,@(alist-delete "gcc" (%boot-mesboot-core-inputs)))) -(define binutils-mesboot1 +(define (mesboot0-package name inputs pkg) (package - (inherit binutils-mesboot0) - (name "binutils-mesboot1") - (native-inputs (%boot-mesboot0-inputs)) + (inherit pkg) + (name name) + (source (bootstrap-origin (package-source pkg))) + (native-inputs (inputs)) + (supported-systems '("i686-linux")) + (inputs '()) + (propagated-inputs '()) (arguments - (substitute-keyword-arguments (package-arguments binutils-mesboot0) - ((#:configure-flags configure-flags) - #~(let ((out (assoc-ref %outputs "out"))) - `("--disable-nls" "--disable-shared" - "--disable-werror" - "--build=i686-unknown-linux-gnu" - "--host=i686-unknown-linux-gnu" - "--with-sysroot=/" - ,(string-append "--prefix=" out)))))))) + (ensure-keyword-arguments (package-arguments pkg) + `(#:implicit-inputs? #f + #:guile ,%bootstrap-guile + #:tests? #f))))) + +;; Build native versions of critical utilities earlier, for performance reasons +;; It would be great to build xz here, but it requres a newer gcc... + +;; Bash provides built-in "test", avoiding guile startup overhead +(define bash-mesboot0 + (let ((pkg (mesboot0-package + "bash-mesboot0" + %boot-mesboot0-inputs + static-bash))) + (package + (inherit pkg) + (arguments (substitute-keyword-arguments (package-arguments pkg) + ((#:configure-flags flags) + #~(cons* "CFLAGS=-g -O2" "LIBS=-lc -lnss_files -lnss_dns -lresolv" + (delete + "CFLAGS=-g -O2 -Wno-error=implicit-function-declaration" + #$flags)))))))) + +(define (%boot-mesboot0-native0-inputs) + `(("bash" ,bash-mesboot0) + ,@(fold alist-delete (%boot-mesboot0-inputs) + '("bash")))) (define gnu-make-mesboot (package @@ -1253,7 +1275,7 @@ ac_cv_c_float_format='IEEE (little-endian)' (sha256 (base32 "1rs2f9hmvy3q6zkl15jnlmnpgffm0bhw5ax0h5c7q604wqrip69x")))) - (native-inputs (%boot-mesboot0-inputs)) + (native-inputs (%boot-mesboot0-native0-inputs)) (supported-systems '("i686-linux" "x86_64-linux")) (inputs '()) (propagated-inputs '()) @@ -1273,11 +1295,31 @@ ac_cv_c_float_format='IEEE (little-endian)' (bin (string-append out "/bin"))) (install-file "make" bin))))))))) +(define (%boot-mesboot0-native-inputs) + `(("make" ,gnu-make-mesboot) + ,@(fold alist-delete (%boot-mesboot0-native0-inputs) + '("make")))) + +(define binutils-mesboot1 + (package + (inherit binutils-mesboot0) + (name "binutils-mesboot1") + (native-inputs (%boot-mesboot0-native-inputs)) + (arguments + (substitute-keyword-arguments (package-arguments binutils-mesboot0) + ((#:configure-flags configure-flags) + #~(let ((out (assoc-ref %outputs "out"))) + `("--disable-nls" "--disable-shared" + "--disable-werror" + "--build=i686-unknown-linux-gnu" + "--host=i686-unknown-linux-gnu" + "--with-sysroot=/" + ,(string-append "--prefix=" out)))))))) + (define (%boot-mesboot1-inputs) `(("binutils" ,binutils-mesboot1) - ("make" ,gnu-make-mesboot) - ,@(fold alist-delete (%boot-mesboot0-inputs) - '("binutils" "make")))) + ,@(fold alist-delete (%boot-mesboot0-native-inputs) + '("binutils")))) (define gmp-boot (let ((version "4.3.2")) @@ -1467,7 +1509,7 @@ ac_cv_c_float_format='IEEE (little-endian)' ;; libstdc++ is being compiled. (setenv "CPLUS_INCLUDE_PATH" (getenv "C_INCLUDE_PATH")))))))))) -(define (%boot-mesboot2-inputs) +(define (%boot-mesboot2-bootar-inputs) `(("gcc" ,gcc-mesboot1) ,@(alist-delete "gcc" (%boot-mesboot1-inputs)))) @@ -1490,7 +1532,7 @@ ac_cv_c_float_format='IEEE (little-endian)' (supported-systems '("i686-linux" "x86_64-linux")) (inputs '()) (propagated-inputs '()) - (native-inputs (%boot-mesboot2-inputs)) + (native-inputs (%boot-mesboot2-bootar-inputs)) (arguments `(#:implicit-inputs? #f #:guile ,%bootstrap-guile @@ -1504,6 +1546,119 @@ ac_cv_c_float_format='IEEE (little-endian)' (lambda _ (invoke "./hello")))))))) +;; Now, that we have GCC 4.6, we can finally build xz. +(define xz-mesboot0 + (let ((pkg (mesboot0-package "xz-mesboot0" %boot-mesboot2-bootar-inputs xz))) + (package + (inherit pkg) + (arguments + (ensure-keyword-arguments (package-arguments pkg) + ;; XXX: This fails even though the + ;; actual runpaths seem fine. + `(#:validate-runpath? #f + ;; XXX: The build gets stuck + ;; when parallel build is enabled. + #:parallel-build? #f + #:configure-flags (list + ;; static build + "--enable-static" + "--disable-shared" + ;; missing pthread.h + "--enable-threads=no" + ;; extern inlines broken + "CFLAGS=-g -O2 -fgnu89-inline"))))))) + +;; Tar doesn't build at this stage, so teach gash-utils tar to use xz using a wrapper +(define gash-utils-tar-wrapper + ;; Wrapper around gash-utils tar that extracts xz files using xz-mesboot0 + ;; before passing them on to tar. + (package + (inherit gash-utils-boot) + (name "gash-utils-tar-wrapper") + (source #f) + (inputs '()) + (native-inputs `(("bash" ,bash-mesboot0) + ("coreutils" ,gash-utils-boot) + ("gzip" ,gzip-mesboot) + ("xz" ,xz-mesboot0))) + (arguments + `(#:implicit-inputs? #f + #:guile ,%bootstrap-guile + #:phases + (modify-phases %standard-phases + (delete 'unpack) + (delete 'configure) + (delete 'install) + (replace 'build + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bash (assoc-ref %build-inputs "bash")) + (coreutils (assoc-ref %build-inputs "coreutils")) + (xz (assoc-ref %build-inputs "xz")) + (gzip (assoc-ref %build-inputs "gzip")) + (bin (string-append out "/bin"))) + (mkdir-p bin) + (for-each + (lambda (program) + (let ((wrapper (string-append bin "/" program))) + (with-output-to-file wrapper + (lambda _ + (display (string-append "#!" bash "/bin/bash + +# Check if file is GZIP or XZ compressed +if [[ \"$#\" -eq 2 && \"$1\" = xvf && \"$2\" = *.tar.xz ]]; then + # Decompress using xz to temporary file + if ! " xz "/bin/xz -dc -- \"$2\" > /tmp/tar_wrapper.tar; then + echo \"Error: failed to decompress $2\" >&2 + rm -f /tmp/tar_wrapper.tar + exit 1 + fi + + # Extract using gash-utils tar + " coreutils "/bin/tar \"$1\" /tmp/tar_wrapper.tar + status=$? + + # Clean up + rm -f /tmp/tar_wrapper.tar + + exit $status +elif [[ \"$#\" -eq 2 && \"$1\" = xvf && \"$2\" = *.tar.gz ]]; then + # Decompress using gzip to temporary file + if ! " gzip "/bin/gzip -dc \"$2\" > /tmp/tar_wrapper.tar; then + echo \"Error: failed to decompress $2\" >&2 + rm -f /tmp/tar_wrapper.tar + exit 1 + fi + + # Extract using gash-utils tar + " coreutils "/bin/tar \"$1\" /tmp/tar_wrapper.tar + status=$? + + # Clean up + rm -f /tmp/tar_wrapper.tar + + exit $status +else + # Fall back to direct gash-utils tar call + exec " coreutils "/bin/tar \"$@\" +fi +")) + (chmod wrapper #o555))))) + '("tar"))))) + (replace 'check + (lambda* (#:key outputs #:allow-other-keys) + (let* ((bash (assoc-ref %build-inputs "bash")) + (bin (string-append bash "/bin")) + (program (string-append bin "/bash"))) + (invoke program "--help"))))))))) + +(define (%boot-mesboot2-inputs) + `(("xz" ,xz-mesboot0) + ("tar" ,gash-utils-tar-wrapper) + ;; we can drop bootar here; gzip + xz + gash-utils tar is enough to proceed + ,@(fold alist-delete (%boot-mesboot2-bootar-inputs) + '("bootar")))) + (define binutils-mesboot (package (inherit binutils-mesboot1) @@ -1709,7 +1864,7 @@ SHELL := " shell " (name "gcc-mesboot1-wrapper") (source #f) (inputs '()) - (native-inputs `(("bash" ,gash-boot) + (native-inputs `(("bash" ,bash-mesboot0) ("coreutils" ,gash-utils-boot) ("libc" ,glibc-mesboot) ("gcc" ,gcc-mesboot1))) @@ -1848,7 +2003,7 @@ exec " gcc "/bin/" program (version (package-version gcc-mesboot)) (source #f) (inputs '()) - (native-inputs `(("bash" ,gash-boot) + (native-inputs `(("bash" ,bash-mesboot0) ("coreutils" ,gash-utils-boot) ("libc" ,glibc-mesboot) ("gcc" ,gcc-mesboot))))) @@ -1966,7 +2121,7 @@ exec " gcc "/bin/" program ("tar" ,tar-mesboot) ("xz" ,xz-mesboot) ,@(fold alist-delete (%boot-mesboot5-inputs) - '("bash" "coreutils" "bootar" "kernel-headers")))) + '("bash" "coreutils" "tar" "kernel-headers")))) (define (%bootstrap-inputs+toolchain) ;; The traditional bootstrap-inputs. For the i686-linux, x86_64-linux