2019-07-12 17:42:36 +02:00
|
|
|
(use-modules (gnu)
|
|
|
|
(gnu packages)
|
|
|
|
(gnu packages autotools)
|
|
|
|
(gnu packages base)
|
|
|
|
(gnu packages bash)
|
|
|
|
(gnu packages check)
|
|
|
|
(gnu packages commencement)
|
|
|
|
(gnu packages compression)
|
|
|
|
(gnu packages cross-base)
|
|
|
|
(gnu packages file)
|
|
|
|
(gnu packages gawk)
|
|
|
|
(gnu packages gcc)
|
|
|
|
(gnu packages linux)
|
|
|
|
(gnu packages perl)
|
|
|
|
(gnu packages pkg-config)
|
|
|
|
(gnu packages python)
|
|
|
|
(gnu packages shells)
|
|
|
|
(guix build-system trivial)
|
|
|
|
(guix gexp)
|
|
|
|
(guix packages)
|
|
|
|
(guix profiles)
|
|
|
|
(guix utils))
|
2019-07-12 06:28:29 +02:00
|
|
|
|
|
|
|
(define (make-ssp-fixed-gcc xgcc)
|
|
|
|
"Given a XGCC package, return a modified package that uses the SSP function
|
|
|
|
from glibc instead of from libssp.so. Taken from:
|
|
|
|
http://www.linuxfromscratch.org/hlfs/view/development/chapter05/gcc-pass1.html"
|
|
|
|
(package
|
|
|
|
(inherit xgcc)
|
|
|
|
(arguments
|
|
|
|
(substitute-keyword-arguments (package-arguments xgcc)
|
|
|
|
((#:make-flags flags)
|
|
|
|
`(cons "gcc_cv_libc_provides_ssp=yes" ,flags))))))
|
|
|
|
|
|
|
|
(define (make-gcc-rpath-link xgcc)
|
|
|
|
"Given a XGCC package, return a modified package that replace each instance of
|
|
|
|
-rpath in the default system spec that's inserted by Guix with -rpath-link"
|
|
|
|
(package
|
|
|
|
(inherit xgcc)
|
|
|
|
(arguments
|
|
|
|
(substitute-keyword-arguments (package-arguments xgcc)
|
|
|
|
((#:phases phases)
|
|
|
|
`(modify-phases ,phases
|
|
|
|
(add-after 'pre-configure 'replace-rpath-with-rpath-link
|
|
|
|
(lambda _
|
|
|
|
(substitute* (cons "gcc/config/rs6000/sysv4.h"
|
|
|
|
(find-files "gcc/config"
|
|
|
|
"^gnu-user.*\\.h$"))
|
|
|
|
(("-rpath=") "-rpath-link="))
|
|
|
|
#t))))))))
|
|
|
|
|
|
|
|
(define (make-cross-toolchain target
|
|
|
|
base-gcc-for-libc
|
|
|
|
base-kernel-headers
|
|
|
|
base-libc
|
|
|
|
base-gcc)
|
|
|
|
"Create a cross-compilation toolchain package for TARGET"
|
|
|
|
(let* ((xbinutils (cross-binutils target))
|
|
|
|
;; 1. Build a cross-compiling gcc without targeting any libc, derived
|
|
|
|
;; from BASE-GCC-FOR-LIBC
|
|
|
|
(xgcc-sans-libc (cross-gcc target
|
|
|
|
#:xgcc base-gcc-for-libc
|
|
|
|
#:xbinutils xbinutils))
|
|
|
|
;; 2. Build cross-compiled kernel headers with XGCC-SANS-LIBC, derived
|
|
|
|
;; from BASE-KERNEL-HEADERS
|
|
|
|
(xkernel (cross-kernel-headers target
|
|
|
|
base-kernel-headers
|
|
|
|
xgcc-sans-libc
|
|
|
|
xbinutils))
|
|
|
|
;; 3. Build a cross-compiled libc with XGCC-SANS-LIBC and XKERNEL,
|
|
|
|
;; derived from BASE-LIBC
|
|
|
|
(xlibc (cross-libc target
|
|
|
|
base-libc
|
|
|
|
xgcc-sans-libc
|
|
|
|
xbinutils
|
|
|
|
xkernel))
|
|
|
|
;; 4. Build a cross-compiling gcc targeting XLIBC, derived from
|
|
|
|
;; BASE-GCC
|
|
|
|
(xgcc (cross-gcc target
|
|
|
|
#:xgcc base-gcc
|
|
|
|
#:xbinutils xbinutils
|
|
|
|
#:libc xlibc)))
|
|
|
|
;; Define a meta-package that propagates the resulting XBINUTILS, XLIBC, and
|
|
|
|
;; XGCC
|
|
|
|
(package
|
|
|
|
(name (string-append target "-toolchain"))
|
|
|
|
(version (package-version xgcc))
|
|
|
|
(source #f)
|
|
|
|
(build-system trivial-build-system)
|
|
|
|
(arguments '(#:builder (begin (mkdir %output) #t)))
|
|
|
|
(propagated-inputs
|
|
|
|
`(("binutils" ,xbinutils)
|
|
|
|
("libc" ,xlibc)
|
|
|
|
("libc:static" ,xlibc "static")
|
|
|
|
("gcc" ,xgcc)))
|
|
|
|
(synopsis (string-append "Complete GCC tool chain for " target))
|
|
|
|
(description (string-append "This package provides a complete GCC tool
|
|
|
|
chain for " target " development."))
|
|
|
|
(home-page (package-home-page xgcc))
|
|
|
|
(license (package-license xgcc)))))
|
|
|
|
|
|
|
|
(define* (make-bitcoin-cross-toolchain target
|
2019-07-12 17:42:36 +02:00
|
|
|
#:key
|
2019-07-12 06:28:29 +02:00
|
|
|
(base-gcc-for-libc gcc-5)
|
|
|
|
(base-kernel-headers linux-libre-headers-4.19)
|
|
|
|
(base-libc glibc-2.27)
|
|
|
|
(base-gcc (make-gcc-rpath-link
|
|
|
|
(make-ssp-fixed-gcc gcc-9))))
|
|
|
|
"Convienience wrapper around MAKE-CROSS-TOOLCHAIN with default values
|
|
|
|
desirable for building Bitcoin Core release binaries."
|
|
|
|
(make-cross-toolchain target
|
|
|
|
base-gcc-for-libc
|
|
|
|
base-kernel-headers
|
|
|
|
base-libc
|
|
|
|
base-gcc))
|
|
|
|
|
|
|
|
(packages->manifest
|
|
|
|
(list ;; The Basics
|
2019-07-12 17:42:36 +02:00
|
|
|
bash-minimal
|
2019-07-12 06:28:29 +02:00
|
|
|
which
|
|
|
|
coreutils
|
|
|
|
util-linux
|
|
|
|
;; File(system) inspection
|
|
|
|
file
|
|
|
|
grep
|
|
|
|
diffutils
|
|
|
|
findutils
|
|
|
|
;; File transformation
|
|
|
|
patch
|
|
|
|
gawk
|
|
|
|
sed
|
|
|
|
;; Compression and archiving
|
|
|
|
tar
|
|
|
|
bzip2
|
|
|
|
gzip
|
|
|
|
xz
|
|
|
|
zlib
|
|
|
|
;; Build tools
|
|
|
|
gnu-make
|
|
|
|
libtool
|
|
|
|
autoconf
|
|
|
|
automake
|
|
|
|
pkg-config
|
|
|
|
;; Scripting
|
|
|
|
perl
|
2019-07-12 17:42:36 +02:00
|
|
|
python-3.7
|
|
|
|
;; Native gcc 9 toolchain targeting glibc 2.27
|
2019-07-12 06:28:29 +02:00
|
|
|
(make-gcc-toolchain gcc-9 glibc-2.27)
|
2019-07-12 17:42:36 +02:00
|
|
|
;; Cross gcc 9 toolchains targeting glibc 2.27
|
2019-07-12 06:28:29 +02:00
|
|
|
(make-bitcoin-cross-toolchain "i686-linux-gnu")
|
2019-07-12 17:42:36 +02:00
|
|
|
(make-bitcoin-cross-toolchain "x86_64-linux-gnu")
|
2019-07-12 06:28:29 +02:00
|
|
|
(make-bitcoin-cross-toolchain "aarch64-linux-gnu")
|
2019-07-12 17:42:36 +02:00
|
|
|
(make-bitcoin-cross-toolchain "arm-linux-gnueabihf")
|
|
|
|
;; The glibc 2.27 for riscv64 needs gcc 7 to successfully build (see:
|
|
|
|
;; https://www.gnu.org/software/gcc/gcc-7/changes.html#riscv). The final
|
|
|
|
;; toolchain is still a gcc 9 toolchain targeting glibc 2.27.
|
|
|
|
(make-bitcoin-cross-toolchain "riscv64-linux-gnu"
|
|
|
|
#:base-gcc-for-libc gcc-7)))
|