Message ID | 7d092a3734bd2f988e03bfb28fb0ca6a0302cc86.1721119509.git.mail@cbaines.net |
---|---|
State | New |
Headers | show |
Series | Guard against producing derivations for platforms with no system | expand |
Hello, Christopher Baines <mail@cbaines.net> skribis: > Since I believe coreutils-minimal will fail to build for these targets, this > will catch this early and display a clear message for both this package and > packages using it as an input. > > * gnu/packages/base.scm (coreutils-minimal)[native-inputs]: Check the target > if there is one. > > Change-Id: Id37cf6ac0b63226261a85a00699dfd06188c1475 [...] > + (native-inputs > + (begin > + (let ((target (%current-target-system))) > + (when target > + (unless (platform-system (lookup-platform-by-target target)) > + (raise > + (condition > + (&package-unsupported-target-error > + (package this-package) > + (target target))))))) > + '())) I understand the rationale, but this raises a few issues IMO: 1. This is abusing the ‘native-inputs’ field. 2. It’s the kind of thing that should be purely declarative, much like ‘supported-systems’. 3. So far, we do not keep track of the supported cross-compilation targets of each package, and I think it’s probably better that way: the set of cross-compilation targets is pretty much open-ended and we only check them on a best-effort basis, for select packages (typically those listed in ‘packages-to-cross-build’ in (gnu ci) and/or ‘etc/release-manifest.scm’). I think we’d rather not start annotating packages for supported cross-compilation target. That said, the initial problem remains: how can we ensure that the Data Service does not attempt to compute cross-build derivations that don’t make sense, such as Coreutils on bare-metal targets like ‘avr’? My take is that we should bake knowledge about what makes sense to be tested somewhere. It could be either arranging so (gnu ci) can be used by the Data Service (it’s currently used by Cuirass), or ‘etc/release-manifest.scm’, or even just a hard-coded listed of supported targets—we’re talking about a list of ten triplets or so, that’s okay. Or perhaps there’s room for something nicer in (guix platforms), but I don’t see how we could determine whether a given package is eligible for a bare-metal target. Thoughts? Ludo’.
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index 66c5b7d237..05c3278e2e 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -67,6 +67,7 @@ (define-module (gnu packages base) #:use-module (guix utils) #:use-module (guix gexp) #:use-module (guix packages) + #:use-module (guix platform) #:use-module (guix download) #:use-module (guix git-download) #:use-module (guix build-system gnu) @@ -76,6 +77,8 @@ (define-module (gnu packages base) #:use-module (ice-9 optargs) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-34) + #:use-module (srfi srfi-35) #:export (glibc libc-for-target libc-locales-for-target @@ -537,7 +540,17 @@ (define-public coreutils-minimal (inherit coreutils) (name "coreutils-minimal") (outputs '("out")) - (native-inputs '()) + (native-inputs + (begin + (let ((target (%current-target-system))) + (when target + (unless (platform-system (lookup-platform-by-target target)) + (raise + (condition + (&package-unsupported-target-error + (package this-package) + (target target))))))) + '())) (inputs '()))) (define-public coreutils-8.30