2013-02-27 03:38:11 -05:00
|
|
|
|
;;; GNU Guix --- Functional package management for GNU
|
2023-03-04 10:44:53 -05:00
|
|
|
|
;;; Copyright © 2013-2018, 2020, 2023 Ludovic Courtès <ludo@gnu.org>
|
2018-03-16 07:33:37 -04:00
|
|
|
|
;;; Copyright © 2014, 2015, 2018 Mark H Weaver <mhw@netris.org>
|
2023-05-23 09:31:53 -04:00
|
|
|
|
;;; Copyright © 2016, 2019, 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
|
2016-06-08 10:15:00 -04:00
|
|
|
|
;;; Copyright © 2016 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
|
2018-02-19 22:56:03 -05:00
|
|
|
|
;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
|
2021-05-09 06:44:08 -04:00
|
|
|
|
;;; Copyright © 2019, 2020, 2021 Marius Bakke <marius@gnu.org>
|
2019-08-14 13:46:53 -04:00
|
|
|
|
;;; Copyright © 2019 Carl Dong <contact@carldong.me>
|
2020-03-14 06:39:52 -04:00
|
|
|
|
;;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com>
|
2022-12-05 12:43:43 -05:00
|
|
|
|
;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
|
2023-05-22 05:04:12 -04:00
|
|
|
|
;;; Copyright © 2023 Josselin Poiret <dev@jpoiret.xyz>
|
2023-11-28 06:34:44 -05:00
|
|
|
|
;;; Copyright © 2023 Foundation Devices, Inc. <hello@foundationdevices.com>
|
2013-02-27 03:38:11 -05:00
|
|
|
|
;;;
|
|
|
|
|
;;; This file is part of GNU Guix.
|
|
|
|
|
;;;
|
|
|
|
|
;;; GNU Guix is free software; you can redistribute it and/or modify it
|
|
|
|
|
;;; under the terms of the GNU General Public License as published by
|
|
|
|
|
;;; the Free Software Foundation; either version 3 of the License, or (at
|
|
|
|
|
;;; your option) any later version.
|
|
|
|
|
;;;
|
|
|
|
|
;;; GNU Guix is distributed in the hope that it will be useful, but
|
|
|
|
|
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
;;; GNU General Public License for more details.
|
|
|
|
|
;;;
|
|
|
|
|
;;; You should have received a copy of the GNU General Public License
|
|
|
|
|
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
(define-module (gnu packages cross-base)
|
|
|
|
|
#:use-module (gnu packages)
|
2023-11-28 06:34:52 -05:00
|
|
|
|
#:use-module (gnu packages avr)
|
2013-04-17 08:59:19 -04:00
|
|
|
|
#:use-module (gnu packages gcc)
|
2013-02-27 03:38:11 -05:00
|
|
|
|
#:use-module (gnu packages base)
|
|
|
|
|
#:use-module (gnu packages linux)
|
2016-06-08 10:15:00 -04:00
|
|
|
|
#:use-module (gnu packages hurd)
|
2016-05-28 11:32:04 -04:00
|
|
|
|
#:use-module (gnu packages mingw)
|
2023-11-28 06:34:59 -05:00
|
|
|
|
#:use-module (guix memoization)
|
2022-05-23 16:37:26 -04:00
|
|
|
|
#:use-module (guix platform)
|
2013-02-27 03:38:11 -05:00
|
|
|
|
#:use-module (guix packages)
|
2022-12-05 12:43:43 -05:00
|
|
|
|
#:use-module (guix diagnostics)
|
2013-02-27 03:38:11 -05:00
|
|
|
|
#:use-module (guix download)
|
2022-12-05 12:43:43 -05:00
|
|
|
|
#:use-module (guix i18n)
|
2013-02-27 03:38:11 -05:00
|
|
|
|
#:use-module (guix utils)
|
|
|
|
|
#:use-module (guix build-system gnu)
|
2023-11-28 06:34:59 -05:00
|
|
|
|
#:use-module (guix build-system trivial)
|
2023-03-04 10:44:53 -05:00
|
|
|
|
#:use-module (guix gexp)
|
2013-02-27 03:38:11 -05:00
|
|
|
|
#:use-module (srfi srfi-1)
|
|
|
|
|
#:use-module (srfi srfi-26)
|
2013-05-24 16:44:15 -04:00
|
|
|
|
#:use-module (ice-9 match)
|
2016-06-08 10:15:00 -04:00
|
|
|
|
#:use-module (ice-9 regex)
|
2013-05-24 16:44:15 -04:00
|
|
|
|
#:export (cross-binutils
|
|
|
|
|
cross-libc
|
2016-05-28 11:32:04 -04:00
|
|
|
|
cross-gcc
|
2023-03-20 18:10:39 -04:00
|
|
|
|
cross-mig
|
2023-11-28 06:34:59 -05:00
|
|
|
|
cross-kernel-headers
|
|
|
|
|
cross-gcc-toolchain))
|
2013-02-27 03:38:11 -05:00
|
|
|
|
|
2017-05-29 07:23:36 -04:00
|
|
|
|
(define-syntax %xgcc
|
2015-06-26 11:06:30 -04:00
|
|
|
|
;; 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'.
|
2017-05-29 07:23:36 -04:00
|
|
|
|
;;
|
|
|
|
|
;; 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))
|
2015-06-26 11:06:30 -04:00
|
|
|
|
|
2016-05-28 11:32:04 -04:00
|
|
|
|
(define %gcc-include-paths
|
|
|
|
|
;; Environment variables for header search paths.
|
2020-02-12 12:29:19 -05:00
|
|
|
|
;; Note: See <http://bugs.gnu.org/22186> for why not 'CPATH'.
|
|
|
|
|
'("C_INCLUDE_PATH"
|
|
|
|
|
"CPLUS_INCLUDE_PATH"
|
|
|
|
|
"OBJC_INCLUDE_PATH"
|
|
|
|
|
"OBJCPLUS_INCLUDE_PATH"))
|
2016-05-28 11:32:04 -04:00
|
|
|
|
|
|
|
|
|
(define %gcc-cross-include-paths
|
|
|
|
|
;; Search path for target headers when cross-compiling.
|
|
|
|
|
(map (cut string-append "CROSS_" <>) %gcc-include-paths))
|
|
|
|
|
|
2013-02-27 03:38:11 -05:00
|
|
|
|
(define (cross p target)
|
|
|
|
|
(package (inherit p)
|
|
|
|
|
(name (string-append (package-name p) "-cross-" target))
|
|
|
|
|
(arguments
|
|
|
|
|
(substitute-keyword-arguments (package-arguments p)
|
2022-09-20 04:26:12 -04:00
|
|
|
|
((#:configure-flags flags ''())
|
2013-02-27 03:38:11 -05:00
|
|
|
|
`(cons ,(string-append "--target=" target)
|
|
|
|
|
,flags))))))
|
|
|
|
|
|
2022-12-05 12:43:43 -05:00
|
|
|
|
(define (contains-keyword? args)
|
|
|
|
|
"Check if ARGS contains a keyword object."
|
|
|
|
|
(find keyword? args))
|
|
|
|
|
|
|
|
|
|
(define* (cross-binutils . args)
|
|
|
|
|
(if (or (= (length args) 1) (contains-keyword? args))
|
|
|
|
|
(apply cross-binutils* args)
|
|
|
|
|
(apply cross-binutils/deprecated args)))
|
|
|
|
|
|
|
|
|
|
(define* (cross-binutils/deprecated target #:optional (binutils binutils))
|
|
|
|
|
(warning (G_ "'cross-binutils' must be used with keyword arguments~%"))
|
|
|
|
|
(cross-binutils* target #:binutils binutils))
|
|
|
|
|
|
2024-02-29 10:20:48 -05:00
|
|
|
|
(define (cross-binutils-package target)
|
|
|
|
|
"Returns the default package to use for a cross-Binutils for TARGET."
|
|
|
|
|
(cond
|
|
|
|
|
;; The xtensa-ath9k-elf target is used solely to build the firmware for
|
|
|
|
|
;; ath9k devices, the patches to binutils have not been updated and
|
|
|
|
|
;; only apply to binutils@2.33.
|
|
|
|
|
((string=? target "xtensa-ath9k-elf") binutils-2.33)
|
|
|
|
|
(else binutils)))
|
|
|
|
|
|
|
|
|
|
(define* (cross-binutils* target
|
|
|
|
|
#:key
|
|
|
|
|
(binutils (cross-binutils-package target)))
|
2020-02-15 12:37:49 -05:00
|
|
|
|
"Return a cross-Binutils for TARGET using BINUTILS."
|
2022-12-05 11:55:58 -05:00
|
|
|
|
(let ((binutils (package
|
|
|
|
|
(inherit binutils)
|
2013-05-27 16:23:21 -04:00
|
|
|
|
(arguments
|
|
|
|
|
(substitute-keyword-arguments (package-arguments
|
|
|
|
|
binutils)
|
|
|
|
|
((#:configure-flags flags)
|
|
|
|
|
;; Build with `--with-sysroot' so that ld honors
|
|
|
|
|
;; DT_RUNPATH entries when searching for a needed
|
|
|
|
|
;; library. This works because as a side effect
|
|
|
|
|
;; `genscripts.sh' sets `USE_LIBPATH=yes', which tells
|
|
|
|
|
;; elf32.em to use DT_RUNPATH in its search list.
|
2013-06-26 08:31:24 -04:00
|
|
|
|
;; See <http://sourceware.org/ml/binutils/2013-05/msg00312.html>.
|
|
|
|
|
;;
|
|
|
|
|
;; In theory choosing / as the sysroot could lead ld
|
|
|
|
|
;; to pick up native libs instead of target ones. In
|
|
|
|
|
;; practice the RUNPATH of target libs only refers to
|
|
|
|
|
;; target libs, not native libs, so this is safe.
|
|
|
|
|
`(cons "--with-sysroot=/" ,flags)))))))
|
2014-11-11 15:54:41 -05:00
|
|
|
|
|
2024-02-29 10:20:47 -05:00
|
|
|
|
;; For xtensa-ath9k-elf, apply Qualcomm's patch.
|
|
|
|
|
(cross (cond ((string=? target "xtensa-ath9k-elf")
|
2020-04-03 16:15:27 -04:00
|
|
|
|
(package-with-patches binutils
|
|
|
|
|
(search-patches
|
|
|
|
|
"ath9k-htc-firmware-binutils.patch")))
|
2020-03-24 15:39:06 -04:00
|
|
|
|
((target-mingw? target)
|
|
|
|
|
(package-with-extra-patches
|
2022-02-01 12:33:16 -05:00
|
|
|
|
(package-with-extra-configure-variable
|
|
|
|
|
;; mingw binutils does not work correctly when configured
|
|
|
|
|
;; with `--enable-compressed-debug-sections`. An error
|
|
|
|
|
;; like the following will occur whenever you try to link:
|
|
|
|
|
;;
|
|
|
|
|
;; x86_64-w64-mingw32-ld: final link failed: bad value
|
|
|
|
|
;;
|
|
|
|
|
;; TODO: This seems like a deeper problem that warrants
|
|
|
|
|
;; deeper investigation.
|
|
|
|
|
binutils "--enable-compressed-debug-sections" "no")
|
2020-04-10 08:48:02 -04:00
|
|
|
|
(search-patches "binutils-mingw-w64-timestamp.patch"
|
|
|
|
|
"binutils-mingw-w64-deterministic.patch")))
|
2020-03-24 15:39:06 -04:00
|
|
|
|
(else binutils))
|
2014-11-11 15:54:41 -05:00
|
|
|
|
target)))
|
2013-02-27 03:38:11 -05:00
|
|
|
|
|
2017-05-22 10:13:15 -04:00
|
|
|
|
(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.)"
|
2014-10-05 10:25:25 -04:00
|
|
|
|
;; Set the current target system so that 'glibc-dynamic-linker' returns the
|
|
|
|
|
;; right name.
|
|
|
|
|
(parameterize ((%current-target-system target))
|
2015-06-10 17:19:30 -04:00
|
|
|
|
;; 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.
|
|
|
|
|
(let ((args `(#:strip-binaries? #f
|
2017-05-22 10:13:15 -04:00
|
|
|
|
,@(package-arguments xgcc))))
|
2022-12-05 11:55:58 -05:00
|
|
|
|
(substitute-keyword-arguments args
|
|
|
|
|
((#:configure-flags flags)
|
2023-03-26 15:35:03 -04:00
|
|
|
|
#~(append (list #$(string-append "--target=" target)
|
|
|
|
|
#$@(if libc
|
|
|
|
|
#~( ;; Disable libcilkrts because it is not
|
|
|
|
|
;; ported to GNU/Hurd.
|
|
|
|
|
"--disable-libcilkrts"
|
|
|
|
|
;; When building a cross compiler, --with-sysroot is
|
|
|
|
|
;; implicitly set to "$gcc_tooldir/sys-root". This does
|
|
|
|
|
;; not work for us, because --with-native-system-header-dir
|
|
|
|
|
;; is searched for relative to this location. Thus, we set
|
|
|
|
|
;; it to "/" so GCC is able to find the target libc headers.
|
|
|
|
|
;; This is safe because in practice GCC uses CROSS_CPATH
|
|
|
|
|
;; & co to separate target and host libraries.
|
|
|
|
|
"--with-sysroot=/")
|
|
|
|
|
#~( ;; Disable features not needed at this stage.
|
|
|
|
|
"--disable-shared" "--enable-static"
|
|
|
|
|
"--enable-languages=c,c++"
|
|
|
|
|
|
|
|
|
|
;; libstdc++ cannot be built at this stage
|
|
|
|
|
;; ("Link tests are not allowed after
|
|
|
|
|
;; GCC_NO_EXECUTABLES.").
|
|
|
|
|
"--disable-libstdc++-v3"
|
|
|
|
|
|
|
|
|
|
"--disable-threads" ;libgcc, would need libc
|
|
|
|
|
"--disable-libatomic"
|
|
|
|
|
"--disable-libmudflap"
|
|
|
|
|
"--disable-libgomp"
|
|
|
|
|
"--disable-libmpx"
|
|
|
|
|
"--disable-libssp"
|
|
|
|
|
"--disable-libquadmath"
|
|
|
|
|
"--disable-decimal-float" ;would need libc
|
|
|
|
|
"--disable-libcilkrts"
|
|
|
|
|
|
|
|
|
|
;; When target is any OS other than 'none' these
|
|
|
|
|
;; libraries will fail if there is no libc
|
|
|
|
|
;; present. See
|
|
|
|
|
;; <https://lists.gnu.org/archive/html/guix-devel/2016-02/msg01311.html>
|
|
|
|
|
"--disable-libitm"
|
|
|
|
|
"--disable-libvtv"
|
|
|
|
|
"--disable-libsanitizer"
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
;; Install cross-built libraries such as libgcc_s.so in
|
|
|
|
|
;; the "lib" output.
|
|
|
|
|
#$@(if libc
|
|
|
|
|
#~((string-append "--with-toolexeclibdir="
|
|
|
|
|
(assoc-ref %outputs "lib")
|
|
|
|
|
"/" #$target "/lib"))
|
2023-11-28 06:34:50 -05:00
|
|
|
|
#~())
|
|
|
|
|
|
2023-11-28 06:34:56 -05:00
|
|
|
|
|
2023-11-28 06:34:50 -05:00
|
|
|
|
#$@(if (target-avr? target)
|
|
|
|
|
#~("--enable-multilib")
|
2023-11-28 06:34:55 -05:00
|
|
|
|
#~())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#$@(if (and libc (target-avr? target))
|
2023-11-28 06:34:56 -05:00
|
|
|
|
#~(;; By default GCC will attemp to compile
|
|
|
|
|
;; some libraries for other languages (objc,
|
|
|
|
|
;; fortran) but compilation fails for AVR.
|
|
|
|
|
"--enable-languages=c,c++"
|
|
|
|
|
(string-append "--with-native-system-header-dir="
|
2023-11-28 06:34:55 -05:00
|
|
|
|
#$libc "/" #$target "/include"))
|
2023-03-26 15:35:03 -04:00
|
|
|
|
#~()))
|
|
|
|
|
|
2023-11-28 06:34:50 -05:00
|
|
|
|
(remove
|
|
|
|
|
(lambda (flag)
|
|
|
|
|
(or (and #$libc
|
|
|
|
|
(string-prefix? "--enable-languages" flag))
|
2023-11-28 06:34:55 -05:00
|
|
|
|
(and #$libc
|
|
|
|
|
#$(target-avr? target)
|
|
|
|
|
(string-prefix? "--with-native-system-header-dir"
|
|
|
|
|
flag))
|
2023-11-28 06:34:50 -05:00
|
|
|
|
(and #$(target-avr? target)
|
|
|
|
|
(string=? flag "--disable-multilib"))))
|
|
|
|
|
#$flags)))
|
2022-12-05 11:55:58 -05:00
|
|
|
|
((#:make-flags flags)
|
|
|
|
|
(if libc
|
2023-11-28 06:34:55 -05:00
|
|
|
|
#~(let ((libc (assoc-ref %build-inputs "libc"))
|
|
|
|
|
(lib-prefix (if #$(target-avr? target)
|
|
|
|
|
(string-append "/" #$target)
|
|
|
|
|
"")))
|
2022-12-05 11:55:58 -05:00
|
|
|
|
;; FLAGS_FOR_TARGET are needed for the target libraries to receive
|
|
|
|
|
;; the -Bxxx for the startfiles.
|
2023-11-28 06:34:55 -05:00
|
|
|
|
(cons (string-append "FLAGS_FOR_TARGET=-B"
|
|
|
|
|
libc lib-prefix "/lib")
|
2023-03-26 15:35:03 -04:00
|
|
|
|
#$flags))
|
2022-12-05 11:55:58 -05:00
|
|
|
|
flags))
|
|
|
|
|
((#:phases phases)
|
2023-03-26 15:35:03 -04:00
|
|
|
|
#~(cross-gcc-build-phases #$target #$phases))))))
|
2014-10-02 15:41:40 -04:00
|
|
|
|
|
2019-09-24 14:23:31 -04:00
|
|
|
|
(define (cross-gcc-patches xgcc target)
|
|
|
|
|
"Return GCC patches needed for XGCC and TARGET."
|
2014-11-11 15:54:41 -05:00
|
|
|
|
(cond ((string-prefix? "xtensa-" target)
|
|
|
|
|
;; Patch by Qualcomm needed to build the ath9k-htc firmware.
|
2016-04-08 08:18:13 -04:00
|
|
|
|
(search-patches "ath9k-htc-firmware-gcc.patch"))
|
2016-05-28 11:32:04 -04:00
|
|
|
|
((target-mingw? target)
|
2024-04-12 06:53:00 -04:00
|
|
|
|
(append (if (not (version>=? (package-version xgcc) "13.0"))
|
|
|
|
|
(search-patches "gcc-4.9.3-mingw-gthr-default.patch")
|
|
|
|
|
'())
|
2019-09-24 14:23:31 -04:00
|
|
|
|
(if (version>=? (package-version xgcc) "7.0")
|
|
|
|
|
(search-patches "gcc-7-cross-mingw.patch")
|
2022-12-05 11:55:58 -05:00
|
|
|
|
'())))
|
2014-11-11 15:54:41 -05:00
|
|
|
|
(else '())))
|
|
|
|
|
|
2016-05-28 11:32:04 -04:00
|
|
|
|
(define (cross-gcc-snippet target)
|
|
|
|
|
"Return GCC snippet needed for TARGET."
|
2020-03-14 06:39:52 -04:00
|
|
|
|
`(begin
|
|
|
|
|
,@(if (target-mingw? target)
|
|
|
|
|
'((copy-recursively "libstdc++-v3/config/os/mingw32-w64"
|
|
|
|
|
"libstdc++-v3/config/os/newlib"))
|
|
|
|
|
'())
|
|
|
|
|
;; TOOLDIR_BASE_PREFIX is erroneous when using a separate "lib"
|
|
|
|
|
;; output. Specify it correctly, otherwise GCC won't find its shared
|
|
|
|
|
;; libraries installed in the "lib" output. See:
|
|
|
|
|
;; https://lists.gnu.org/archive/html/bug-guix/2020-03/msg00196.html.
|
|
|
|
|
(substitute* "gcc/Makefile.in"
|
|
|
|
|
(("-DTOOLDIR_BASE_PREFIX=[^ ]*")
|
|
|
|
|
"-DTOOLDIR_BASE_PREFIX=\\\"../../../../\\\""))
|
|
|
|
|
#t))
|
2016-05-28 11:32:04 -04:00
|
|
|
|
|
2023-11-28 06:34:51 -05:00
|
|
|
|
(define (cross-gcc-search-paths target)
|
|
|
|
|
"Return list of GCC search path specifications needed for TARGET."
|
|
|
|
|
(cons (search-path-specification
|
|
|
|
|
(variable "CROSS_LIBRARY_PATH")
|
|
|
|
|
(files `("lib" "lib64"
|
|
|
|
|
,@(list (string-append target "/lib")
|
|
|
|
|
(string-append target "/lib64")))))
|
|
|
|
|
|
|
|
|
|
(map (lambda (variable)
|
|
|
|
|
(search-path-specification
|
|
|
|
|
(variable variable)
|
|
|
|
|
|
|
|
|
|
;; Add 'include/c++' here so that <cstdlib>'s
|
|
|
|
|
;; "#include_next <stdlib.h>" finds GCC's
|
|
|
|
|
;; <stdlib.h>, not libc's.
|
|
|
|
|
(files (match variable
|
|
|
|
|
("CROSS_CPLUS_INCLUDE_PATH"
|
|
|
|
|
`("include/c++" "include"
|
|
|
|
|
,@(list (string-append target "/include/c++")
|
|
|
|
|
(string-append target "/include"))))
|
|
|
|
|
(_
|
|
|
|
|
`("include"
|
|
|
|
|
,(string-append target "/include")))))))
|
|
|
|
|
%gcc-cross-include-paths)))
|
|
|
|
|
|
2013-02-27 03:38:11 -05:00
|
|
|
|
(define* (cross-gcc target
|
2017-05-22 10:13:15 -04:00
|
|
|
|
#:key
|
|
|
|
|
(xgcc %xgcc)
|
|
|
|
|
(xbinutils (cross-binutils target))
|
|
|
|
|
(libc #f))
|
2013-02-27 03:38:11 -05:00
|
|
|
|
"Return a cross-compiler for TARGET, where TARGET is a GNU triplet. Use
|
2017-05-22 10:13:15 -04:00
|
|
|
|
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."
|
2022-12-05 11:55:58 -05:00
|
|
|
|
(package
|
|
|
|
|
(inherit xgcc)
|
2013-02-27 03:38:11 -05:00
|
|
|
|
(name (string-append "gcc-cross-"
|
|
|
|
|
(if libc "" "sans-libc-")
|
|
|
|
|
target))
|
2020-03-14 06:39:52 -04:00
|
|
|
|
(source
|
|
|
|
|
(origin
|
2022-12-05 11:55:58 -05:00
|
|
|
|
(inherit
|
|
|
|
|
(package-source xgcc))
|
2020-03-14 06:39:52 -04:00
|
|
|
|
(patches
|
|
|
|
|
(append
|
|
|
|
|
(origin-patches (package-source xgcc))
|
|
|
|
|
(append (cond
|
2024-04-12 06:53:01 -04:00
|
|
|
|
((version>=? (package-version xgcc) "13.0")
|
|
|
|
|
(search-patches "gcc-13-cross-system-header-dir.patch"
|
|
|
|
|
"gcc-12-cross-environment-variables.patch"
|
|
|
|
|
"gcc-cross-gxx-include-dir.patch"))
|
2022-05-25 17:37:32 -04:00
|
|
|
|
((version>=? (package-version xgcc) "12.0")
|
|
|
|
|
(search-patches "gcc-12-cross-environment-variables.patch"
|
|
|
|
|
"gcc-cross-gxx-include-dir.patch"))
|
2021-05-01 16:42:27 -04:00
|
|
|
|
((version>=? (package-version xgcc) "10.0")
|
|
|
|
|
(search-patches "gcc-10-cross-environment-variables.patch"
|
|
|
|
|
"gcc-cross-gxx-include-dir.patch"))
|
2020-03-14 06:39:52 -04:00
|
|
|
|
((version>=? (package-version xgcc) "8.0")
|
|
|
|
|
(search-patches "gcc-8-cross-environment-variables.patch"))
|
|
|
|
|
((version>=? (package-version xgcc) "6.0")
|
|
|
|
|
(search-patches "gcc-7-cross-toolexeclibdir.patch"
|
|
|
|
|
"gcc-6-cross-environment-variables.patch"))
|
|
|
|
|
(else
|
|
|
|
|
(search-patches "gcc-cross-environment-variables.patch")))
|
|
|
|
|
(cross-gcc-patches xgcc target))))
|
|
|
|
|
(modules '((guix build utils)))
|
|
|
|
|
(snippet
|
|
|
|
|
(cross-gcc-snippet target))))
|
2014-06-09 16:45:01 -04:00
|
|
|
|
|
2020-03-14 06:39:52 -04:00
|
|
|
|
(outputs '("out" "lib"))
|
2014-06-09 16:45:01 -04:00
|
|
|
|
|
2013-02-27 03:38:11 -05:00
|
|
|
|
(arguments
|
|
|
|
|
`(#:implicit-inputs? #f
|
2016-12-07 15:49:25 -05:00
|
|
|
|
#:imported-modules ((gnu build cross-toolchain)
|
2023-10-09 11:10:48 -04:00
|
|
|
|
,@%default-gnu-imported-modules)
|
2013-02-27 03:38:11 -05:00
|
|
|
|
#:modules ((guix build gnu-build-system)
|
|
|
|
|
(guix build utils)
|
2016-12-07 15:49:25 -05:00
|
|
|
|
(gnu build cross-toolchain)
|
2013-02-27 03:38:11 -05:00
|
|
|
|
(srfi srfi-1)
|
2016-12-07 15:49:25 -05:00
|
|
|
|
(srfi srfi-26)
|
|
|
|
|
(ice-9 regex))
|
2013-02-27 03:38:11 -05:00
|
|
|
|
|
2017-05-22 10:13:15 -04:00
|
|
|
|
,@(cross-gcc-arguments target xgcc libc)))
|
2013-06-25 14:57:14 -04:00
|
|
|
|
|
|
|
|
|
(native-inputs
|
2015-04-03 15:26:24 -04:00
|
|
|
|
`(("ld-wrapper-cross" ,(make-ld-wrapper
|
|
|
|
|
(string-append "ld-wrapper-" target)
|
2016-10-31 10:41:14 -04:00
|
|
|
|
#:target (const target)
|
2015-04-03 15:26:24 -04:00
|
|
|
|
#:binutils xbinutils))
|
|
|
|
|
("binutils-cross" ,xbinutils)
|
2013-02-27 03:38:11 -05:00
|
|
|
|
|
2017-05-22 10:13:15 -04:00
|
|
|
|
,@(let ((inputs (append (package-inputs xgcc)
|
2020-02-12 12:29:19 -05:00
|
|
|
|
(fold alist-delete (%final-inputs)
|
|
|
|
|
'("libc" "libc:static"))
|
|
|
|
|
|
|
|
|
|
;; Call it differently so that the builder can
|
|
|
|
|
;; check whether the "libc" input is #f.
|
|
|
|
|
`(("libc-native"
|
|
|
|
|
,@(assoc-ref (%final-inputs) "libc"))
|
|
|
|
|
("libc-native:static"
|
|
|
|
|
,@(assoc-ref (%final-inputs)
|
|
|
|
|
"libc:static"))))))
|
2016-05-28 11:32:04 -04:00
|
|
|
|
(cond
|
|
|
|
|
((target-mingw? target)
|
|
|
|
|
(if libc
|
2020-02-12 12:29:19 -05:00
|
|
|
|
`(,@inputs
|
|
|
|
|
("libc" ,libc))
|
|
|
|
|
`(,@inputs
|
|
|
|
|
("mingw-source" ,(package-source mingw-w64)))))
|
2023-11-28 06:34:53 -05:00
|
|
|
|
((and libc (target-avr? target))
|
|
|
|
|
`(,@inputs
|
|
|
|
|
("libc" ,libc)))
|
2016-05-28 11:32:04 -04:00
|
|
|
|
(libc
|
2020-02-12 12:29:19 -05:00
|
|
|
|
`(,@inputs
|
|
|
|
|
("libc" ,libc)
|
2017-09-03 08:25:39 -04:00
|
|
|
|
("libc:static" ,libc "static")
|
2022-12-05 11:55:58 -05:00
|
|
|
|
("xkernel-headers" ;the target headers
|
2016-05-28 11:32:04 -04:00
|
|
|
|
,@(assoc-ref (package-propagated-inputs libc)
|
2020-02-12 12:29:19 -05:00
|
|
|
|
"kernel-headers"))))
|
2016-05-28 11:32:04 -04:00
|
|
|
|
(else inputs)))))
|
2013-05-24 15:55:52 -04:00
|
|
|
|
|
2013-06-25 14:57:14 -04:00
|
|
|
|
(inputs '())
|
|
|
|
|
|
2013-05-24 15:55:52 -04:00
|
|
|
|
;; Only search target inputs, not host inputs.
|
2023-11-28 06:34:51 -05:00
|
|
|
|
(search-paths (cross-gcc-search-paths target))
|
2013-05-24 15:55:52 -04:00
|
|
|
|
(native-search-paths '())))
|
2013-02-27 03:38:11 -05:00
|
|
|
|
|
2022-12-05 12:43:43 -05:00
|
|
|
|
(define* (cross-kernel-headers . args)
|
|
|
|
|
(if (or (= (length args) 1) (contains-keyword? args))
|
|
|
|
|
(apply cross-kernel-headers* args)
|
|
|
|
|
(apply cross-kernel-headers/deprecated args)))
|
|
|
|
|
|
|
|
|
|
(define* (cross-kernel-headers/deprecated target
|
|
|
|
|
#:optional
|
|
|
|
|
(linux-headers linux-libre-headers)
|
|
|
|
|
(xgcc (cross-gcc target))
|
|
|
|
|
(xbinutils (cross-binutils target)))
|
|
|
|
|
(warning (G_ "'cross-kernel-headers' must be used with keyword arguments~%"))
|
|
|
|
|
(cross-kernel-headers* target
|
|
|
|
|
#:linux-headers linux-headers
|
|
|
|
|
#:xgcc xgcc
|
|
|
|
|
#:xbinutils xbinutils))
|
|
|
|
|
|
2023-03-20 18:10:39 -04:00
|
|
|
|
(define* (cross-gnumach-headers target
|
|
|
|
|
#:key
|
|
|
|
|
(xgcc (cross-gcc target))
|
|
|
|
|
(xbinutils (cross-binutils target)))
|
|
|
|
|
(package
|
|
|
|
|
(inherit gnumach-headers)
|
|
|
|
|
(name (string-append (package-name gnumach-headers)
|
|
|
|
|
"-cross-" target))
|
2023-05-22 05:04:13 -04:00
|
|
|
|
(arguments
|
|
|
|
|
(substitute-keyword-arguments (package-arguments gnumach-headers)
|
|
|
|
|
((#:phases phases #~%standard-phases)
|
|
|
|
|
#~(modify-phases #$phases
|
|
|
|
|
;; Cheat by setting the host_cpu variable manually, since using
|
|
|
|
|
;; --host= would require a working cross-compiler, which we don't
|
|
|
|
|
;; have yet.
|
|
|
|
|
(add-after 'unpack 'substitute-host-cpu
|
|
|
|
|
(lambda _
|
|
|
|
|
(substitute* "configure.ac"
|
|
|
|
|
(("AC_CANONICAL_HOST")
|
|
|
|
|
#$(string-append
|
|
|
|
|
"host_cpu="
|
|
|
|
|
(match target
|
|
|
|
|
((? target-x86-32?)
|
|
|
|
|
"i386")
|
|
|
|
|
((? target-x86-64?)
|
|
|
|
|
"x86_64")))))))))))
|
2023-03-20 18:10:39 -04:00
|
|
|
|
(native-inputs
|
|
|
|
|
(modify-inputs (package-native-inputs gnumach-headers)
|
|
|
|
|
(prepend xgcc xbinutils)))))
|
|
|
|
|
|
|
|
|
|
(define* (cross-mig target
|
|
|
|
|
#:key
|
|
|
|
|
(xgcc (cross-gcc target))
|
|
|
|
|
(xbinutils (cross-binutils target)))
|
|
|
|
|
"Return a cross-mig for TARGET, where TARGET is a GNU triplet. Use XGCC as
|
|
|
|
|
the base compiler. Use XBINUTILS as the associated cross-Binutils."
|
|
|
|
|
(define xgnumach-headers
|
|
|
|
|
(cross-gnumach-headers target
|
|
|
|
|
#:xgcc xgcc
|
|
|
|
|
#:xbinutils xbinutils))
|
|
|
|
|
(package
|
|
|
|
|
(inherit mig)
|
|
|
|
|
(name (string-append "mig-cross"))
|
|
|
|
|
(arguments
|
|
|
|
|
(substitute-keyword-arguments (package-arguments mig)
|
|
|
|
|
((#:configure-flags flags #~'())
|
|
|
|
|
#~(list #$(string-append "--target=" target)))
|
|
|
|
|
((#:tests? _ #f)
|
|
|
|
|
#f)
|
|
|
|
|
((#:phases phases #~%standard-phases)
|
|
|
|
|
#~(modify-phases #$phases
|
|
|
|
|
(add-before 'configure 'set-cross-headers-path
|
|
|
|
|
(lambda* (#:key inputs #:allow-other-keys)
|
|
|
|
|
(let* ((mach #+xgnumach-headers)
|
|
|
|
|
(cpath (string-append mach "/include")))
|
|
|
|
|
(for-each (lambda (variable)
|
|
|
|
|
(setenv variable cpath))
|
|
|
|
|
'#$%gcc-cross-include-paths))))))))
|
|
|
|
|
(propagated-inputs
|
|
|
|
|
(list xgnumach-headers))
|
|
|
|
|
(native-inputs
|
|
|
|
|
(modify-inputs (package-native-inputs mig)
|
|
|
|
|
(prepend xgcc xbinutils)))))
|
|
|
|
|
|
2022-12-05 12:43:43 -05:00
|
|
|
|
(define* (cross-kernel-headers* target
|
|
|
|
|
#:key
|
|
|
|
|
(linux-headers linux-libre-headers)
|
|
|
|
|
(xgcc (cross-gcc target))
|
|
|
|
|
(xbinutils (cross-binutils target)))
|
2016-06-08 10:15:00 -04:00
|
|
|
|
"Return headers depending on TARGET."
|
|
|
|
|
|
2013-02-27 03:38:11 -05:00
|
|
|
|
(define xlinux-headers
|
2022-12-05 11:55:58 -05:00
|
|
|
|
(package
|
|
|
|
|
(inherit linux-headers)
|
2019-05-28 11:57:41 -04:00
|
|
|
|
(name (string-append (package-name linux-headers)
|
2013-02-27 03:38:11 -05:00
|
|
|
|
"-cross-" target))
|
|
|
|
|
(arguments
|
build-system: Introduce "bags" as an intermediate representation.
* guix/build-system.scm (<build-system>)[build, cross-build]: Remove.
[lower]: New field.
(<bag>): New record type.
(make-bag): New procedure.
* guix/packages.scm (bag-transitive-inputs, bag-transitive-build-inputs,
bag-transitive-host-inputs, bag-transitive-target-inputs,
package->bag): New procedures.
(package-derivation): Use it; use the bag, apply its build procedure,
etc.
(package-cross-derivation): Likewise.
* gnu/packages/bootstrap.scm (raw-build, make-raw-bag): New procedure.
(%bootstrap-guile): Use them.
* guix/build-system/trivial.scm (lower): New procedure.
(trivial-build, trivial-cross-build): Remove 'source' parameter. Pass
INPUTS as is.
(trivial-build-system): Adjust accordingly.
* guix/build-system/gnu.scm (%store, inputs-search-paths,
standard-search-paths, expand-inputs, standard-inputs): Remove.
(gnu-lower): New procedure.
(gnu-build): Remove 'source' and #:implicit-inputs? parameters.
Remove 'implicit-inputs' and 'implicit-search-paths' variables. Get
the source from INPUT-DRVS.
(gnu-cross-build): Likewise.
(standard-cross-packages): Remove call to 'standard-packages'.
(standard-cross-inputs, standard-cross-search-paths): Remove.
(gnu-build-system): Remove 'build' and 'cross-build'; add 'lower'.
* guix/build-system/cmake.scm (lower): New procedure.
(cmake-build): Remove 'source' and #:cmake parameters. Use INPUTS and
SEARCH-PATHS as is. Get the source from INPUTS.
* guix/build-system/perl.scm: Likewise.
* guix/build-system/python.scm: Likewise.
* guix/build-system/ruby.scm: Likewise.
* gnu/packages/cross-base.scm (cross-gcc): Change "cross-linux-headers"
to "linux-headers".
(cross-libc)[xlinux-headers]: Pass #:implicit-cross-inputs? #f.
Likewise. In 'propagated-inputs', change "cross-linux-headers" to
"linux-headers".
* guix/git-download.scm (git-fetch): Use 'standard-packages' instead of
'standard-inputs'.
* tests/builders.scm ("gnu-build-system"): Remove use of
'build-system-builder'.
("gnu-build"): Remove 'source' and #:implicit-inputs? arguments to
'gnu-build'.
* tests/packages.scm ("search paths"): Adjust to new build system API.
("package-cross-derivation, no cross builder"): Likewise.
* doc/guix.texi (Build Systems): Add paragraph on bags.
2014-10-03 12:06:16 -04:00
|
|
|
|
(substitute-keyword-arguments
|
|
|
|
|
`(#:implicit-cross-inputs? #f
|
2019-05-28 11:57:41 -04:00
|
|
|
|
,@(package-arguments linux-headers))
|
2013-02-27 03:38:11 -05:00
|
|
|
|
((#:phases phases)
|
2021-05-09 06:44:08 -04:00
|
|
|
|
`(modify-phases ,phases
|
|
|
|
|
(replace 'build
|
|
|
|
|
(lambda _
|
2022-05-07 10:45:40 -04:00
|
|
|
|
(setenv "ARCH" ,(platform-linux-architecture
|
|
|
|
|
(lookup-platform-by-target target)))
|
2021-05-09 06:44:08 -04:00
|
|
|
|
(format #t "`ARCH' set to `~a' (cross compiling)~%"
|
|
|
|
|
(getenv "ARCH"))
|
2013-02-27 03:38:11 -05:00
|
|
|
|
|
2021-05-09 06:44:08 -04:00
|
|
|
|
(invoke "make" ,(system->defconfig target))
|
|
|
|
|
(invoke "make" "mrproper"
|
|
|
|
|
,@(if (version>=? (package-version linux-headers) "5.3")
|
|
|
|
|
'("headers")
|
|
|
|
|
'("headers_check")))))))))
|
2013-06-25 14:57:14 -04:00
|
|
|
|
(native-inputs `(("cross-gcc" ,xgcc)
|
|
|
|
|
("cross-binutils" ,xbinutils)
|
2019-05-28 11:57:41 -04:00
|
|
|
|
,@(package-native-inputs linux-headers)))))
|
2013-02-27 03:38:11 -05:00
|
|
|
|
|
2023-03-20 18:10:39 -04:00
|
|
|
|
(define xmig
|
|
|
|
|
(cross-mig target #:xgcc xgcc #:xbinutils xbinutils))
|
2023-03-04 10:44:53 -05:00
|
|
|
|
|
2016-06-08 10:15:00 -04:00
|
|
|
|
(define xgnumach-headers
|
2023-03-20 18:10:39 -04:00
|
|
|
|
(cross-gnumach-headers target #:xgcc xgcc #:xbinutils xbinutils))
|
2016-06-08 10:15:00 -04:00
|
|
|
|
|
|
|
|
|
(define xhurd-headers
|
2022-12-05 11:55:58 -05:00
|
|
|
|
(package
|
|
|
|
|
(inherit hurd-headers)
|
2016-06-08 10:15:00 -04:00
|
|
|
|
(name (string-append (package-name hurd-headers)
|
|
|
|
|
"-cross-" target))
|
|
|
|
|
|
2023-03-20 18:10:40 -04:00
|
|
|
|
(arguments
|
|
|
|
|
(substitute-keyword-arguments (package-arguments hurd-headers)
|
|
|
|
|
((#:configure-flags flags)
|
|
|
|
|
`(cons* ,(string-append "--build=" (%current-system))
|
|
|
|
|
,(string-append "--host=" target)
|
|
|
|
|
,flags))))
|
|
|
|
|
|
2016-06-08 10:15:00 -04:00
|
|
|
|
(native-inputs `(("cross-gcc" ,xgcc)
|
|
|
|
|
("cross-binutils" ,xbinutils)
|
|
|
|
|
("cross-mig" ,xmig)
|
2023-03-20 18:10:40 -04:00
|
|
|
|
,@(alist-delete "mig" (package-native-inputs hurd-headers))))))
|
2016-06-08 10:15:00 -04:00
|
|
|
|
|
2022-12-05 11:55:58 -05:00
|
|
|
|
(define xglibc/hurd-headers
|
|
|
|
|
(package
|
|
|
|
|
(inherit glibc/hurd-headers)
|
2016-06-08 10:15:00 -04:00
|
|
|
|
(name (string-append (package-name glibc/hurd-headers)
|
|
|
|
|
"-cross-" target))
|
|
|
|
|
|
|
|
|
|
(arguments
|
|
|
|
|
(substitute-keyword-arguments
|
|
|
|
|
`(#:modules ((guix build gnu-build-system)
|
|
|
|
|
(guix build utils)
|
|
|
|
|
(srfi srfi-26))
|
|
|
|
|
,@(package-arguments glibc/hurd-headers))
|
|
|
|
|
((#:phases phases)
|
2018-02-19 22:56:03 -05:00
|
|
|
|
`(modify-phases ,phases
|
2018-11-18 17:12:36 -05:00
|
|
|
|
(add-after 'unpack 'set-cross-headers-path
|
2018-02-19 22:56:03 -05:00
|
|
|
|
(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)
|
2023-05-22 05:04:12 -04:00
|
|
|
|
#t)))))
|
|
|
|
|
((#:configure-flags flags)
|
|
|
|
|
`(cons* ,(string-append "--build=" (%current-system))
|
|
|
|
|
,(string-append "--host=" target)
|
|
|
|
|
,flags))))
|
2016-06-08 10:15:00 -04:00
|
|
|
|
|
|
|
|
|
(propagated-inputs `(("gnumach-headers" ,xgnumach-headers)
|
|
|
|
|
("hurd-headers" ,xhurd-headers)))
|
|
|
|
|
|
|
|
|
|
(native-inputs `(("cross-gcc" ,xgcc)
|
|
|
|
|
("cross-binutils" ,xbinutils)
|
|
|
|
|
("cross-mig" ,xmig)
|
|
|
|
|
,@(alist-delete "mig"(package-native-inputs glibc/hurd-headers))))))
|
|
|
|
|
|
|
|
|
|
(define xhurd-minimal
|
2022-12-05 11:55:58 -05:00
|
|
|
|
(package
|
|
|
|
|
(inherit hurd-minimal)
|
2016-06-08 10:15:00 -04:00
|
|
|
|
(name (string-append (package-name hurd-minimal)
|
|
|
|
|
"-cross-" target))
|
|
|
|
|
(arguments
|
|
|
|
|
(substitute-keyword-arguments
|
2022-12-05 11:55:58 -05:00
|
|
|
|
`(#:modules ((guix build gnu-build-system)
|
|
|
|
|
(guix build utils)
|
|
|
|
|
(srfi srfi-26))
|
|
|
|
|
,@(package-arguments hurd-minimal))
|
2023-03-20 18:10:40 -04:00
|
|
|
|
((#:configure-flags flags)
|
|
|
|
|
`(cons* ,(string-append "--build=" (%current-system))
|
|
|
|
|
,(string-append "--host=" target)
|
|
|
|
|
,flags))
|
2016-06-08 10:15:00 -04:00
|
|
|
|
((#:phases phases)
|
2023-05-23 09:31:53 -04:00
|
|
|
|
#~(modify-phases #$phases
|
|
|
|
|
(add-after 'unpack 'delete-shared-target
|
|
|
|
|
;; Cannot create shared libraries due to missing crt1.o
|
|
|
|
|
(lambda _
|
|
|
|
|
(substitute* "Makeconf"
|
|
|
|
|
(("(targets := \\$\\(libname\\)\\.a) \\$\\(libname\\)\\.so" all static)
|
|
|
|
|
static)
|
|
|
|
|
(("\\$\\(DESTDIR\\)\\$\\(libdir\\)/\\$\\(libname\\)\\.so\\.\\$\\(hurd-version\\)")
|
|
|
|
|
"")
|
|
|
|
|
(("^libs: .*\\.so\\..*" all)
|
|
|
|
|
(string-append "# " all)))))
|
2018-02-19 22:56:03 -05:00
|
|
|
|
(add-before 'configure 'set-cross-headers-path
|
|
|
|
|
(lambda* (#:key inputs #:allow-other-keys)
|
|
|
|
|
(let* ((glibc-headers (assoc-ref inputs "cross-glibc-hurd-headers"))
|
2023-05-23 09:31:53 -04:00
|
|
|
|
(mach-headers (assoc-ref inputs "cross-gnumach-headers"))
|
|
|
|
|
(cpath (string-append glibc-headers "/include"
|
|
|
|
|
":" mach-headers "/include")))
|
2018-02-19 22:56:03 -05:00
|
|
|
|
(for-each (cut setenv <> cpath)
|
2023-05-23 09:31:53 -04:00
|
|
|
|
'#$%gcc-cross-include-paths)
|
2018-02-19 22:56:03 -05:00
|
|
|
|
#t)))))))
|
2016-06-08 10:15:00 -04:00
|
|
|
|
|
2023-05-23 09:31:53 -04:00
|
|
|
|
(inputs `(("cross-glibc-hurd-headers" ,xglibc/hurd-headers)
|
|
|
|
|
("cross-gnumach-headers" ,xgnumach-headers)))
|
2016-06-08 10:15:00 -04:00
|
|
|
|
|
|
|
|
|
(native-inputs `(("cross-gcc" ,xgcc)
|
|
|
|
|
("cross-binutils" ,xbinutils)
|
|
|
|
|
("cross-mig" ,xmig)
|
2023-05-23 09:31:53 -04:00
|
|
|
|
,@(alist-delete "mig"
|
|
|
|
|
(package-native-inputs hurd-minimal))))))
|
2016-06-08 10:15:00 -04:00
|
|
|
|
|
|
|
|
|
(define xhurd-core-headers
|
2022-12-05 11:55:58 -05:00
|
|
|
|
(package
|
|
|
|
|
(inherit hurd-core-headers)
|
2016-06-08 10:15:00 -04:00
|
|
|
|
(name (string-append (package-name hurd-core-headers)
|
|
|
|
|
"-cross-" target))
|
|
|
|
|
|
|
|
|
|
(inputs `(("gnumach-headers" ,xgnumach-headers)
|
|
|
|
|
("hurd-headers" ,xhurd-headers)
|
2023-03-20 18:10:41 -04:00
|
|
|
|
("hurd-minimal" ,xhurd-minimal)))))
|
2016-06-08 10:15:00 -04:00
|
|
|
|
|
|
|
|
|
(match target
|
|
|
|
|
((or "i586-pc-gnu" "i586-gnu") xhurd-core-headers)
|
|
|
|
|
(_ xlinux-headers)))
|
|
|
|
|
|
2022-12-05 12:43:43 -05:00
|
|
|
|
(define* (cross-libc . args)
|
|
|
|
|
(if (or (= (length args) 1) (contains-keyword? args))
|
|
|
|
|
(apply cross-libc* args)
|
|
|
|
|
(apply cross-libc/deprecated args)))
|
|
|
|
|
|
|
|
|
|
(define* (cross-libc/deprecated target
|
|
|
|
|
#:optional
|
2023-05-22 05:42:26 -04:00
|
|
|
|
(libc (libc-for-target target))
|
2022-12-05 12:43:43 -05:00
|
|
|
|
(xgcc (cross-gcc target))
|
|
|
|
|
(xbinutils (cross-binutils target))
|
|
|
|
|
(xheaders (cross-kernel-headers target)))
|
|
|
|
|
(warning (G_ "'cross-libc' must be used with keyword arguments~%"))
|
|
|
|
|
(cross-libc* target
|
|
|
|
|
#:libc libc
|
|
|
|
|
#:xgcc xgcc
|
|
|
|
|
#:xbinutils xbinutils
|
|
|
|
|
#:xheaders xheaders))
|
|
|
|
|
|
|
|
|
|
(define* (cross-libc* target
|
|
|
|
|
#:key
|
2023-05-22 05:42:26 -04:00
|
|
|
|
(libc (libc-for-target target))
|
2022-12-05 12:43:43 -05:00
|
|
|
|
(xgcc (cross-gcc target))
|
|
|
|
|
(xbinutils (cross-binutils target))
|
|
|
|
|
(xheaders (cross-kernel-headers target)))
|
2019-05-06 18:21:43 -04:00
|
|
|
|
"Return LIBC cross-built for TARGET, a GNU triplet. Use XGCC and XBINUTILS
|
2023-11-28 06:34:44 -05:00
|
|
|
|
and the cross tool chain. If TARGET doesn't have a standard C library #f is
|
|
|
|
|
returned."
|
|
|
|
|
(match target
|
|
|
|
|
((? target-mingw?)
|
|
|
|
|
(let ((machine (substring target 0 (string-index target #\-))))
|
|
|
|
|
(make-mingw-w64 machine
|
|
|
|
|
#:xgcc xgcc
|
|
|
|
|
#:xbinutils xbinutils)))
|
|
|
|
|
((or (? target-linux?) (? target-hurd?))
|
|
|
|
|
(package
|
|
|
|
|
(inherit libc)
|
|
|
|
|
(name (string-append "glibc-cross-" target))
|
|
|
|
|
(arguments
|
|
|
|
|
(substitute-keyword-arguments
|
|
|
|
|
`(;; Disable stripping (see above.)
|
|
|
|
|
#:strip-binaries? #f
|
|
|
|
|
|
|
|
|
|
;; This package is used as a target input, but it should not have
|
|
|
|
|
;; the usual cross-compilation inputs since that would include
|
|
|
|
|
;; itself.
|
|
|
|
|
#:implicit-cross-inputs? #f
|
|
|
|
|
|
|
|
|
|
;; We need SRFI 26.
|
|
|
|
|
#:modules ((guix build gnu-build-system)
|
|
|
|
|
(guix build utils)
|
|
|
|
|
(srfi srfi-26))
|
|
|
|
|
|
2023-12-09 14:14:43 -05:00
|
|
|
|
,@(package-arguments libc))
|
|
|
|
|
((#:configure-flags flags)
|
|
|
|
|
`(cons ,(string-append "--host=" target)
|
|
|
|
|
,(if (target-hurd? target)
|
|
|
|
|
`(append (list "--disable-werror"
|
|
|
|
|
,@%glibc/hurd-configure-flags)
|
|
|
|
|
,flags)
|
|
|
|
|
flags)))
|
|
|
|
|
((#:phases 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)))
|
|
|
|
|
(add-before 'configure 'add-cross-binutils-to-PATH
|
|
|
|
|
(lambda* (#:key inputs #:allow-other-keys)
|
|
|
|
|
;; Add BINUTILS/TARGET/bin to $PATH so that 'gcc
|
|
|
|
|
;; -print-prog-name=objdump' returns the correct name. See
|
|
|
|
|
;; <https://inbox.sourceware.org/libc-alpha/d72f5f6f-cc3a-bd89-0800-ffb068928e0f@linaro.org/t/>.
|
|
|
|
|
(define cross-objdump
|
|
|
|
|
(search-input-file
|
|
|
|
|
inputs
|
|
|
|
|
(string-append ,target "/bin/objdump")))
|
|
|
|
|
|
|
|
|
|
(define cross-binutils
|
|
|
|
|
(dirname cross-objdump))
|
|
|
|
|
|
|
|
|
|
(format #t "adding '~a' to the front of 'PATH'~%"
|
|
|
|
|
cross-binutils)
|
2023-12-09 18:13:37 -05:00
|
|
|
|
(setenv "PATH" (string-append cross-binutils ":"
|
|
|
|
|
(getenv "PATH")))))
|
|
|
|
|
|
|
|
|
|
;; This phase would require running 'localedef' built for
|
|
|
|
|
;; TARGET, which is impossible by definition.
|
|
|
|
|
(delete 'install-utf8-c-locale)
|
|
|
|
|
|
2023-12-09 14:14:43 -05:00
|
|
|
|
,@(if (target-hurd? target)
|
|
|
|
|
'((add-after 'install 'augment-libc.so
|
|
|
|
|
(lambda* (#:key outputs #:allow-other-keys)
|
|
|
|
|
(let* ((out (assoc-ref outputs "out")))
|
|
|
|
|
(substitute* (string-append out "/lib/libc.so")
|
|
|
|
|
(("/[^ ]+/lib/libc.so.0.3")
|
|
|
|
|
(string-append out "/lib/libc.so.0.3"
|
|
|
|
|
" libmachuser.so libhurduser.so"))))
|
|
|
|
|
#t)))
|
|
|
|
|
'())))))
|
2023-11-28 06:34:44 -05:00
|
|
|
|
|
|
|
|
|
;; Shadow the native "kernel-headers" because glibc's recipe expects the
|
|
|
|
|
;; "kernel-headers" input to point to the right thing.
|
|
|
|
|
(propagated-inputs `(("kernel-headers" ,xheaders)))
|
|
|
|
|
|
|
|
|
|
(native-inputs `(("cross-gcc" ,xgcc)
|
|
|
|
|
("cross-binutils" ,xbinutils)
|
|
|
|
|
,@(if (target-hurd? target)
|
|
|
|
|
`(("cross-mig"
|
|
|
|
|
,(cross-mig target
|
|
|
|
|
#:xgcc xgcc
|
|
|
|
|
#:xbinutils xbinutils)))
|
|
|
|
|
'())
|
|
|
|
|
,@(package-inputs libc) ;FIXME: static-bash
|
|
|
|
|
,@(package-native-inputs libc)))))
|
2023-11-28 06:34:52 -05:00
|
|
|
|
((? target-avr?)
|
|
|
|
|
(make-avr-libc #:xbinutils xbinutils
|
|
|
|
|
#:xgcc xgcc))
|
2023-11-28 06:34:44 -05:00
|
|
|
|
(else #f)))
|
2016-05-28 11:32:04 -04:00
|
|
|
|
|
2023-11-28 06:34:59 -05:00
|
|
|
|
(define* (cross-gcc-toolchain/implementation target
|
|
|
|
|
#:key
|
|
|
|
|
(base-gcc %xgcc)
|
|
|
|
|
(xbinutils (cross-binutils target))
|
|
|
|
|
(libc (cross-libc
|
|
|
|
|
target
|
|
|
|
|
#:xgcc (cross-gcc target #:xgcc base-gcc)
|
|
|
|
|
#:xbinutils xbinutils))
|
|
|
|
|
(xgcc (cross-gcc target
|
|
|
|
|
#:xgcc base-gcc
|
|
|
|
|
#:libc libc
|
|
|
|
|
#:xbinutils xbinutils)))
|
|
|
|
|
"Returns PACKAGE that contains a cross-compilation tool chain for TARGET
|
|
|
|
|
with XBINUTILS, XGCC and LIBC (if exists for TARGET)."
|
|
|
|
|
(package
|
2024-01-19 08:54:41 -05:00
|
|
|
|
;; Using PACKAGE-NAME of XGCC is avoided here as there are platforms that
|
|
|
|
|
;; still need a toolchain but don't have a libc (e.g. or1k-elf).
|
|
|
|
|
(name (string-append "gcc-cross-" target "-toolchain"))
|
2023-11-28 06:34:59 -05:00
|
|
|
|
(version (package-version xgcc))
|
|
|
|
|
(source #f)
|
|
|
|
|
(build-system trivial-build-system)
|
|
|
|
|
(arguments
|
|
|
|
|
(list #:modules '((guix build union))
|
|
|
|
|
#:builder
|
|
|
|
|
#~(begin
|
|
|
|
|
(use-modules (ice-9 match)
|
|
|
|
|
(guix build union))
|
|
|
|
|
|
|
|
|
|
(match %build-inputs
|
|
|
|
|
(((names . directory) ...)
|
|
|
|
|
(union-build #$output directory))))))
|
|
|
|
|
(inputs `(,xbinutils ,xgcc ,@(if libc (list libc) '())))
|
|
|
|
|
(home-page (package-home-page xgcc))
|
|
|
|
|
(synopsis
|
|
|
|
|
(format #f "Complete GCC tool chain for C/C++ development (~a)" target))
|
|
|
|
|
(description "This package provides a complete GCC cross toolchain for
|
|
|
|
|
C/C++ development to be installed in user profiles. This includes GCC, as
|
|
|
|
|
well as libc (headers and binariesl), and Binutils. GCC is the GNU Compiler
|
|
|
|
|
Collection.")
|
|
|
|
|
(license (delete-duplicates `(,(package-license xgcc)
|
|
|
|
|
,(package-license xbinutils)
|
|
|
|
|
,@(if libc
|
|
|
|
|
(list (package-license libc))
|
|
|
|
|
'()))))))
|
|
|
|
|
|
|
|
|
|
(define cross-gcc-toolchain
|
|
|
|
|
(memoize cross-gcc-toolchain/implementation))
|
|
|
|
|
|
2013-02-27 03:38:11 -05:00
|
|
|
|
|
2016-11-04 10:29:01 -04:00
|
|
|
|
;;; Concrete cross tool chains are instantiated like this:
|
|
|
|
|
;;
|
|
|
|
|
;; (define-public xgcc-armhf
|
|
|
|
|
;; (let ((triplet "arm-linux-gnueabihf"))
|
2013-02-27 03:38:11 -05:00
|
|
|
|
;; (cross-gcc triplet
|
2017-05-26 03:58:22 -04:00
|
|
|
|
;; #:xbinutils (cross-binutils triplet)
|
|
|
|
|
;; #:libc (cross-libc triplet))))
|
2016-11-04 10:29:01 -04:00
|
|
|
|
;;
|
|
|
|
|
;;; 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
|
|
|
|
|
;;; dependencies among modules.
|