;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015, 2018 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2016 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
+;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
;;;
;;; This file is part of GNU Guix.
;;;
cross-gcc
cross-newlib?))
-(define %xgcc
+(define-syntax %xgcc
;; GCC package used as the basis for cross-compilation. It doesn't have to
;; be 'gcc' and can be a specific variant such as 'gcc-4.8'.
- gcc)
+ ;;
+ ;; Note: This is a macro so that we do not refer to 'gcc' from the top
+ ;; level, which would lead to circular-dependency issues.
+ (identifier-syntax gcc))
(define %gcc-include-paths
;; Environment variables for header search paths.
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.)"
+(define (cross-gcc-arguments target xgcc libc)
+ "Return build system arguments for a cross-gcc for TARGET, using XGCC as the
+base compiler and using LIBC (which may be either a libc package or #f.)"
;; Set the current target system so that 'glibc-dynamic-linker' returns the
;; right name.
(parameterize ((%current-target-system target))
;; <http://lists.fedoraproject.org/pipermail/arm/2010-August/000663.html>
;; for instance.
(let ((args `(#:strip-binaries? #f
- ,@(package-arguments %xgcc))))
+ ,@(package-arguments xgcc))))
(substitute-keyword-arguments args
((#:configure-flags flags)
`(append (list ,(string-append "--target=" target)
(define (cross-gcc-snippet target)
"Return GCC snippet needed for TARGET."
(cond ((target-mingw? target)
- '(copy-recursively "libstdc++-v3/config/os/mingw32-w64"
- "libstdc++-v3/config/os/newlib"))
+ '(begin
+ (copy-recursively "libstdc++-v3/config/os/mingw32-w64"
+ "libstdc++-v3/config/os/newlib")
+ #t))
(else #f)))
(define* (cross-gcc target
- #:optional (xbinutils (cross-binutils target)) libc)
+ #:key
+ (xgcc %xgcc)
+ (xbinutils (cross-binutils target))
+ (libc #f))
"Return a cross-compiler for TARGET, where TARGET is a GNU triplet. Use
-XBINUTILS as the associated cross-Binutils. If LIBC is false, then build a
-GCC that does not target a libc; otherwise, target that libc."
- (package (inherit %xgcc)
+XGCC as the base compiler. Use XBINUTILS as the associated cross-Binutils.
+If LIBC is false, then build a GCC that does not target a libc; otherwise,
+target that libc."
+ (package (inherit xgcc)
(name (string-append "gcc-cross-"
(if libc "" "sans-libc-")
target))
- (source (origin (inherit (package-source %xgcc))
+ (source (origin (inherit (package-source xgcc))
(patches
(append
- (origin-patches (package-source %xgcc))
- (cons (search-patch "gcc-cross-environment-variables.patch")
+ (origin-patches (package-source xgcc))
+ (cons (if (version>=? (package-version xgcc) "6.0")
+ (search-patch "gcc-6-cross-environment-variables.patch")
+ (search-patch "gcc-cross-environment-variables.patch"))
(cross-gcc-patches target))))
(modules '((guix build utils)))
(snippet
(srfi srfi-26)
(ice-9 regex))
- ,@(cross-gcc-arguments target libc)))
+ ,@(cross-gcc-arguments target xgcc libc)))
(native-inputs
`(("ld-wrapper-cross" ,(make-ld-wrapper
("libc-native" ,@(assoc-ref (%final-inputs) "libc"))
;; Remaining inputs.
- ,@(let ((inputs (append (package-inputs %xgcc)
+ ,@(let ((inputs (append (package-inputs xgcc)
(alist-delete "libc" (%final-inputs)))))
(cond
((target-mingw? target)
,@inputs)))
(libc
`(("libc" ,libc)
+ ("libc:static" ,libc "static")
("xkernel-headers" ;the target headers
,@(assoc-ref (package-propagated-inputs libc)
"kernel-headers"))
(setenv "ARCH" ,(system->linux-architecture target))
(format #t "`ARCH' set to `~a' (cross compiling)~%" (getenv "ARCH"))
- (and (zero? (system* "make" ,(system->defconfig target)))
- (zero? (system* "make" "mrproper" "headers_check"))))
+ (invoke "make" ,(system->defconfig target))
+ (invoke "make" "mrproper" "headers_check"))
,phases))))
(native-inputs `(("cross-gcc" ,xgcc)
("cross-binutils" ,xbinutils)
`(#:modules ((guix build gnu-build-system)
(guix build utils)
(srfi srfi-26))
- #:phases (alist-cons-before
- 'configure 'set-cross-headers-path
- (lambda* (#:key inputs #:allow-other-keys)
- (let* ((mach (assoc-ref inputs "cross-gnumach-headers"))
- (cpath (string-append mach "/include")))
- (for-each (cut setenv <> cpath)
- ',%gcc-cross-include-paths)))
- %standard-phases)
+ #:phases (modify-phases %standard-phases
+ (add-before 'configure 'set-cross-headers-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let* ((mach (assoc-ref inputs "cross-gnumach-headers"))
+ (cpath (string-append mach "/include")))
+ (for-each (cut setenv <> cpath)
+ ',%gcc-cross-include-paths)
+ #t))))
#:configure-flags (list ,(string-append "--target=" target))
,@(package-arguments mig)))
(srfi srfi-26))
,@(package-arguments glibc/hurd-headers))
((#:phases phases)
- `(alist-cons-before
- 'pre-configure 'set-cross-headers-path
- (lambda* (#:key inputs #:allow-other-keys)
- (let* ((mach (assoc-ref inputs "gnumach-headers"))
- (hurd (assoc-ref inputs "hurd-headers"))
- (cpath (string-append mach "/include:"
- hurd "/include")))
- (for-each (cut setenv <> cpath)
- ',%gcc-cross-include-paths)))
- ,phases))))
+ `(modify-phases ,phases
+ (add-after 'unpack 'set-cross-headers-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let* ((mach (assoc-ref inputs "gnumach-headers"))
+ (hurd (assoc-ref inputs "hurd-headers"))
+ (cpath (string-append mach "/include:"
+ hurd "/include")))
+ (for-each (cut setenv <> cpath)
+ ',%gcc-cross-include-paths)
+ #t)))))))
(propagated-inputs `(("gnumach-headers" ,xgnumach-headers)
("hurd-headers" ,xhurd-headers)))
(srfi srfi-26))
,@(package-arguments hurd-minimal))
((#:phases phases)
- `(alist-cons-before
- 'configure 'set-cross-headers-path
- (lambda* (#:key inputs #:allow-other-keys)
- (let* ((glibc-headers (assoc-ref inputs "cross-glibc-hurd-headers"))
- (cpath (string-append glibc-headers "/include")))
- (for-each (cut setenv <> cpath)
- ',%gcc-cross-include-paths)))
- ,phases))))
+ `(modify-phases ,phases
+ (add-before 'configure 'set-cross-headers-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let* ((glibc-headers (assoc-ref inputs "cross-glibc-hurd-headers"))
+ (cpath (string-append glibc-headers "/include")))
+ (for-each (cut setenv <> cpath)
+ ',%gcc-cross-include-paths)
+ #t)))))))
(inputs `(("cross-glibc-hurd-headers" ,xglibc/hurd-headers)))
(xheaders (cross-kernel-headers target)))
"Return a libc cross-built for TARGET, a GNU triplet. Use XGCC and
XBINUTILS and the cross tool chain."
- (define (cross-libc-for-target target)
- "Return libc depending on TARGET."
- (match target
- ((or "i586-pc-gnu" "i586-gnu") glibc/hurd)
- (_ glibc/linux)))
-
- ;; Use (cross-libc-for-target ...) to determine the correct libc to use.
-
(if (cross-newlib? target)
(native-libc target)
- (let ((libc (cross-libc-for-target target)))
+ (let ((libc glibc))
(package (inherit libc)
(name (string-append "glibc-cross-" target))
(arguments
,@(package-arguments libc))
((#:configure-flags flags)
`(cons ,(string-append "--host=" target)
- ,flags))
+ ,(if (hurd-triplet? target)
+ `(cons "--disable-werror" ,flags)
+ flags)))
((#:phases phases)
- `(alist-cons-before
- 'configure 'set-cross-kernel-headers-path
- (lambda* (#:key inputs #:allow-other-keys)
- (let* ((kernel (assoc-ref inputs "kernel-headers"))
- (cpath (string-append kernel "/include")))
- (for-each (cut setenv <> cpath)
- ',%gcc-cross-include-paths)
- (setenv "CROSS_LIBRARY_PATH"
- (string-append kernel "/lib")) ;for Hurd's libihash
- #t))
- ,phases))))
+ `(modify-phases ,phases
+ (add-before 'configure 'set-cross-kernel-headers-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let* ((kernel (assoc-ref inputs "kernel-headers"))
+ (cpath (string-append kernel "/include")))
+ (for-each (cut setenv <> cpath)
+ ',%gcc-cross-include-paths)
+ (setenv "CROSS_LIBRARY_PATH"
+ (string-append kernel "/lib")) ; for Hurd's libihash
+ #t)))))))
;; Shadow the native "kernel-headers" because glibc's recipe expects the
;; "kernel-headers" input to point to the right thing.
;; (define-public xgcc-armhf
;; (let ((triplet "arm-linux-gnueabihf"))
;; (cross-gcc triplet
-;; (cross-binutils triplet)
-;; (cross-libc triplet))))
+;; #:xbinutils (cross-binutils triplet)
+;; #:libc (cross-libc triplet))))
;;
;;; We don't do that here because we'd be referring to bindings from (gnu
;;; packages gcc) from the top level, which doesn't play well with circular