cross-compilation doesn't honor gcc native input

  • Open
  • quality assurance status badge
Details
3 participants
  • Ludovic Courtès
  • Maxim Cournoyer
  • zimoun
Owner
unassigned
Submitted by
Maxim Cournoyer
Severity
normal
Blocked by
M
M
Maxim Cournoyer wrote on 14 Dec 2022 03:16
(name . bug-guix)(address . bug-guix@gnu.org)
87h6xy4tmz.fsf@gmail.com
Hello Guix,

I've recently noticed that cross-compiling with a different GCC was not
possible by simply adding them as native inputs the same way we can
already do when compiling natively.

Here's an example in our package collection that fails to cross-compile
for that reason:

Toggle snippet (35 lines)
$ guix build --target=arm-linux-gnueabihf --no-offload glibc@2.30

[...]

arm-linux-gnueabihf-gcc ../sysdeps/arm/aeabi_lcsts.c -c -std=gnu11 -fgnu89-inline -g -O2 -Wall -Wwrite-strings -Wundef -Werror -fmerge-all-constants -frounding-math -fno-stack-protector -Wstrict-prototypes -Wold-style-definition -fmath-errno -fno-stack-protector -DSTACK_PROTECTOR_LEVEL=0 -ftls-model=initial-exec -I../include -I/tmp/guix-build-glibc-2.30.drv-0/build/csu -I/tmp/guix-build-glibc-2.30.drv-0/build -I../sysdeps/unix/sysv/linux/arm -I../sysdeps/arm/nptl -I../sysdeps/unix/sysv/linux/include -I../sysdeps/unix/sysv/linux -I../sysdeps/nptl -I../sysdeps/pthread -I../sysdeps/gnu -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/arm -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/arm/armv7/multiarch -I../sysdeps/arm/armv7 -I../sysdeps/arm/armv6t2 -I../sysdeps/arm/armv6 -I../sysdeps/arm/include -I../sysdeps/arm -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic -I.. -I../libio -I. -nostdinc -isystem /gnu/store/qxiyl966akwfj44vkswams3db61r45m7-gcc-cross-arm-linux-gnueabihf-10.3.0-lib/lib/gcc/arm-linux-gnueabihf/10.3.0/include -isystem /gnu/store/qxiyl966akwfj44vkswams3db61r45m7-gcc-cross-arm-linux-gnueabihf-10.3.0-lib/lib/gcc/arm-linux-gnueabihf/10.3.0/include-fixed -isystem /gnu/store/k4lzn762cpwwznxc2gvcyidfjnx3yw7b-linux-libre-headers-5.10.35/include -D_LIBC_REENTRANT -include /tmp/guix-build-glibc-2.30.drv-0/build/libc-modules.h -DMODULE_NAME=libc -include ../include/libc-symbols.h -DTOP_NAMESPACE=glibc -o /tmp/guix-build-glibc-2.30.drv-0/build/csu/aeabi_lcsts.o -MD -MP -MF /tmp/guix-build-glibc-2.30.drv-0/build/csu/aeabi_lcsts.o.dt -MT /tmp/guix-build-glibc-2.30.drv-0/build/csu/aeabi_lcsts.o
In file included from ../sysdeps/arm/libc-tls.c:19:
../csu/libc-tls.c: In function ‘__libc_setup_tls’:
../csu/libc-tls.c:209:30: error: array subscript 1 is outside the bounds of an interior zero-length array ‘struct dtv_slotinfo[0]’ [-Werror=zero-length-bounds]
209 | static_slotinfo.si.slotinfo[1].map = main_map;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
In file included from ../sysdeps/arm/ldsodefs.h:38,
from ../sysdeps/gnu/ldsodefs.h:46,
from ../sysdeps/unix/sysv/linux/ldsodefs.h:25,
from ../sysdeps/unix/sysv/linux/arm/ldsodefs.h:22,
from ../csu/libc-tls.c:21,
from ../sysdeps/arm/libc-tls.c:19:
../sysdeps/generic/ldsodefs.h:406:7: note: while referencing ‘slotinfo’
406 | } slotinfo[0];
| ^~~~~~~~
arm-linux-gnueabihf-gcc ../sysdeps/arm/aeabi_sighandlers.S -c -I../include -I/tmp/guix-build-glibc-2.30.drv-0/build/csu -I/tmp/guix-build-glibc-2.30.drv-0/build -I../sysdeps/unix/sysv/linux/arm -I../sysdeps/arm/nptl -I../sysdeps/unix/sysv/linux/include -I../sysdeps/unix/sysv/linux -I../sysdeps/nptl -I../sysdeps/pthread -I../sysdeps/gnu -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/arm -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/arm/armv7/multiarch -I../sysdeps/arm/armv7 -I../sysdeps/arm/armv6t2 -I../sysdeps/arm/armv6 -I../sysdeps/arm/include -I../sysdeps/arm -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic -I.. -I../libio -I. -nostdinc -isystem /gnu/store/qxiyl966akwfj44vkswams3db61r45m7-gcc-cross-arm-linux-gnueabihf-10.3.0-lib/lib/gcc/arm-linux-gnueabihf/10.3.0/include -isystem /gnu/store/qxiyl966akwfj44vkswams3db61r45m7-gcc-cross-arm-linux-gnueabihf-10.3.0-lib/lib/gcc/arm-linux-gnueabihf/10.3.0/include-fixed -isystem /gnu/store/k4lzn762cpwwznxc2gvcyidfjnx3yw7b-linux-libre-headers-5.10.35/include -D_LIBC_REENTRANT -include /tmp/guix-build-glibc-2.30.drv-0/build/libc-modules.h -DMODULE_NAME=libc -include ../include/libc-symbols.h -DTOP_NAMESPACE=glibc -DASSEMBLER -I/tmp/guix-build-glibc-2.30.drv-0/build/csu/. -g -Werror=undef -Wa,--noexecstack -o /tmp/guix-build-glibc-2.30.drv-0/build/csu/aeabi_sighandlers.o -MD -MP -MF /tmp/guix-build-glibc-2.30.drv-0/build/csu/aeabi_sighandlers.o.dt -MT /tmp/guix-build-glibc-2.30.drv-0/build/csu/aeabi_sighandlers.o
cc1: all warnings being treated as errors
make[2]: *** [/tmp/guix-build-glibc-2.30.drv-0/build/sysd-rules:519: /tmp/guix-build-glibc-2.30.drv-0/build/csu/libc-tls.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory '/tmp/guix-build-glibc-2.30.drv-0/glibc-2.30/csu'
make[1]: *** [Makefile:259: csu/subdir_lib] Error 2
make[1]: Leaving directory '/tmp/guix-build-glibc-2.30.drv-0/glibc-2.30'
make: *** [Makefile:9: all] Error 2
error: in phase 'build': uncaught exception:
%exception #<&invoke-error program: "make" arguments: ("-j" "4") exit-status: 2 term-signal: #f stop-signal: #f>
phase `build' failed after 8.5 seconds
command "make" "-j" "4" failed with status 2
builder for `/gnu/store/cpabyq7ly2sf1jxxbn8srbqkd9chz9w1-glibc-2.30.drv' failed with exit code 1
build of /gnu/store/cpabyq7ly2sf1jxxbn8srbqkd9chz9w1-glibc-2.30.drv failed

--
Thanks,
Maxim
M
M
Maxim Cournoyer wrote on 14 Dec 2022 21:34
control message for bug #60056
(address . control@debbugs.gnu.org)
87edt13est.fsf@gmail.com
block 60056 by 59885
quit
M
M
Maxim Cournoyer wrote on 15 Dec 2022 04:23
[PATCH RFC 1/6] build: Add gnu-build-system v2.
(address . 60056@debbugs.gnu.org)(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
20221215032328.3368-1-maxim.cournoyer@gmail.com
* guix/build/gnu-build-system2.scm: New file.
* Makefile.am (MODULES): Register it.
* guix/build-system/gnu2.scm: Use it.
---
Makefile.am | 2 +
guix/build-system/gnu2.scm | 580 +++++++++++++++++++
guix/build/gnu-build-system2.scm | 937 +++++++++++++++++++++++++++++++
3 files changed, 1519 insertions(+)
create mode 100644 guix/build-system/gnu2.scm
create mode 100644 guix/build/gnu-build-system2.scm

Toggle diff (455 lines)
diff --git a/Makefile.am b/Makefile.am
index b54288c0fc..a331385aa1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -159,6 +159,7 @@ MODULES = \
guix/build-system/copy.scm \
guix/build-system/glib-or-gtk.scm \
guix/build-system/gnu.scm \
+ guix/build-system/gnu2.scm \
guix/build-system/guile.scm \
guix/build-system/haskell.scm \
guix/build-system/julia.scm \
@@ -217,6 +218,7 @@ MODULES = \
guix/build/glib-or-gtk-build-system.scm \
guix/build/gnu-bootstrap.scm \
guix/build/gnu-build-system.scm \
+ guix/build/gnu-build-system2.scm \
guix/build/gnu-dist.scm \
guix/build/guile-build-system.scm \
guix/build/maven-build-system.scm \
diff --git a/guix/build-system/gnu2.scm b/guix/build-system/gnu2.scm
new file mode 100644
index 0000000000..95fce76714
--- /dev/null
+++ b/guix/build-system/gnu2.scm
@@ -0,0 +1,580 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2012-2022 Ludovic Courtès <ludo@gnu.org>
+;;;
+;;; 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 (guix build-system gnu2)
+ #:use-module (guix store)
+ #:use-module (guix utils)
+ #:use-module (guix memoization)
+ #:use-module (guix gexp)
+ #:use-module (guix monads)
+ #:use-module (guix derivations)
+ #:use-module (guix search-paths)
+ #:use-module (guix build-system)
+ #:use-module (guix packages)
+ #:use-module (srfi srfi-1)
+ #:use-module (ice-9 match)
+ #:export (%gnu-build-system-modules2
+ gnu-build2
+ gnu-build-system2
+ standard-packages2
+ standard-cross-packages2
+ package-with-explicit-inputs2
+ package-with-extra-configure-variable2
+ static-libgcc-package2
+ static-package2
+ dist-package2
+ package-with-restricted-references2))
+
+;; Commentary:
+;;
+;; Standard build procedure for packages using the GNU Build System or
+;; something compatible ("./configure && make && make install").
+;;
+;; Code:
+
+(define %gnu-build-system-modules2
+ ;; Build-side modules imported and used by default.
+ '((guix build gnu-build-system2)
+ (guix build utils)
+ (guix build gremlin)
+ (guix elf)))
+
+(define %default-modules
+ ;; Modules in scope in the build-side environment.
+ '((guix build gnu-build-system2)
+ (guix build utils)))
+
+(define* (package-with-explicit-inputs/deprecated p inputs
+ #:optional
+ (loc (current-source-location))
+ #:key (native-inputs '())
+ guile)
+ "This variant is deprecated because it is inefficient: it memoizes only
+temporarily instead of memoizing across all transformations where INPUTS is
+the same.
+
+Rewrite P, which is assumed to use GNU-BUILD-SYSTEM2, to take INPUTS and
+NATIVE-INPUTS as explicit inputs instead of the implicit default, and return
+it. INPUTS and NATIVE-INPUTS can be either input lists or thunks; in the
+latter case, they will be called in a context where the `%current-system' and
+`%current-target-system' are suitably parametrized. Use GUILE to run the
+builder, or the distro's final Guile when GUILE is #f."
+ (define inputs* inputs)
+ (define native-inputs* native-inputs)
+
+ (define (call inputs)
+ (if (procedure? inputs)
+ (inputs)
+ inputs))
+
+ (define (duplicate-filter inputs)
+ (let ((names (match (call inputs)
+ (((name _ ...) ...)
+ name))))
+ (lambda (inputs)
+ (fold alist-delete inputs names))))
+
+ (let loop ((p p))
+ (define rewritten-input
+ (mlambda (input)
+ (match input
+ ((name (? package? p) sub-drv ...)
+ ;; XXX: Check whether P's build system knows #:implicit-inputs, for
+ ;; things like `cross-pkg-config'.
+ (if (eq? (package-build-system p) gnu-build-system2)
+ (cons* name (loop p) sub-drv)
+ (cons* name p sub-drv)))
+ (x x))))
+
+ (package (inherit p)
+ (location (if (pair? loc) (source-properties->location loc) loc))
+ (arguments
+ ;; 'ensure-keyword-arguments' guarantees that this procedure is
+ ;; idempotent.
+ (ensure-keyword-arguments (package-arguments p)
+ `(#:guile ,guile
+ #:implicit-inputs? #f)))
+ (replacement
+ (let ((replacement (package-replacement p)))
+ (and replacement
+ (package-with-explicit-inputs2 replacement inputs loc
+ #:native-inputs
+ native-inputs
+ #:guile guile))))
+ (native-inputs
+ (let ((filtered (duplicate-filter native-inputs*)))
+ `(,@(call native-inputs*)
+ ,@(map rewritten-input
+ (filtered (package-native-inputs p))))))
+ (propagated-inputs
+ (map rewritten-input
+ (package-propagated-inputs p)))
+ (inputs
+ (let ((filtered (duplicate-filter inputs*)))
+ `(,@(call inputs*)
+ ,@(map rewritten-input
+ (filtered (package-inputs p)))))))))
+
+(define* (package-with-explicit-inputs* inputs #:optional guile)
+ "Return a procedure that rewrites the given package and all its dependencies
+so that they use INPUTS (a thunk) instead of implicit inputs."
+ (define (duplicate-filter package-inputs)
+ (let ((names (match (inputs)
+ (((name _ ...) ...)
+ name))))
+ (fold alist-delete package-inputs names)))
+
+ (define (add-explicit-inputs p)
+ (if (and (eq? (package-build-system p) gnu-build-system2)
+ (not (memq #:implicit-inputs? (package-arguments p))))
+ (package
+ (inherit p)
+ (inputs (append (inputs)
+ (duplicate-filter (package-inputs p))))
+ (arguments
+ (ensure-keyword-arguments (package-arguments p)
+ `(#:implicit-inputs? #f
+ #:guile ,guile))))
+ p))
+
+ (define (cut? p)
+ (or (not (eq? (package-build-system p) gnu-build-system2))
+ (memq #:implicit-inputs? (package-arguments p))))
+
+ (package-mapping add-explicit-inputs cut?))
+
+(define package-with-explicit-inputs2
+ (case-lambda*
+ ((inputs #:optional guile)
+ (package-with-explicit-inputs* inputs guile))
+ ((p inputs #:optional (loc (current-source-location))
+ #:key (native-inputs '()) guile)
+ ;; deprecated
+ (package-with-explicit-inputs/deprecated p inputs
+ loc
+ #:native-inputs
+ native-inputs
+ #:guile guile))))
+
+(define (package-with-extra-configure-variable2 p variable value)
+ "Return a version of P with VARIABLE=VALUE specified as an extra `configure'
+flag, recursively. An example is LDFLAGS=-static. If P already has configure
+flags for VARIABLE, the associated value is augmented."
+ (let loop ((p p))
+ (define (rewritten-inputs inputs)
+ (map (match-lambda
+ ((name (? package? p) sub ...)
+ `(,name ,(loop p) ,@sub))
+ (input input))
+ inputs))
+
+ (package (inherit p)
+ (arguments
+ (let ((args (package-arguments p)))
+ (substitute-keyword-arguments args
+ ((#:configure-flags flags)
+ (let* ((var= (string-append variable "="))
+ (len (string-length var=)))
+ `(cons ,(string-append var= value)
+ (map (lambda (flag)
+ (if (string-prefix? ,var= flag)
+ (string-append
+ ,(string-append var= value " ")
+ (substring flag ,len))
+ flag))
+ ,flags)))))))
+ (replacement
+ (let ((replacement (package-replacement p)))
+ (and replacement
+ (package-with-extra-configure-variable2 replacement
+ variable value))))
+ (inputs (rewritten-inputs (package-inputs p)))
+ (propagated-inputs (rewritten-inputs (package-propagated-inputs p))))))
+
+(define (static-libgcc-package2 p)
+ "A version of P linked with `-static-gcc'."
+ (package-with-extra-configure-variable2 p "LDFLAGS" "-static-libgcc"))
+
+(define* (static-package2 p #:key (strip-all? #t))
+ "Return a statically-linked version of package P. If STRIP-ALL? is true,
+use `--strip-all' as the arguments to `strip'."
+ (package (inherit p)
+ (arguments
+ (let ((a (default-keyword-arguments (package-arguments p)
+ '(#:configure-flags '()
+ #:strip-flags '("--strip-unneeded")))))
+ (substitute-keyword-arguments a
+ ((#:configure-flags flags)
+ `(cons* "--disable-shared" "LDFLAGS=-static" ,flags))
+ ((#:strip-flags flags)
+ (if strip-all?
+ ''("--strip-all")
+ flags)))))
+ (replacement (and=> (package-replacement p) static-package2))))
+
+(define* (dist-package2 p source #:key (phases '%dist-phases))
+ "Return a package that takes source files from the SOURCE directory,
+runs `make distcheck' and whose result is one or more source tarballs. The
+exact build phases are defined by PHASES."
+ (let ((s source))
+ (package (inherit p)
+ (name (string-append (package-name p) "-dist"))
+ (source s)
+ (arguments
+ ;; Use the right phases and modules.
+ (substitute-keyword-arguments (package-arguments p)
+ ((#:modules modules %default-modules)
+ `((guix build gnu-dist)
+ ,@modules))
+ ((#:imported-modules modules %gnu-build-system-modules2)
+ `((guix build gnu-dist)
+ ,@modules))
+ ((#:phases _ #f)
+ phases)))
+ (native-inputs
+ ;; Add autotools & co. as inputs.
+ (let ((ref (lambda (module var)
+ (module-ref (resolve-interface module) var))))
+ `(,@(package-native-inputs p)
+ ("autoconf" ,(ref '(gnu packages autotools) 'autoconf-wrapper))
+ ("automake" ,(ref '(gnu packages autotools) 'automake))
+ ("libtool" ,(ref '(gnu packages autotools) 'libtool))
+ ("gettext" ,(ref '(gnu packages gettext) 'gnu-gettext))
+ ("texinfo" ,(ref '(gnu packages texinfo) 'texinfo))))))))
+
+(define (package-with-restricted-references2 p refs)
+ "Return a package whose outputs are guaranteed to only refer to the packages
+listed in REFS."
+ (if (eq? (package-build-system p) gnu-build-system2) ; XXX: dirty
+ (package (inherit p)
+ (arguments `(#:allowed-references ,refs
+ ,@(package-arguments p))))
+ p))
+
+
+(define (standard-packages2)
+ "Return the list of (NAME PACKAGE OUTPUT) or (NAME PACKAGE) tuples of
+standard packages used as implicit inputs of the gnu-build-system2."
+
+ ;; Resolve (gnu packages commencement) lazily to hide circular dependency.
+ (let ((distro (resolve-module '(gnu packages commencement))))
+ (module-ref distro '%final-inputs)))
+
+(define* (lower name
+ #:key source inputs native-inputs outputs target
+ (implicit-inputs? #t) (implicit-cross-inputs? #t)
+ (strip-binaries? #t) system
+ #:allow-other-keys
+ #:rest arguments)
+ "Return a bag for NAME from the given arguments."
+ (define private-keywords
+ `(#:inputs #:native-inputs #:outputs
+ #:implicit-inputs? #:implicit-cross-inputs?
+ ,@(if target '() '(#:target))))
+
+ (bag
+ (name name)
+ (system system) (target target)
+ (build-inputs `(,@(if source
+ `(("source" ,source))
+ '())
+ ,@native-inputs
+
+ ;; When not cross-compiling, ensure implicit inputs come
+ ;; last. That way, libc headers come last, which allows
+ ;; #include_next to work correctly; see
+ ;; <https://bugs.gnu.org/30756>.
+ ,@(if target '() inputs)
+ ,@(if (and target implicit-cross-inputs?)
+ (standard-cross-packages2 target 'host)
+ '())
+ ,@(if implicit-inputs?
+ (standard-packages2)
+ '())))
+ (host-inputs (if target inputs '()))
+
+ ;; The cross-libc is really a target package, but for bootstrapping
+ ;; reasons, we can't put it in 'host-inputs'. Namely, 'cross-gcc' is a
+ ;; native package, so it would end up using a "native" variant of
+ ;; 'cross-libc' (built with 'gnu-build'), whereas all the other packages
+ ;; would use a target variant (built with 'gnu-cross-build'.)
+ (target-inputs (if (and target implicit-cross-inputs?)
+ (standard-cross-packages2 target 'target)
+ '()))
+ (outputs (if strip-binaries?
+ outputs
+ (delete "debug" outputs)))
+ (build (if target gnu-cross-build gnu-build2))
+ (arguments (strip-keyword-arguments private-keywords arguments))))
+
+(define %license-file-regexp
+ ;; Regexp matching license files.
+ "^(COPYING.*|LICEN[CS]E.*|[Ll]icen[cs]e.*|Copy[Rr]ight(\\.(txt|md))?)$")
+
+(define %bootstrap-scripts
+ ;; Typical names of Autotools "bootstrap" scripts.
+ #~%bootstrap-scripts)
+
+(define %strip-flags
+ #~'("--strip-unneeded" "--enable-deterministic-archives"))
+
+(define %strip-directories
+ #~'("lib" "lib64" "libexec" "bin" "sbin"))
+
+(define* (gnu-build2 name inputs
+ #:key
+ guile source
+ (outputs '("out"))
+ (search-paths '())
+ (bootstrap-scripts %bootstrap-scripts)
+ (configure-flags ''())
+ (make-flags ''())
+ (out-of-source? #f)
+ (tests? #t)
+ (test-target "check")
+ (parallel-build? #t)
+ (parallel-tests? #t)
+ (patch-shebangs? #t)
+ (strip-binaries? #t)
+ (strip-flags %strip-flags)
+ (strip-directories %strip-directories)
+ (validate-runpath? #t)
+ (make-dynamic-linker-cache? #t)
+ (license-file-regexp %license-file-regexp)
+ (phases '%standard-phases)
+ (locale "en_US.utf8")
+ (system (%current-system))
+ (build (nix-system->gnu-triplet system))
+ (imported-modules %gnu-build-system-modules2)
+ (modules %default-modules)
+ (substitutable? #t)
+ allowed-references
+ disallowed-references)
+ "Return a derivation called NAME that builds from tarball SOURCE, with
+input derivation INPUTS, using the usual procedure of the GNU Build
+System. The builder is run with GUILE, or with the distro's final Guile
+package if GUILE is #f or omitted.
+
+The builder is run in a context where MODULES are used; IMPORTED-MODULES
+specifies modules not provided by Guile itself that must be imported in
+the builder's environment, from the host. Note that we distinguish
+between both, because for Guile's own modules like (ice-9 foo), we want
+to use GUILE's own version of it, rather than import the user's one,
+which could lead to gratuitous input divergence.
+
+SUBSTITUTABLE? determines whether users may be able to use substitutes of the
+returned derivations, or whether they should always build it locally.
+
+ALLOWED-REFERENCES can be either #f, or a list of packages that the outputs
+are allowed to refer to."
+ (define builder
+ (with-imported-modules imported-modules
+ #~(begin
+ (use-modules #$@(sexp->gexp modules))
+
+ #$(with-build-variables inputs outputs
+ #~(gnu-build2 #:source #+source
+ #:system #$system
+ #:build #$build
+ #:outputs %outputs
+ #:inputs %build-inputs
+ #:search-paths '#$(sexp->gexp
+ (map search-path-specification->sexp
+ search-paths))
+ #:phases #$(if (pair? phases)
+ (sexp->gexp phases)
+ phases)
+ #:locale #$locale
+ #:bootstrap-scripts #$bootstrap-scripts
+ #:configure-flags #$(if (pair? configure-flags)
+ (sexp->gexp configure-flags)
+ configure-flags)
+ #:make-flags #$(if (pair? make-flags)
+ (sexp->gexp make-flags)
+ make-flags)
+ #:out-of-source? #$out-of-source?
+ #:tests? #$tests?
+ #:test-target #$test-target
+ #:parallel-build? #$parallel-build?
+ #:parallel-tests? #$parallel-tests?
+ #:patch-shebangs? #$patch-shebangs?
+ #:license-file-regexp #$license-file-regexp
+ #:strip-binaries? #$strip-binaries?
+ #:validate-runpath? #$validate-runpath?
+ #:make-dynamic-linker-cache? #$make-dynamic-linker-cache?
+ #:license-file-regexp #$license-file-regexp
+ #:strip-flags #$strip-flags
+ #:strip-directories #$strip-directories)))))
+
+ (mlet %store-monad ((guile (package->derivation (or guile (default-guile))
+ system #:graft? #f)))
+ ;; Note: Always pass #:graft? #f. Without it, ALLOWED-REFERENCES &
+ ;; co. would be interpreted as referring to grafted packages.
+ (gexp->derivation name builder
+ #:system syste
This message was truncated. Download the full message here.
M
M
Maxim Cournoyer wrote on 15 Dec 2022 04:23
[PATCH RFC 2/6] build: gnu-build-system2: Remove source from native inputs.
(address . 60056@debbugs.gnu.org)(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
20221215032328.3368-2-maxim.cournoyer@gmail.com
Fixes https://issues.guix.gnu.org/44924, in a cross-compilation context.

Having the source in inputs when computing search paths can break builds. One
example is a git checkout of the Linux source tree, where the source (a
directory) 'include' subdirectory gets picked up in C_INCLUDE_PATH and causes
conflicts with the includes provided by glibc.

* guix/build/gnu-build-system2.scm (set-paths): Remove any "source" native
input.
---
guix/build/gnu-build-system2.scm | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

Toggle diff (21 lines)
diff --git a/guix/build/gnu-build-system2.scm b/guix/build/gnu-build-system2.scm
index 54129549c2..1766f9d474 100644
--- a/guix/build/gnu-build-system2.scm
+++ b/guix/build/gnu-build-system2.scm
@@ -83,10 +83,12 @@ (define input-directories
dir)))
(define native-input-directories
- (match native-inputs
+ ;; When cross-compiling, the source appears in native-inputs rather than
+ ;; inputs.
+ (match (and=> native-inputs (cut alist-delete "source" <>))
(((_ . dir) ...)
dir)
- (#f ; not cross compiling
+ (#f ;not cross-compiling
'())))
;; Tell 'ld-wrapper' to disallow non-store libraries.
--
2.38.1
M
M
Maxim Cournoyer wrote on 15 Dec 2022 04:23
[PATCH RFC 3/6] build-systems: gnu: Infer cross-toolchain from native-inputs components.
(address . 60056@debbugs.gnu.org)(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
20221215032328.3368-3-maxim.cournoyer@gmail.com
This enables a user to override the base components used to build the cross
toolchain, which allows for example to use an older version of GCC.

* guix/build-system/gnu.scm (standard-cross-packages): New GCC, BINUTILS,
LIBC and LINUX-LIBRE-HEADERS keyword arguments. Update doc. Rename
implementation to...
(%standard-cross-packages): ... this procedure, which is extended to support
the above new arguments. Compute the cross toolchain components taking these
arguments into account.
(lower): Apply the GCC, BINUTILS, LIBC, and LINUX-LIBRE-HEADERS packages found
in the native inputs to standard-cross-packages, when available.
---
guix/build-system/gnu2.scm | 111 +++++++++++++++++++++++++++----------
1 file changed, 83 insertions(+), 28 deletions(-)

Toggle diff (158 lines)
diff --git a/guix/build-system/gnu2.scm b/guix/build-system/gnu2.scm
index 95fce76714..5b0780d315 100644
--- a/guix/build-system/gnu2.scm
+++ b/guix/build-system/gnu2.scm
@@ -68,7 +68,7 @@ (define* (package-with-explicit-inputs/deprecated p inputs
temporarily instead of memoizing across all transformations where INPUTS is
the same.
-Rewrite P, which is assumed to use GNU-BUILD-SYSTEM2, to take INPUTS and
+Rewrite P, which is assumed to use GNU-BUILD-SYSTEM, to take INPUTS and
NATIVE-INPUTS as explicit inputs instead of the implicit default, and return
it. INPUTS and NATIVE-INPUTS can be either input lists or thunks; in the
latter case, they will be called in a context where the `%current-system' and
@@ -287,9 +287,21 @@ (define private-keywords
#:implicit-inputs? #:implicit-cross-inputs?
,@(if target '() '(#:target))))
+ (define standard-cross-packages-args
+ ;; Since the packages used to customize the toolchain are intended to be
+ ;; provided manually at the package level, their actual package *name*
+ ;; must be expected, e.g. "glibc" rather than "libc".
+ (list #:gcc (and=> (assoc-ref native-inputs "gcc") car)
+ #:binutils (and=> (assoc-ref native-inputs "binutils") car)
+ #:libc (and=> (assoc-ref native-inputs "glibc") car)
+ #:linux-libre-headers
+ (and=> (assoc-ref native-inputs
+ "linux-libre-headers") car)))
+
(bag
(name name)
- (system system) (target target)
+ (system system)
+ (target target)
(build-inputs `(,@(if source
`(("source" ,source))
'())
@@ -301,7 +313,8 @@ (define private-keywords
;; <https://bugs.gnu.org/30756>.
,@(if target '() inputs)
,@(if (and target implicit-cross-inputs?)
- (standard-cross-packages2 target 'host)
+ (apply standard-cross-packages2
+ target 'host standard-cross-packages-args)
'())
,@(if implicit-inputs?
(standard-packages2)
@@ -314,7 +327,8 @@ (define private-keywords
;; 'cross-libc' (built with 'gnu-build'), whereas all the other packages
;; would use a target variant (built with 'gnu-cross-build'.)
(target-inputs (if (and target implicit-cross-inputs?)
- (standard-cross-packages2 target 'target)
+ (apply standard-cross-packages2
+ target 'target standard-cross-packages-args)
'()))
(outputs (if strip-binaries?
outputs
@@ -439,34 +453,75 @@ (define builder
;;; Cross-compilation.
;;;
-(define standard-cross-packages2
- (mlambda (target kind)
- "Return the list of name/package tuples to cross-build for TARGET. KIND
-is one of `host' or `target'."
- (let* ((cross (resolve-interface '(gnu packages cross-base)))
- (gcc (module-ref cross 'cross-gcc))
- (binutils (module-ref cross 'cross-binutils))
- (libc (module-ref cross 'cross-libc)))
+(define* (standard-cross-packages2 target kind
+ #:key gcc binutils libc linux-libre-headers)
+ "Return the list of name/package tuples to cross-build for TARGET. KIND is
+one of `host' or `target'. GCC, BINUTILS, LIBC and LINUX-LIBRE-HEADERS are
+the packages to use to build the cross toolchain. Unless specified, the
+defaults of the CROSS-GCC, CROSS-BINUTILS, CROSS-LIBC and CROSS-KERNEL-HEADERS
+procedures from (gnu packages cross-base) are used."
+ (%standard-cross-packages2 target kind gcc binutils libc linux-libre-headers))
+
+(define %standard-cross-packages2
+ (mlambda (target kind gcc binutils libc linux-libre-headers)
+ (let* ((cross-base (resolve-interface '(gnu packages cross-base)))
+ (cross-gcc (module-ref cross-base 'cross-gcc))
+ (cross-binutils (module-ref cross-base 'cross-binutils))
+ (cross-libc (module-ref cross-base 'cross-libc))
+ (cross-kernel-headers (module-ref cross-base 'cross-kernel-headers))
+ (xbinutils (if binutils
+ (cross-binutils target #:binutils binutils)
+ (cross-binutils target)))
+ (cross-gcc-args/no-libc `(,target
+ ,@(if gcc
+ `(#:xgcc ,gcc)
+ '())
+ ,@(if binutils
+ `(#:xbinutils ,xbinutils)
+ '())))
+ (xgcc/no-libc (apply cross-gcc cross-gcc-args/no-libc))
+ (cross-libc-args `(,target
+ ,@(if libc
+ `(#:libc ,libc)
+ '())
+ ,@(if gcc
+ `(#:xgcc ,xgcc/no-libc)
+ '())
+ ,@(if binutils
+ `(#:xbinutils ,xbinutils)
+ '())
+ ,@(if linux-libre-headers
+ `(#:xheaders
+ ,(apply cross-kernel-headers
+ `(,target
+ ,@(if linux-libre-headers
+ `(#:linux-headers
+ ,linux-libre-headers))
+ ,@(if gcc
+ `(#:xgcc ,xgcc/no-libc)
+ '())
+ ,@(if binutils
+ `(#:xbinutils ,xbinutils)
+ '()))))
+ '())))
+ (xlibc (apply cross-libc cross-libc-args))
+ (xgcc (apply cross-gcc
+ `(,@cross-gcc-args/no-libc #:libc ,xlibc))))
(case kind
((host)
;; Cross-GCC appears once here, so that it's in $PATH...
- `(("cross-gcc" ,(gcc target
- #:xbinutils (binutils target)
- #:libc (libc target)))
- ("cross-binutils" ,(binutils target))))
+ `(("cross-gcc" ,xgcc)
+ ("cross-binutils" ,xbinutils)))
((target)
- (let ((libc (libc target)))
- ;; ... and once here, so that libstdc++ & co. are in
- ;; CROSS_CPLUS_INCLUDE_PATH, etc.
- `(("cross-gcc" ,(gcc target
- #:xbinutils (binutils target)
- #:libc libc))
- ("cross-libc" ,libc)
-
- ;; MinGW's libc doesn't have a "static" output.
- ,@(if (member "static" (package-outputs libc))
- `(("cross-libc:static" ,libc "static"))
- '()))))))))
+ ;; ... and once here, so that libstdc++ & co. are in
+ ;; CROSS_CPLUS_INCLUDE_PATH, etc.
+ `(("cross-gcc" ,xgcc)
+ ("cross-libc" ,xlibc)
+
+ ;; MinGW's libc doesn't have a "static" output.
+ ,@(if (member "static" (package-outputs xlibc))
+ `(("cross-libc:static" ,xlibc "static"))
+ '())))))))
(define* (gnu-cross-build name
#:key
--
2.38.1
M
M
Maxim Cournoyer wrote on 15 Dec 2022 04:23
[PATCH RFC 4/6] gnu: glibc-2.30: Use gnu-build-system2 to fix cross-compiled build.
(address . 60056@debbugs.gnu.org)(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
20221215032328.3368-4-maxim.cournoyer@gmail.com
* gnu/packages/base.scm (glibc-2.30) [build-system]: Use gnu-build-system2.
---
gnu/packages/base.scm | 2 ++
1 file changed, 2 insertions(+)

Toggle diff (22 lines)
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index 36b27a4e25..b8b0ea241f 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -67,6 +67,7 @@ (define-module (gnu packages base)
#:use-module (guix download)
#:use-module (guix git-download)
#:use-module (guix build-system gnu)
+ #:use-module ((guix build-system gnu2) #:select (gnu-build-system2))
#:use-module (guix build-system trivial)
#:use-module (ice-9 format)
#:use-module (ice-9 match)
@@ -1083,6 +1084,7 @@ (define-public glibc-2.30
(package
(inherit glibc-2.31)
(version "2.30")
+ (build-system gnu-build-system2)
(native-inputs
;; This fails with a build error in libc-tls.c when using GCC 10. Use an
;; older compiler.
--
2.38.1
M
M
Maxim Cournoyer wrote on 15 Dec 2022 04:23
[PATCH RFC 5/6] gnu: make-linux-libre*: Use gnu-build-system2 to fix cross compilation.
(address . 60056@debbugs.gnu.org)(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
20221215032328.3368-5-maxim.cournoyer@gmail.com
* gnu/packages/linux.scm (make-linux-libre*): Use gnu-build-system2.
---
gnu/packages/linux.scm | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

Toggle diff (27 lines)
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index e0129ac9de..f80c9d26d7 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -174,6 +174,7 @@ (define-module (gnu packages linux)
#:use-module (guix build-system cmake)
#:use-module (guix build-system copy)
#:use-module (guix build-system gnu)
+ #:use-module (guix build-system gnu2)
#:use-module (guix build-system go)
#:use-module (guix build-system meson)
#:use-module (guix build-system python)
@@ -929,10 +930,10 @@ (define* (make-linux-libre* version gnu-revision source supported-systems
(version version)
(source source)
(supported-systems supported-systems)
- (build-system gnu-build-system)
+ (build-system gnu-build-system2)
(arguments
(list
- #:modules '((guix build gnu-build-system)
+ #:modules '((guix build gnu-build-system2)
(guix build utils)
(srfi srfi-1)
(srfi srfi-26)
--
2.38.1
M
M
Maxim Cournoyer wrote on 15 Dec 2022 04:23
[PATCH RFC 6/6] gnu: u-boot: Fix cross-compilation by using gnu-build-system2.
(address . 60056@debbugs.gnu.org)(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
20221215032328.3368-6-maxim.cournoyer@gmail.com
* gnu/packages/bootloaders.scm (make-u-boot-package) [build-system]: Use
gnu-build-system2.
---
gnu/packages/bootloaders.scm | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

Toggle diff (36 lines)
diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm
index 32625bb799..f4c1cb729c 100644
--- a/gnu/packages/bootloaders.scm
+++ b/gnu/packages/bootloaders.scm
@@ -69,6 +69,7 @@ (define-module (gnu packages bootloaders)
#:use-module (gnu packages virtualization)
#:use-module (gnu packages xorg)
#:use-module (guix build-system gnu)
+ #:use-module (guix build-system gnu2)
#:use-module (guix build-system trivial)
#:use-module (guix download)
#:use-module (guix gexp)
@@ -811,18 +812,19 @@ (define*-public (make-u-boot-package board triplet
`(("cross-gcc" ,(cross-gcc triplet))
("cross-binutils" ,(cross-binutils triplet)))
`())))
+ (build-system gnu-build-system2)
(arguments
(substitute-keyword-arguments (package-arguments u-boot)
((#:modules modules '())
`((ice-9 ftw)
(srfi srfi-1)
- (guix build gnu-build-system)
+ (guix build gnu-build-system2)
(guix build kconfig)
(guix build utils)
,@modules))
((#:imported-modules imported-modules '())
`((guix build kconfig)
- ,@%gnu-build-system-modules
+ ,@%gnu-build-system-modules2
,@imported-modules))
((#:test-target _ "test")
"test")
--
2.38.1
L
L
Ludovic Courtès wrote on 15 Dec 2022 16:09
Re: bug#60056: [PATCH RFC 1/6] build: Add gnu-build-system v2.
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)(address . 60056@debbugs.gnu.org)
87wn6sn1pi.fsf@gnu.org
Hi!

Maxim Cournoyer <maxim.cournoyer@gmail.com> skribis:

Toggle quote (4 lines)
> * guix/build/gnu-build-system2.scm: New file.
> * Makefile.am (MODULES): Register it.
> * guix/build-system/gnu2.scm: Use it.

I won’t be able to review it in the coming days; a quick note:

• Changes to ‘gnu-build-system’ need thorough review, so don’t
hesitate to ping me and others in the “core” team if nothing comes
up, but don’t interpret silence as consent.

• I’m reluctant to duplicating ‘gnu-build-system’, even if it’s
temporary. I think now’s the right time for changes in
‘core-updates’ so we could make those changes there instead.

Thanks,
Ludo’.
M
M
Maxim Cournoyer wrote on 16 Dec 2022 05:56
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 60056@debbugs.gnu.org)
871qp0c5g7.fsf@gmail.com
Hi Ludovic,

Ludovic Courtès <ludo@gnu.org> writes:

Toggle quote (14 lines)
> Hi!
>
> Maxim Cournoyer <maxim.cournoyer@gmail.com> skribis:
>
>> * guix/build/gnu-build-system2.scm: New file.
>> * Makefile.am (MODULES): Register it.
>> * guix/build-system/gnu2.scm: Use it.
>
> I won’t be able to review it in the coming days; a quick note:
>
> • Changes to ‘gnu-build-system’ need thorough review, so don’t
> hesitate to ping me and others in the “core” team if nothing comes
> up, but don’t interpret silence as consent.

OK. I've used the etc/teams.scm script output to CC the core team
members. Hopefully it helped to ping them (did it for you?).

Toggle quote (4 lines)
> • I’m reluctant to duplicating ‘gnu-build-system’, even if it’s
> temporary. I think now’s the right time for changes in
> ‘core-updates’ so we could make those changes there instead.

Yes, this is somewhat of a draft to allow people to test on master,
which lowers the cost (of building stuff). If and when we decide to go
forward with it, I'll make the change to gnu-build-system directly on
core-updates.

--
Thanks,
Maxim
Z
Z
zimoun wrote on 17 Dec 2022 12:53
(address . 60056@debbugs.gnu.org)
86cz8itfex.fsf@gmail.com
Hi Maxim,

On Thu, 15 Dec 2022 at 23:56, Maxim Cournoyer <maxim.cournoyer@gmail.com> wrote:

Toggle quote (3 lines)
> OK. I've used the etc/teams.scm script output to CC the core team
> members. Hopefully it helped to ping them (did it for you?).

Maybe something is wrong with my config, but I am not able to find these
messages where I am CC.

Well, it is holidays in France (yeah, we have a lot ;-)) so I will not
be able to give a look before January – although, I am not convinced
that my comments would be useful.


Cheers,
simon
M
M
Maxim Cournoyer wrote on 17 Dec 2022 16:58
(name . zimoun)(address . zimon.toutoune@gmail.com)
87h6xu58ex.fsf@gmail.com
Hi Simon,

zimoun <zimon.toutoune@gmail.com> writes:

Toggle quote (10 lines)
> Hi Maxim,
>
> On Thu, 15 Dec 2022 at 23:56, Maxim Cournoyer <maxim.cournoyer@gmail.com> wrote:
>
>> OK. I've used the etc/teams.scm script output to CC the core team
>> members. Hopefully it helped to ping them (did it for you?).
>
> Maybe something is wrong with my config, but I am not able to find these
> messages where I am CC.

I think if you are already registered to the list, adding 'X-Debbugs-Cc'
doesn't do more. It's only useful for people not already subscribed to
the list, I think.

At least to my filter configuration which uses the 'Return-Path: '
formed by mailmain, it'd be more useful if our etc/teams.scm script
simply used '--cc=', as it would then reach my INBOX rather than go in
my filtered directory.

Toggle quote (4 lines)
> Well, it is holidays in France (yeah, we have a lot ;-)) so I will not
> be able to give a look before January – although, I am not convinced
> that my comments would be useful.

Any comments is better than none! But I'll give this some extra time
than the 2 weeks, because I know many people will not be available to
look at it and it's a core change (as mentioned by Ludovic earlier).

--
Thanks,
Maxim
?