* guix/build-system/waf.scm, guix/build/waf-build-system.scm: New files. * Makefile.am (MODULES): Add them. * doc/guix.texi (Build Systems): Document waf-build-system.gn-latest-20200428
@@ -53,6 +53,7 @@ MODULES = \ | |||
guix/build-system/gnu.scm \ | |||
guix/build-system/perl.scm \ | |||
guix/build-system/python.scm \ | |||
guix/build-system/waf.scm \ | |||
guix/build-system/ruby.scm \ | |||
guix/build-system/trivial.scm \ | |||
guix/ftp-client.scm \ | |||
@@ -72,6 +73,7 @@ MODULES = \ | |||
guix/build/perl-build-system.scm \ | |||
guix/build/python-build-system.scm \ | |||
guix/build/ruby-build-system.scm \ | |||
guix/build/waf-build-system.scm \ | |||
guix/build/store-copy.scm \ | |||
guix/build/utils.scm \ | |||
guix/build/union.scm \ | |||
@@ -1913,6 +1913,18 @@ Which Ruby package is used can be specified with the @code{#:ruby} | |||
parameter. | |||
@end defvr | |||
@defvr {Scheme Variable} waf-build-system | |||
This variable is exported by @code{(guix build-system waf)}. It | |||
implements a build procedure around the @code{waf} script. The common | |||
phases---@code{configure}, @code{build}, and @code{install}---are | |||
implemented by passing their names as arguments to the @code{waf} | |||
script. | |||
The @code{waf} script is executed by the Python interpreter. Which | |||
Python package is used to run the script can be specified with the | |||
@code{#:python} parameter. | |||
@end defvr | |||
Lastly, for packages that do not need anything as sophisticated, a | |||
``trivial'' build system is provided. It is trivial in the sense that | |||
it provides basically no support: it does not pull any implicit inputs, | |||
@@ -0,0 +1,128 @@ | |||
;;; GNU Guix --- Functional package management for GNU | |||
;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net> | |||
;;; | |||
;;; 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 waf) | |||
#:use-module (guix store) | |||
#:use-module (guix utils) | |||
#:use-module (guix packages) | |||
#:use-module (guix derivations) | |||
#:use-module (guix build-system) | |||
#:use-module (guix build-system gnu) | |||
#:use-module ((guix build-system python) | |||
#:select (default-python default-python2)) | |||
#:use-module (ice-9 match) | |||
#:use-module (srfi srfi-26) | |||
#:export (waf-build | |||
waf-build-system)) | |||
;; Commentary: | |||
;; | |||
;; Standard build procedure for applications using 'waf'. This is very | |||
;; similar to the 'python-build-system' and is implemented as an extension of | |||
;; 'gnu-build-system'. | |||
;; | |||
;; Code: | |||
(define* (lower name | |||
#:key source inputs native-inputs outputs system target | |||
(python (default-python)) | |||
#:allow-other-keys | |||
#:rest arguments) | |||
"Return a bag for NAME." | |||
(define private-keywords | |||
'(#:source #:target #:python #:inputs #:native-inputs)) | |||
(and (not target) ;XXX: no cross-compilation | |||
(bag | |||
(name name) | |||
(system system) | |||
(host-inputs `(,@(if source | |||
`(("source" ,source)) | |||
'()) | |||
,@inputs | |||
;; Keep the standard inputs of 'gnu-build-system'. | |||
,@(standard-packages))) | |||
(build-inputs `(("python" ,python) | |||
,@native-inputs)) | |||
(outputs outputs) | |||
(build waf-build) ; only change compared to 'lower' in python.scm | |||
(arguments (strip-keyword-arguments private-keywords arguments))))) | |||
(define* (waf-build store name inputs | |||
#:key | |||
(tests? #t) | |||
(test-target "check") | |||
(configure-flags ''()) | |||
(phases '(@ (guix build waf-build-system) | |||
%standard-phases)) | |||
(outputs '("out")) | |||
(search-paths '()) | |||
(system (%current-system)) | |||
(guile #f) | |||
(imported-modules '((guix build waf-build-system) | |||
(guix build gnu-build-system) | |||
(guix build utils))) | |||
(modules '((guix build waf-build-system) | |||
(guix build utils)))) | |||
"Build SOURCE with INPUTS. This assumes that SOURCE provides a 'waf' file | |||
as its build system." | |||
(define builder | |||
`(begin | |||
(use-modules ,@modules) | |||
(waf-build #:name ,name | |||
#:source ,(match (assoc-ref inputs "source") | |||
(((? derivation? source)) | |||
(derivation->output-path source)) | |||
((source) | |||
source) | |||
(source | |||
source)) | |||
#:configure-flags ,configure-flags | |||
#:system ,system | |||
#:test-target ,test-target | |||
#:tests? ,tests? | |||
#:phases ,phases | |||
#:outputs %outputs | |||
#:search-paths ',(map search-path-specification->sexp | |||
search-paths) | |||
#:inputs %build-inputs))) | |||
(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 | |||
#:inputs inputs | |||
#:system system | |||
#:modules imported-modules | |||
#:outputs outputs | |||
#:guile-for-build guile-for-build)) | |||
(define waf-build-system | |||
(build-system | |||
(name 'waf) | |||
(description "The standard waf build system") | |||
(lower lower))) | |||
;;; waf.scm ends here |
@@ -0,0 +1,86 @@ | |||
;;; GNU Guix --- Functional package management for GNU | |||
;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net> | |||
;;; | |||
;;; 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 waf-build-system) | |||
#:use-module ((guix build gnu-build-system) #:prefix gnu:) | |||
#:use-module (guix build utils) | |||
#:use-module (ice-9 match) | |||
#:use-module (ice-9 ftw) | |||
#:use-module (srfi srfi-1) | |||
#:use-module (srfi srfi-26) | |||
#:export (%standard-phases | |||
waf-build)) | |||
;; Commentary: | |||
;; | |||
;; Builder-side code of the standard waf build procedure. | |||
;; | |||
;; Code: | |||
(define (call-waf command params) | |||
(if (file-exists? "waf") | |||
(begin | |||
(format #t "running \"python waf\" with command ~s and parameters ~s~%" | |||
command params) | |||
(zero? (apply system* "python" "waf" command params))) | |||
(error "no waf found"))) | |||
(define* (configure #:key target native-inputs inputs outputs | |||
(configure-flags '()) | |||
#:allow-other-keys) | |||
"Build a given waf application." | |||
(let* ((prefix (assoc-ref outputs "out")) | |||
(flags `(,(string-append "--prefix=" prefix) | |||
,@configure-flags))) | |||
(call-waf "configure" flags))) | |||
(define* (build #:rest empty) | |||
"Build a given waf application." | |||
(call-waf "build" '())) | |||
(define* (check #:key tests? test-target #:allow-other-keys) | |||
"Run the test suite of a given waf application." | |||
(if tests? | |||
(call-waf test-target '()) | |||
#t)) | |||
(define* (install #:key outputs inputs (configure-flags '()) | |||
#:allow-other-keys) | |||
"Install a given waf application." | |||
(let* ((out (assoc-ref outputs "out")) | |||
(params (append (list (string-append "--prefix=" out)) | |||
configure-flags))) | |||
(call-waf "install" params))) | |||
(define %standard-phases | |||
(alist-replace | |||
'configure configure | |||
(alist-replace | |||
'build build | |||
(alist-replace | |||
'check check | |||
(alist-replace 'install install | |||
gnu:%standard-phases))))) | |||
(define* (waf-build #:key inputs (phases %standard-phases) | |||
#:allow-other-keys #:rest args) | |||
"Build the given waf application, applying all of PHASES in order." | |||
(apply gnu:gnu-build #:inputs inputs #:phases phases args)) | |||
;;; waf-build-system.scm ends here |