gnu: cross-base: Use an 'ld' wrapper also when cross-compiling.

* gnu/packages/base.scm (make-ld-wrapper): Add #:target parameter and
  honor it.
* gnu/packages/cross-base.scm (cross-gcc-arguments)[#:phases]
  <make-cross-binutils-visible>: Refer to the ld wrapper.
  (cross-gcc)[native-inputs]: Add "ld-wrapper-cross".
This commit is contained in:
Ludovic Courtès 2015-04-03 21:26:24 +02:00
parent 9bab6bea86
commit 4a740d0fec
2 changed files with 25 additions and 9 deletions

View File

@ -358,11 +358,14 @@ included.")
(license gpl3+)
(home-page "http://www.gnu.org/software/binutils/")))
(define* (make-ld-wrapper name #:key binutils guile bash
(define* (make-ld-wrapper name #:key binutils
(guile (canonical-package guile-2.0))
(bash (canonical-package bash)) target
(guile-for-build guile))
"Return a package called NAME that contains a wrapper for the 'ld' program
of BINUTILS, which adds '-rpath' flags to the actual 'ld' command line. The
wrapper uses GUILE and BASH."
of BINUTILS, which adds '-rpath' flags to the actual 'ld' command line. When
TARGET is not #f, make a wrapper for the cross-linker for TARGET, called
'TARGET-ld'. The wrapper uses GUILE and BASH."
(package
(name name)
(version "0")
@ -382,8 +385,10 @@ wrapper uses GUILE and BASH."
(let* ((out (assoc-ref %outputs "out"))
(bin (string-append out "/bin"))
(ld (string-append bin "/ld"))
(go (string-append bin "/ld.go")))
(ld ,(if target
`(string-append bin "/" ,target "-ld")
'(string-append bin "/ld")))
(go (string-append ld ".go")))
(setvbuf (current-output-port) _IOLBF)
(format #t "building ~s/bin/ld wrapper in ~s~%"
@ -403,7 +408,10 @@ wrapper uses GUILE and BASH."
"/bin/bash"))
(("@LD@")
(string-append (assoc-ref %build-inputs "binutils")
"/bin/ld")))
,(if target
(string-append "/bin/"
target "-ld")
"/bin/ld"))))
(chmod ld #o555)
(compile-file ld #:output-file go)))))
(synopsis "The linker wrapper")

View File

@ -130,12 +130,16 @@ may be either a libc package or #f.)"
,target))
(binutils (string-append
(assoc-ref inputs "binutils-cross")
"/bin/" ,target "-")))
"/bin/" ,target "-"))
(wrapper (string-append
(assoc-ref inputs "ld-wrapper-cross")
"/bin/" ,target "-ld")))
(for-each (lambda (file)
(symlink (string-append binutils file)
(string-append libexec "/"
file)))
'("as" "ld" "nm"))
'("as" "nm"))
(symlink wrapper (string-append libexec "/ld"))
#t))
,phases)))
(if libc
@ -214,7 +218,11 @@ GCC that does not target a libc; otherwise, target that libc."
,@(cross-gcc-arguments target libc)))
(native-inputs
`(("binutils-cross" ,xbinutils)
`(("ld-wrapper-cross" ,(make-ld-wrapper
(string-append "ld-wrapper-" target)
#:target target
#:binutils xbinutils))
("binutils-cross" ,xbinutils)
;; Call it differently so that the builder can check whether the "libc"
;; input is #f.