mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2025-01-14 15:10:16 -05:00
build-system: linux-module: Fix cross compilation.
* guix/build-system/linux-module.scm (default-kmod, default-gcc): Delete procedures. (system->arch): New procedure. (make-linux-module-builder)[native-inputs]: Move linux... [inputs]: ...to here. (linux-module-build-cross): New procedure. (linux-module-build): Add TARGET. Pass TARGET and ARCH to build side. (lower): Allow cross-compilation. Move "linux" and "linux-module-builder" to host-inputs. Add target-inputs. Call linux-module-build-cross if TARGET is set, linux-module-build otherwise. * guix/build/linux-module-build-system.scm (configure): Add ARCH argument. (linux-module-build): Adjust comment. Signed-off-by: Danny Milosavljevic <dannym@scratchpost.org>
This commit is contained in:
parent
5c79f23863
commit
c086c5af1c
2 changed files with 131 additions and 46 deletions
|
@ -1,5 +1,6 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2019 Danny Milosavljevic <dannym@scratchpost.org>
|
;;; Copyright © 2019 Danny Milosavljevic <dannym@scratchpost.org>
|
||||||
|
;;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -45,27 +46,16 @@ (define (default-linux)
|
||||||
(let ((module (resolve-interface '(gnu packages linux))))
|
(let ((module (resolve-interface '(gnu packages linux))))
|
||||||
(module-ref module 'linux-libre)))
|
(module-ref module 'linux-libre)))
|
||||||
|
|
||||||
(define (default-kmod)
|
(define (system->arch system)
|
||||||
"Return the default kmod package."
|
|
||||||
|
|
||||||
;; Do not use `@' to avoid introducing circular dependencies.
|
|
||||||
(let ((module (resolve-interface '(gnu packages linux))))
|
(let ((module (resolve-interface '(gnu packages linux))))
|
||||||
(module-ref module 'kmod)))
|
((module-ref module 'system->linux-architecture) system)))
|
||||||
|
|
||||||
(define (default-gcc)
|
|
||||||
"Return the default gcc package."
|
|
||||||
|
|
||||||
;; Do not use `@' to avoid introducing circular dependencies.
|
|
||||||
(let ((module (resolve-interface '(gnu packages gcc))))
|
|
||||||
(module-ref module 'gcc-7)))
|
|
||||||
|
|
||||||
(define (make-linux-module-builder linux)
|
(define (make-linux-module-builder linux)
|
||||||
(package
|
(package
|
||||||
(inherit linux)
|
(inherit linux)
|
||||||
(name (string-append (package-name linux) "-module-builder"))
|
(name (string-append (package-name linux) "-module-builder"))
|
||||||
(native-inputs
|
(inputs
|
||||||
`(("linux" ,linux)
|
`(("linux" ,linux)))
|
||||||
,@(package-native-inputs linux)))
|
|
||||||
(arguments
|
(arguments
|
||||||
(substitute-keyword-arguments (package-arguments linux)
|
(substitute-keyword-arguments (package-arguments linux)
|
||||||
((#:phases phases)
|
((#:phases phases)
|
||||||
|
@ -97,33 +87,43 @@ (define* (lower name
|
||||||
#:rest arguments)
|
#:rest arguments)
|
||||||
"Return a bag for NAME."
|
"Return a bag for NAME."
|
||||||
(define private-keywords
|
(define private-keywords
|
||||||
'(#:source #:target #:gcc #:kmod #:linux #:inputs #:native-inputs))
|
`(#:source #:target #:gcc #:kmod #:linux #:inputs #:native-inputs
|
||||||
|
,@(if target '() '(#:target))))
|
||||||
|
|
||||||
(and (not target) ;XXX: no cross-compilation
|
(bag
|
||||||
(bag
|
(name name)
|
||||||
(name name)
|
(system system) (target target)
|
||||||
(system system)
|
(build-inputs `(,@(if source
|
||||||
(host-inputs `(,@(if source
|
`(("source" ,source))
|
||||||
`(("source" ,source))
|
'())
|
||||||
'())
|
,@native-inputs
|
||||||
,@inputs
|
;; TODO: Remove "gmp", "mpfr", "mpc" since they are
|
||||||
,@(standard-packages)))
|
;; only needed to compile the gcc plugins. Maybe
|
||||||
(build-inputs `(("linux" ,linux) ; for "Module.symvers".
|
;; remove "flex", "bison", "elfutils", "perl",
|
||||||
("linux-module-builder"
|
;; "openssl". That leaves very little ("bc", "gcc",
|
||||||
,(make-linux-module-builder linux))
|
;; "kmod").
|
||||||
,@native-inputs
|
,@(package-native-inputs linux)
|
||||||
;; TODO: Remove "gmp", "mpfr", "mpc" since they are
|
,@(if target
|
||||||
;; only needed to compile the gcc plugins. Maybe
|
;; Use the standard cross inputs of
|
||||||
;; remove "flex", "bison", "elfutils", "perl",
|
;; 'gnu-build-system'.
|
||||||
;; "openssl". That leaves very little ("bc", "gcc",
|
(standard-cross-packages target 'host)
|
||||||
;; "kmod").
|
'())
|
||||||
,@(package-native-inputs linux)))
|
;; Keep the standard inputs of 'gnu-build-system'.
|
||||||
(outputs outputs)
|
,@(standard-packages)))
|
||||||
(build linux-module-build)
|
(host-inputs `(,@inputs
|
||||||
(arguments (strip-keyword-arguments private-keywords arguments)))))
|
("linux" ,linux)
|
||||||
|
("linux-module-builder"
|
||||||
|
,(make-linux-module-builder linux))))
|
||||||
|
(target-inputs (if target
|
||||||
|
(standard-cross-packages target 'target)
|
||||||
|
'()))
|
||||||
|
(outputs outputs)
|
||||||
|
(build (if target linux-module-build-cross linux-module-build))
|
||||||
|
(arguments (strip-keyword-arguments private-keywords arguments))))
|
||||||
|
|
||||||
(define* (linux-module-build store name inputs
|
(define* (linux-module-build store name inputs
|
||||||
#:key
|
#:key
|
||||||
|
target
|
||||||
(search-paths '())
|
(search-paths '())
|
||||||
(tests? #t)
|
(tests? #t)
|
||||||
(phases '(@ (guix build linux-module-build-system)
|
(phases '(@ (guix build linux-module-build-system)
|
||||||
|
@ -152,6 +152,8 @@ (define builder
|
||||||
search-paths)
|
search-paths)
|
||||||
#:phases ,phases
|
#:phases ,phases
|
||||||
#:system ,system
|
#:system ,system
|
||||||
|
#:target ,target
|
||||||
|
#:arch ,(system->arch (or target system))
|
||||||
#:tests? ,tests?
|
#:tests? ,tests?
|
||||||
#:outputs %outputs
|
#:outputs %outputs
|
||||||
#:inputs %build-inputs)))
|
#:inputs %build-inputs)))
|
||||||
|
@ -173,6 +175,88 @@ (define guile-for-build
|
||||||
#:guile-for-build guile-for-build
|
#:guile-for-build guile-for-build
|
||||||
#:substitutable? substitutable?))
|
#:substitutable? substitutable?))
|
||||||
|
|
||||||
|
(define* (linux-module-build-cross
|
||||||
|
store name
|
||||||
|
#:key
|
||||||
|
target native-drvs target-drvs
|
||||||
|
(guile #f)
|
||||||
|
(outputs '("out"))
|
||||||
|
(search-paths '())
|
||||||
|
(native-search-paths '())
|
||||||
|
(tests? #f)
|
||||||
|
(phases '(@ (guix build linux-module-build-system)
|
||||||
|
%standard-phases))
|
||||||
|
(system (%current-system))
|
||||||
|
(substitutable? #t)
|
||||||
|
(imported-modules
|
||||||
|
%linux-module-build-system-modules)
|
||||||
|
(modules '((guix build linux-module-build-system)
|
||||||
|
(guix build utils))))
|
||||||
|
(define builder
|
||||||
|
`(begin
|
||||||
|
(use-modules ,@modules)
|
||||||
|
(let ()
|
||||||
|
(define %build-host-inputs
|
||||||
|
',(map (match-lambda
|
||||||
|
((name (? derivation? drv) sub ...)
|
||||||
|
`(,name . ,(apply derivation->output-path drv sub)))
|
||||||
|
((name path)
|
||||||
|
`(,name . ,path)))
|
||||||
|
native-drvs))
|
||||||
|
|
||||||
|
(define %build-target-inputs
|
||||||
|
',(map (match-lambda
|
||||||
|
((name (? derivation? drv) sub ...)
|
||||||
|
`(,name . ,(apply derivation->output-path drv sub)))
|
||||||
|
((name (? package? pkg) sub ...)
|
||||||
|
(let ((drv (package-cross-derivation store pkg
|
||||||
|
target system)))
|
||||||
|
`(,name . ,(apply derivation->output-path drv sub))))
|
||||||
|
((name path)
|
||||||
|
`(,name . ,path)))
|
||||||
|
target-drvs))
|
||||||
|
|
||||||
|
(linux-module-build #:name ,name
|
||||||
|
#:source ,(match (assoc-ref native-drvs "source")
|
||||||
|
(((? derivation? source))
|
||||||
|
(derivation->output-path source))
|
||||||
|
((source)
|
||||||
|
source)
|
||||||
|
(source
|
||||||
|
source))
|
||||||
|
#:system ,system
|
||||||
|
#:target ,target
|
||||||
|
#:arch ,(system->arch (or target system))
|
||||||
|
#:outputs %outputs
|
||||||
|
#:inputs %build-target-inputs
|
||||||
|
#:native-inputs %build-host-inputs
|
||||||
|
#:search-paths
|
||||||
|
',(map search-path-specification->sexp
|
||||||
|
search-paths)
|
||||||
|
#:native-search-paths
|
||||||
|
',(map
|
||||||
|
search-path-specification->sexp
|
||||||
|
native-search-paths)
|
||||||
|
#:phases ,phases
|
||||||
|
#:tests? ,tests?))))
|
||||||
|
|
||||||
|
(define guile-for-build
|
||||||
|
(match guile
|
||||||
|
((? package?)
|
||||||
|
(package-derivation store guile system #:graft? #f))
|
||||||
|
(#f ; the default
|
||||||
|
(let* ((distro (resolve-interface '(gnu packages commencement)))
|
||||||
|
(guile (module-ref distro 'guile-final)))
|
||||||
|
(package-derivation store guile system #:graft? #f)))))
|
||||||
|
|
||||||
|
(build-expression->derivation store name builder
|
||||||
|
#:system system
|
||||||
|
#:inputs (append native-drvs target-drvs)
|
||||||
|
#:outputs outputs
|
||||||
|
#:modules imported-modules
|
||||||
|
#:guile-for-build guile-for-build
|
||||||
|
#:substitutable? substitutable?))
|
||||||
|
|
||||||
(define linux-module-build-system
|
(define linux-module-build-system
|
||||||
(build-system
|
(build-system
|
||||||
(name 'linux-module)
|
(name 'linux-module)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2019 Danny Milosavljevic <dannym@scratchpost.org>
|
;;; Copyright © 2019 Danny Milosavljevic <dannym@scratchpost.org>
|
||||||
|
;;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -33,14 +34,13 @@ (define-module (guix build linux-module-build-system)
|
||||||
;; Code:
|
;; Code:
|
||||||
|
|
||||||
;; Copied from make-linux-libre's "configure" phase.
|
;; Copied from make-linux-libre's "configure" phase.
|
||||||
(define* (configure #:key inputs target #:allow-other-keys)
|
(define* (configure #:key inputs target arch #:allow-other-keys)
|
||||||
(setenv "KCONFIG_NOTIMESTAMP" "1")
|
(setenv "KCONFIG_NOTIMESTAMP" "1")
|
||||||
(setenv "KBUILD_BUILD_TIMESTAMP" (getenv "SOURCE_DATE_EPOCH"))
|
(setenv "KBUILD_BUILD_TIMESTAMP" (getenv "SOURCE_DATE_EPOCH"))
|
||||||
;(let ((arch ,(system->linux-architecture
|
|
||||||
; (or (%current-target-system)
|
(setenv "ARCH" arch)
|
||||||
; (%current-system)))))
|
(format #t "`ARCH' set to `~a'~%" (getenv "ARCH"))
|
||||||
; (setenv "ARCH" arch)
|
|
||||||
; (format #t "`ARCH' set to `~a'~%" (getenv "ARCH")))
|
|
||||||
(when target
|
(when target
|
||||||
(setenv "CROSS_COMPILE" (string-append target "-"))
|
(setenv "CROSS_COMPILE" (string-append target "-"))
|
||||||
(format #t "`CROSS_COMPILE' set to `~a'~%"
|
(format #t "`CROSS_COMPILE' set to `~a'~%"
|
||||||
|
@ -85,8 +85,9 @@ (define %standard-phases
|
||||||
(replace 'install install)))
|
(replace 'install install)))
|
||||||
|
|
||||||
(define* (linux-module-build #:key inputs (phases %standard-phases)
|
(define* (linux-module-build #:key inputs (phases %standard-phases)
|
||||||
#:allow-other-keys #:rest args)
|
#:allow-other-keys #:rest args)
|
||||||
"Build the given package, applying all of PHASES in order, with a Linux kernel in attendance."
|
"Build the given package, applying all of PHASES in order, with a Linux
|
||||||
|
kernel in attendance."
|
||||||
(apply gnu:gnu-build
|
(apply gnu:gnu-build
|
||||||
#:inputs inputs #:phases phases
|
#:inputs inputs #:phases phases
|
||||||
args))
|
args))
|
||||||
|
|
Loading…
Reference in a new issue