gnu: cross-base: Use the right dynamic linker name.

* gnu/packages/cross-base.scm (cross-gcc-arguments): Parametrize
  %CURRENT-TARGET-SYSTEM.
* tests/monads.scm ("package-file + package->cross-derivation"): Replace
  "foo64-gnu" with "mips64el-linux-gnu".
This commit is contained in:
Ludovic Courtès 2014-10-05 16:25:25 +02:00
parent cdb4b4b3ed
commit b4469d8c12
2 changed files with 93 additions and 90 deletions

View file

@ -69,98 +69,101 @@ (define (cross-binutils target)
(define (cross-gcc-arguments target libc) (define (cross-gcc-arguments target libc)
"Return build system arguments for a cross-gcc for TARGET, using LIBC (which "Return build system arguments for a cross-gcc for TARGET, using LIBC (which
may be either a libc package or #f.)" may be either a libc package or #f.)"
(substitute-keyword-arguments (package-arguments gcc-4.8) ;; Set the current target system so that 'glibc-dynamic-linker' returns the
((#:configure-flags flags) ;; right name.
`(append (list ,(string-append "--target=" target) (parameterize ((%current-target-system target))
,@(gcc-configure-flags-for-triplet target) (substitute-keyword-arguments (package-arguments gcc-4.8)
,@(if libc ((#:configure-flags flags)
'() `(append (list ,(string-append "--target=" target)
`(;; Disable features not needed at this stage. ,@(gcc-configure-flags-for-triplet target)
"--disable-shared" "--enable-static" ,@(if libc
'()
`( ;; Disable features not needed at this stage.
"--disable-shared" "--enable-static"
;; Disable C++ because libstdc++'s configure ;; Disable C++ because libstdc++'s configure
;; script otherwise fails with "Link tests are not ;; script otherwise fails with "Link tests are not
;; allowed after GCC_NO_EXECUTABLES." ;; allowed after GCC_NO_EXECUTABLES."
"--enable-languages=c" "--enable-languages=c"
"--disable-threads" ;libgcc, would need libc "--disable-threads" ;libgcc, would need libc
"--disable-libatomic" "--disable-libatomic"
"--disable-libmudflap" "--disable-libmudflap"
"--disable-libgomp" "--disable-libgomp"
"--disable-libssp" "--disable-libssp"
"--disable-libquadmath" "--disable-libquadmath"
"--disable-decimal-float" ;would need libc "--disable-decimal-float" ;would need libc
))) )))
,(if libc ,(if libc
flags flags
`(remove (cut string-match "--enable-languages.*" <>) `(remove (cut string-match "--enable-languages.*" <>)
,flags)))) ,flags))))
((#:make-flags 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 (if libc
`(alist-cons-before `(let ((libc (assoc-ref %build-inputs "libc")))
'configure 'set-cross-path ;; FLAGS_FOR_TARGET are needed for the target libraries to receive
(lambda* (#:key inputs #:allow-other-keys) ;; the -Bxxx for the startfiles.
;; Add the cross Linux headers to CROSS_CPATH, and remove them (cons (string-append "FLAGS_FOR_TARGET=-B" libc "/lib")
;; from CPATH. ,flags))
(let ((libc (assoc-ref inputs "libc")) flags))
(linux (assoc-ref inputs ((#:phases phases)
"libc/linux-headers"))) (let ((phases
(define (cross? x) `(alist-cons-after
;; Return #t if X is a cross-libc or cross Linux. 'install 'make-cross-binutils-visible
(or (string-prefix? libc x) (lambda* (#:key outputs inputs #:allow-other-keys)
(string-prefix? linux x))) (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" (setenv "CROSS_CPATH"
(string-append libc "/include:" (string-append libc "/include:"
linux "/include")) linux "/include"))
(setenv "CROSS_LIBRARY_PATH" (setenv "CROSS_LIBRARY_PATH"
(string-append libc "/lib")) (string-append libc "/lib"))
(let ((cpath (search-path-as-string->list (let ((cpath (search-path-as-string->list
(getenv "CPATH"))) (getenv "CPATH")))
(libpath (search-path-as-string->list (libpath (search-path-as-string->list
(getenv "LIBRARY_PATH")))) (getenv "LIBRARY_PATH"))))
(setenv "CPATH" (setenv "CPATH"
(list->search-path-as-string (list->search-path-as-string
(remove cross? cpath) ":")) (remove cross? cpath) ":"))
(setenv "LIBRARY_PATH" (setenv "LIBRARY_PATH"
(list->search-path-as-string (list->search-path-as-string
(remove cross? libpath) ":")) (remove cross? libpath) ":"))
#t))) #t)))
,phases) ,phases)
phases))) phases)))
((#:strip-binaries? _) ((#:strip-binaries? _)
;; Disable stripping as this can break binaries, with object files of ;; Disable stripping as this can break binaries, with object files of
;; libgcc.a showing up as having an unknown architecture. See ;; libgcc.a showing up as having an unknown architecture. See
;; <http://lists.fedoraproject.org/pipermail/arm/2010-August/000663.html> ;; <http://lists.fedoraproject.org/pipermail/arm/2010-August/000663.html>
;; for instance. ;; for instance.
#f))) #f))))
(define* (cross-gcc target (define* (cross-gcc target
#:optional (xbinutils (cross-binutils target)) libc) #:optional (xbinutils (cross-binutils target)) libc)

View file

@ -123,10 +123,10 @@ (define (g x)
(test-assert "package-file + package->cross-derivation" (test-assert "package-file + package->cross-derivation"
(run-with-store %store (run-with-store %store
(mlet* %store-monad ((file (package-file coreutils "bin/ls" (mlet* %store-monad ((target -> "mips64el-linux-gnu")
#:target "foo64-gnu")) (file (package-file coreutils "bin/ls"
(xcu (package->cross-derivation coreutils #:target target))
"foo64-gnu"))) (xcu (package->cross-derivation coreutils target)))
(let ((output (derivation->output-path xcu))) (let ((output (derivation->output-path xcu)))
(return (string=? file (string-append output "/bin/ls"))))) (return (string=? file (string-append output "/bin/ls")))))
#:guile-for-build (package-derivation %store %bootstrap-guile))) #:guile-for-build (package-derivation %store %bootstrap-guile)))