diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index 3ad2cf4ea0..499690f666 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -741,7 +741,7 @@ (define gcc-boot0 (alist-cons-after 'install 'symlink-libgcc_eh (lambda* (#:key outputs #:allow-other-keys) - (let ((out (assoc-ref outputs "out"))) + (let ((out (assoc-ref outputs "lib"))) ;; Glibc wants to link against libgcc_eh, so provide ;; it. (with-directory-excursion @@ -866,6 +866,7 @@ (define (cross-gcc-wrapper gcc binutils glibc bash) (name (string-append (package-name gcc) "-wrapped")) (source #f) (build-system trivial-build-system) + (outputs '("out")) (arguments `(#:guile ,%bootstrap-guile #:modules ((guix build utils)) @@ -941,7 +942,7 @@ (define-public glibc-final ;; if 'allowed-references' were per-output. (arguments `(#:allowed-references - ,(cons* gcc-boot0 (linux-libre-headers-boot0) + ,(cons* `(,gcc-boot0 "lib") (linux-libre-headers-boot0) (package-outputs glibc-final-with-bootstrap-bash)) ,@(package-arguments glibc-final-with-bootstrap-bash))))) @@ -993,6 +994,7 @@ (define libstdc++ ;; "/include/c++/" ;; ,(package-version gcc-4.8) )))) + (outputs '("out")) (inputs %boot2-inputs) (native-inputs '()) (propagated-inputs '()) @@ -1007,7 +1009,7 @@ (define-public gcc-final `(#:guile ,%bootstrap-guile #:implicit-inputs? #f - #:allowed-references ("out" ,glibc-final) + #:allowed-references ("out" "lib" ,glibc-final) ;; Build again GMP & co. within GCC's build process, because it's hard ;; to do outside (because GCC-BOOT0 is a cross-compiler, and thus diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm index deaf02c6e3..821515f3ed 100644 --- a/gnu/packages/gcc.scm +++ b/gnu/packages/gcc.scm @@ -79,6 +79,14 @@ (define-public gcc-4.7 "--with-local-prefix=/no-gcc-local-prefix" + ;; With a separate "lib" output, the build system + ;; incorrectly guesses GPLUSPLUS_INCLUDE_DIR, so force + ;; it. (Don't use a versioned sub-directory, that's + ;; unnecessary.) + ,(string-append "--with-gxx-include-dir=" + (assoc-ref %outputs "out") + "/include/c++") + ,(let ((libc (assoc-ref %build-inputs "libc"))) (if libc (string-append "--with-native-system-header-dir=" libc @@ -103,6 +111,12 @@ (define-public gcc-4.7 (base32 "1hx9h64ivarlzi4hxvq42as5m9vlr5cyzaaq4gzj4i619zmkfz1g")))) (build-system gnu-build-system) + + ;; Separate out the run-time support libraries because all the + ;; dynamic-linked objects depend on it. + (outputs '("out" ; commands, etc. (60+ MiB) + "lib")) ; libgcc_s, libgomp, etc. (15+ MiB) + (inputs `(("gmp" ,gmp) ("mpfr" ,mpfr) ("mpc" ,mpc) @@ -143,8 +157,9 @@ (define-public gcc-4.7 (alist-cons-before 'configure 'pre-configure (lambda* (#:key inputs outputs #:allow-other-keys) - (let ((out (assoc-ref outputs "out")) - (libc (assoc-ref inputs "libc"))) + (let ((libdir (or (assoc-ref outputs "lib") + (assoc-ref outputs "out"))) + (libc (assoc-ref inputs "libc"))) (when libc ;; The following is not performed for `--without-headers' ;; cross-compiler builds. @@ -170,7 +185,7 @@ (define-public gcc-4.7 ;; .) (format #f "#define GNU_USER_TARGET_LIB_SPEC \ \"-L~a/lib %{!static:-rpath=~a/lib %{!static-libgcc:-rpath=~a/lib64 -rpath=~a/lib -lgcc_s}} \" ~a" - libc libc out out suffix)) + libc libc libdir libdir suffix)) (("#define GNU_USER_TARGET_STARTFILE_SPEC.*$" line) (format #f "#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\" #define STANDARD_STARTFILE_PREFIX_2 \"\" @@ -180,7 +195,24 @@ (define-public gcc-4.7 ;; Don't retain a dependency on the build-time sed. (substitute* "fixincludes/fixincl.x" (("static char const sed_cmd_z\\[\\] =.*;") - "static char const sed_cmd_z[] = \"sed\";")))) + "static char const sed_cmd_z[] = \"sed\";")) + + ;; Move libstdc++*-gdb.py to the "lib" output to avoid a + ;; circularity between "out" and "lib". (Note: + ;; --with-python-dir is useless because it imposes $(prefix) as + ;; the parent directory.) + (substitute* "libstdc++-v3/python/Makefile.in" + (("pythondir = .*$") + (string-append "pythondir = " libdir "/share" + "/gcc-$(gcc_version)/python\n"))) + + ;; Avoid another circularity between the outputs: this #define + ;; ends up in auto-host.h in the "lib" output, referring to + ;; "out". (This variable is used to augment cpp's search path, + ;; but there's nothing useful to look for here.) + (substitute* "gcc/config.in" + (("PREFIX_INCLUDE_DIR") + "PREFIX_INCLUDE_DIR_isnt_necessary_here")))) (alist-cons-after 'configure 'post-configure diff --git a/gnu/packages/make-bootstrap.scm b/gnu/packages/make-bootstrap.scm index 2e3e9ec4c1..a6079553cc 100644 --- a/gnu/packages/make-bootstrap.scm +++ b/gnu/packages/make-bootstrap.scm @@ -393,6 +393,7 @@ (define %gcc-static (package-with-relocatable-glibc (package (inherit gcc-4.8) (name "gcc-static") + (outputs '("out")) ; all in one (arguments `(#:modules ((guix build utils) (guix build gnu-build-system)