diff options
author | Ludovic Courtès <ludo@gnu.org> | 2014-10-02 21:41:40 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2014-10-05 21:58:42 +0200 |
commit | cdb4b4b3edfe17239e059208b3d86eb61df550be (patch) | |
tree | 08b47f004ec944e4756533a46d8d1eacf2413587 /gnu | |
parent | 0d5a559f0f81e14c695e5aab178b30edf66088f3 (diff) | |
download | guix-cdb4b4b3edfe17239e059208b3d86eb61df550be.tar guix-cdb4b4b3edfe17239e059208b3d86eb61df550be.tar.gz |
gnu: cross-base: Externalize cross-gcc arguments.
* gnu/packages/cross-base.scm (cross-gcc-arguments): New procedure.
(cross-gcc): Use it. [No functional change.]
Diffstat (limited to 'gnu')
-rw-r--r-- | gnu/packages/cross-base.scm | 190 |
1 files changed, 97 insertions, 93 deletions
diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm index 46909cb597..5e824f5877 100644 --- a/gnu/packages/cross-base.scm +++ b/gnu/packages/cross-base.scm @@ -66,6 +66,102 @@ `(cons "--with-sysroot=/" ,flags))))))) (cross binutils target))) +(define (cross-gcc-arguments target libc) + "Return build system arguments for a cross-gcc for TARGET, using LIBC (which +may be either a libc package or #f.)" + (substitute-keyword-arguments (package-arguments gcc-4.8) + ((#:configure-flags flags) + `(append (list ,(string-append "--target=" target) + ,@(gcc-configure-flags-for-triplet target) + ,@(if libc + '() + `(;; Disable features not needed at this stage. + "--disable-shared" "--enable-static" + + ;; Disable C++ because libstdc++'s configure + ;; script otherwise fails with "Link tests are not + ;; allowed after GCC_NO_EXECUTABLES." + "--enable-languages=c" + + "--disable-threads" ;libgcc, would need libc + "--disable-libatomic" + "--disable-libmudflap" + "--disable-libgomp" + "--disable-libssp" + "--disable-libquadmath" + "--disable-decimal-float" ;would need libc + ))) + + ,(if libc + flags + `(remove (cut string-match "--enable-languages.*" <>) + ,flags)))) + ((#:make-flags flags) + (if libc + `(let ((libc (assoc-ref %build-inputs "libc"))) + ;; FLAGS_FOR_TARGET are needed for the target libraries to receive + ;; the -Bxxx for the startfiles. + (cons (string-append "FLAGS_FOR_TARGET=-B" libc "/lib") + ,flags)) + flags)) + ((#:phases phases) + (let ((phases + `(alist-cons-after + 'install 'make-cross-binutils-visible + (lambda* (#:key outputs inputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (libexec (string-append out "/libexec/gcc/" + ,target)) + (binutils (string-append + (assoc-ref inputs "binutils-cross") + "/bin/" ,target "-"))) + (for-each (lambda (file) + (symlink (string-append binutils file) + (string-append libexec "/" + file))) + '("as" "ld" "nm")) + #t)) + ,phases))) + (if libc + `(alist-cons-before + 'configure 'set-cross-path + (lambda* (#:key inputs #:allow-other-keys) + ;; Add the cross Linux headers to CROSS_CPATH, and remove them + ;; from CPATH. + (let ((libc (assoc-ref inputs "libc")) + (linux (assoc-ref inputs + "libc/linux-headers"))) + (define (cross? x) + ;; Return #t if X is a cross-libc or cross Linux. + (or (string-prefix? libc x) + (string-prefix? linux x))) + + (setenv "CROSS_CPATH" + (string-append libc "/include:" + linux "/include")) + (setenv "CROSS_LIBRARY_PATH" + (string-append libc "/lib")) + + (let ((cpath (search-path-as-string->list + (getenv "CPATH"))) + (libpath (search-path-as-string->list + (getenv "LIBRARY_PATH")))) + (setenv "CPATH" + (list->search-path-as-string + (remove cross? cpath) ":")) + (setenv "LIBRARY_PATH" + (list->search-path-as-string + (remove cross? libpath) ":")) + #t))) + ,phases) + phases))) + ((#:strip-binaries? _) + ;; Disable stripping as this can break binaries, with object files of + ;; libgcc.a showing up as having an unknown architecture. See + ;; <http://lists.fedoraproject.org/pipermail/arm/2010-August/000663.html> + ;; for instance. + #f))) + (define* (cross-gcc target #:optional (xbinutils (cross-binutils target)) libc) "Return a cross-compiler for TARGET, where TARGET is a GNU triplet. Use @@ -92,99 +188,7 @@ GCC that does not target a libc; otherwise, target that libc." (srfi srfi-1) (srfi srfi-26)) - ,@(substitute-keyword-arguments (package-arguments gcc-4.8) - ((#:configure-flags flags) - `(append (list ,(string-append "--target=" target) - ,@(gcc-configure-flags-for-triplet target) - ,@(if libc - '() - `( ;; Disable features not needed at this stage. - "--disable-shared" "--enable-static" - - ;; Disable C++ because libstdc++'s - ;; configure script otherwise fails with - ;; "Link tests are not allowed after - ;; GCC_NO_EXECUTABLES." - "--enable-languages=c" - - "--disable-threads" ; libgcc, would need libc - "--disable-libatomic" - "--disable-libmudflap" - "--disable-libgomp" - "--disable-libssp" - "--disable-libquadmath" - "--disable-decimal-float" ; would need libc - ))) - - ,(if libc - flags - `(remove (cut string-match "--enable-languages.*" <>) - ,flags)))) - ((#:make-flags flags) - (if libc - `(let ((libc (assoc-ref %build-inputs "libc"))) - ;; FLAGS_FOR_TARGET are needed for the target libraries to - ;; receive the -Bxxx for the startfiles. - (cons (string-append "FLAGS_FOR_TARGET=-B" libc "/lib") - ,flags)) - flags)) - ((#:phases phases) - (let ((phases - `(alist-cons-after - 'install 'make-cross-binutils-visible - (lambda* (#:key outputs inputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (libexec (string-append out "/libexec/gcc/" - ,target)) - (binutils (string-append - (assoc-ref inputs "binutils-cross") - "/bin/" ,target "-"))) - (for-each (lambda (file) - (symlink (string-append binutils file) - (string-append libexec "/" - file))) - '("as" "ld" "nm")) - #t)) - ,phases))) - (if libc - `(alist-cons-before - 'configure 'set-cross-path - (lambda* (#:key inputs #:allow-other-keys) - ;; Add the cross Linux headers to CROSS_CPATH, and remove - ;; them from CPATH. - (let ((libc (assoc-ref inputs "libc")) - (linux (assoc-ref inputs - "libc/linux-headers"))) - (define (cross? x) - ;; Return #t if X is a cross-libc or cross Linux. - (or (string-prefix? libc x) - (string-prefix? linux x))) - - (setenv "CROSS_CPATH" - (string-append libc "/include:" - linux "/include")) - (setenv "CROSS_LIBRARY_PATH" - (string-append libc "/lib")) - - (let ((cpath (search-path-as-string->list - (getenv "CPATH"))) - (libpath (search-path-as-string->list - (getenv "LIBRARY_PATH")))) - (setenv "CPATH" - (list->search-path-as-string - (remove cross? cpath) ":")) - (setenv "LIBRARY_PATH" - (list->search-path-as-string - (remove cross? libpath) ":")) - #t))) - ,phases) - phases))) - ((#:strip-binaries? _) - ;; Disable stripping as this can break binaries, with object files - ;; of libgcc.a showing up as having an unknown architecture. See - ;; <http://lists.fedoraproject.org/pipermail/arm/2010-August/000663.html> - ;; for instance. - #f)))) + ,@(cross-gcc-arguments target libc))) (native-inputs `(("binutils-cross" ,xbinutils) |