;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2016 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
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)
(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))
+ (origin-patches (package-source xgcc))
(cons (search-patch "gcc-cross-environment-variables.patch")
(cross-gcc-patches target))))
(modules '((guix build utils)))
(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)
;; (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