David Craven <da...@craven.ch> skribis: > * gnu/packages/linux.scm (linux-libre, linux-libre-4.4, > linux-libre-4.1): Use make-linux-libre. > (make-linux-libre): New variable.
[...] > +(define-public linux-libre > + (let* ((version "4.7.2") > + (conf (kernel-config > + (or (%current-target-system) > + (%current-system)) > + #:variant (version-major+minor version)))) I just realized that this won’t do what we want. The expression (or (%current-target-system) (%current-system)) is evaluated at the top-level—i.e., when (gnu packages linux) is loaded. At that time, (%current-system) holds its default value and (%current-target-system) is #f. IOW, even if you do: guix build -s foo linux-libre or: guix build --target=bar linux-libre you always end up with the x86_64-linux kernel config (if you’re on x86_64-linux). Conversely, when we write: (package ;; … (inputs `(("conf" ,(kernel-config (or (%current-target-system) …)))))) things work as expected because the ‘inputs’ field is “thunked” (lazy-evaluated) specifically for this purpose. A solution would be to pass a procedure instead of a config: (define* (make-linux-libre version hash #:key (configuration-file #f) (defconfig "defconfig")) (package (name "linux-libre") (version version) (source (origin (method url-fetch) (uri (linux-libre-urls version)) (sha256 (base32 hash)) (patches (origin-patches %boot-logo-patch)))) (build-system gnu-build-system) (supported-systems '("x86_64-linux" "i686-linux")) (inputs `(("bc" ,bc) ;; … ;; Call ‘configuration-file’ and pass it the right system type. ,@(if configuration-file `(("kconfig" ,(configuration-file (or (%current-target-system) …)))) '()))) (define variant1 (make-linux-libre v h #:configuration-file (lambda (system) …))) Makes sense? HTH! Ludo’.