summaryrefslogtreecommitdiff
path: root/guix/build-system
diff options
context:
space:
mode:
authorRicardo Wurmus <rekado@elephly.net>2017-05-24 12:05:47 +0200
committerRicardo Wurmus <rekado@elephly.net>2017-05-24 12:05:47 +0200
commitd1a914082b7e53636f9801769ef96218b2125c4b (patch)
tree998805fc59fe0b1bb105b24a6a79fff646257d96 /guix/build-system
parent657fb6c947d94cf946f29cd24e88bd080c01ff0a (diff)
parentae548434337cddf9677a4cd52b9370810b2cc9b6 (diff)
Merge branch 'master' into core-updates
Diffstat (limited to 'guix/build-system')
-rw-r--r--guix/build-system/ant.scm8
-rw-r--r--guix/build-system/asdf.scm109
-rw-r--r--guix/build-system/emacs.scm4
-rw-r--r--guix/build-system/ocaml.scm76
-rw-r--r--guix/build-system/python.scm85
5 files changed, 183 insertions, 99 deletions
diff --git a/guix/build-system/ant.scm b/guix/build-system/ant.scm
index 550f92bc7f..228b4e60d2 100644
--- a/guix/build-system/ant.scm
+++ b/guix/build-system/ant.scm
@@ -39,6 +39,7 @@
(define %ant-build-system-modules
;; Build-side modules imported by default.
`((guix build ant-build-system)
+ (guix build java-utils)
(guix build syscalls)
,@%gnu-build-system-modules))
@@ -93,11 +94,13 @@
(define* (ant-build store name inputs
#:key
(tests? #t)
- (test-target "tests")
+ (test-target "check")
(configure-flags ''())
(make-flags ''())
(build-target "jar")
(jar-name #f)
+ (source-dir "src")
+ (test-dir "src/test")
(phases '(@ (guix build ant-build-system)
%standard-phases))
(outputs '("out"))
@@ -106,6 +109,7 @@
(guile #f)
(imported-modules %ant-build-system-modules)
(modules '((guix build ant-build-system)
+ (guix build java-utils)
(guix build utils))))
"Build SOURCE with INPUTS."
(define builder
@@ -126,6 +130,8 @@
#:test-target ,test-target
#:build-target ,build-target
#:jar-name ,jar-name
+ #:source-dir ,source-dir
+ #:test-dir ,test-dir
#:phases ,phases
#:outputs %outputs
#:search-paths ',(map search-path-specification->sexp
diff --git a/guix/build-system/asdf.scm b/guix/build-system/asdf.scm
index f28c098ea2..ec8b64497f 100644
--- a/guix/build-system/asdf.scm
+++ b/guix/build-system/asdf.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2016 Andy Patterson <ajpatter@uwaterloo.ca>
+;;; Copyright © 2016, 2017 Andy Patterson <ajpatter@uwaterloo.ca>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -22,6 +22,9 @@
#:use-module (guix packages)
#:use-module (guix derivations)
#:use-module (guix search-paths)
+ #:use-module ((guix build utils)
+ #:select ((package-name->name+version
+ . hyphen-separated-name->name+version)))
#:use-module (guix build-system)
#:use-module (guix build-system gnu)
#:use-module (ice-9 match)
@@ -163,39 +166,40 @@ set up using CL source package conventions."
(match-lambda
((name content . rest)
(let* ((is-package? (package? content))
- (new-content (if is-package? (transform content) content))
- (new-name (if (and is-package?
- (string-prefix? from-prefix name))
- (package-name new-content)
- name)))
- `(,new-name ,new-content ,@rest)))))
+ (new-content (if is-package? (transform content) content)))
+ `(,name ,new-content ,@rest)))))
;; Special considerations for source packages: CL inputs become
- ;; propagated, and un-handled arguments are removed. Native inputs are
- ;; removed as are extraneous outputs.
+ ;; propagated, and un-handled arguments are removed.
+
(define new-propagated-inputs
(if target-is-source?
(map rewrite
- (filter (match-lambda
- ((_ input . _)
- (has-from-build-system? input)))
- (package-inputs pkg)))
- '()))
-
- (define new-inputs
+ (append
+ (filter (match-lambda
+ ((_ input . _)
+ (has-from-build-system? input)))
+ (append (package-inputs pkg)
+ ;; The native inputs might be needed just
+ ;; to load the system.
+ (package-native-inputs pkg)))
+ (package-propagated-inputs pkg)))
+
+ (map rewrite (package-propagated-inputs pkg))))
+
+ (define (new-inputs inputs-getter)
(if target-is-source?
(map rewrite
(filter (match-lambda
((_ input . _)
(not (has-from-build-system? input))))
- (package-inputs pkg)))
- (map rewrite (package-inputs pkg))))
+ (inputs-getter pkg)))
+ (map rewrite (inputs-getter pkg))))
(define base-arguments
(if target-is-source?
(strip-keyword-arguments
- '(#:tests? #:special-dependencies #:asd-file
- #:test-only-systems #:lisp)
+ '(#:tests? #:asd-file #:lisp #:asd-system-name #:test-asd-file)
(package-arguments pkg))
(package-arguments pkg)))
@@ -213,11 +217,9 @@ set up using CL source package conventions."
(arguments
(substitute-keyword-arguments base-arguments
((#:phases phases) (list phases-transformer phases))))
- (inputs new-inputs)
+ (inputs (new-inputs package-inputs))
(propagated-inputs new-propagated-inputs)
- (native-inputs (if target-is-source?
- '()
- (map rewrite (package-native-inputs pkg))))
+ (native-inputs (new-inputs package-native-inputs))
(outputs (if target-is-source?
'("out")
(package-outputs pkg)))))
@@ -233,10 +235,10 @@ set up using CL source package conventions."
(properties (alist-delete variant properties)))
pkg))
-(define (lower lisp-implementation)
+(define (lower lisp-type)
(lambda* (name
#:key source inputs outputs native-inputs system target
- (lisp (default-lisp (string->symbol lisp-implementation)))
+ (lisp (default-lisp (string->symbol lisp-type)))
#:allow-other-keys
#:rest arguments)
"Return a bag for NAME"
@@ -252,20 +254,19 @@ set up using CL source package conventions."
'())
,@inputs
,@(standard-packages)))
- (build-inputs `((,lisp-implementation ,lisp)
+ (build-inputs `((,lisp-type ,lisp)
,@native-inputs))
(outputs outputs)
- (build (asdf-build lisp-implementation))
+ (build (asdf-build lisp-type))
(arguments (strip-keyword-arguments private-keywords arguments))))))
-(define (asdf-build lisp-implementation)
+(define (asdf-build lisp-type)
(lambda* (store name inputs
#:key source outputs
(tests? #t)
- (special-dependencies ''())
(asd-file #f)
- (test-only-systems ''())
- (lisp lisp-implementation)
+ (asd-system-name #f)
+ (test-asd-file #f)
(phases '(@ (guix build asdf-build-system)
%standard-phases))
(search-paths '())
@@ -274,26 +275,36 @@ set up using CL source package conventions."
(imported-modules %asdf-build-system-modules)
(modules %asdf-build-modules))
+ (define system-name
+ (or asd-system-name
+ (string-drop
+ ;; NAME is the value returned from `package-full-name'.
+ (hyphen-separated-name->name+version name)
+ (1+ (string-length lisp-type))))) ; drop the "<lisp>-" prefix.
+
(define builder
`(begin
(use-modules ,@modules)
- (asdf-build #:name ,name
- #:source ,(match (assoc-ref inputs "source")
- (((? derivation? source))
- (derivation->output-path source))
- ((source) source)
- (source source))
- #:lisp ,lisp
- #:special-dependencies ,special-dependencies
- #:asd-file ,asd-file
- #:test-only-systems ,test-only-systems
- #:system ,system
- #:tests? ,tests?
- #:phases ,phases
- #:outputs %outputs
- #:search-paths ',(map search-path-specification->sexp
- search-paths)
- #:inputs %build-inputs)))
+ (parameterize ((%lisp (string-append
+ (assoc-ref %build-inputs ,lisp-type)
+ "/bin/" ,lisp-type))
+ (%lisp-type ,lisp-type))
+ (asdf-build #:name ,name
+ #:source ,(match (assoc-ref inputs "source")
+ (((? derivation? source))
+ (derivation->output-path source))
+ ((source) source)
+ (source source))
+ #:asd-file ,(or asd-file (string-append system-name ".asd"))
+ #:asd-system-name ,system-name
+ #:test-asd-file ,test-asd-file
+ #:system ,system
+ #:tests? ,tests?
+ #:phases ,phases
+ #:outputs %outputs
+ #:search-paths ',(map search-path-specification->sexp
+ search-paths)
+ #:inputs %build-inputs))))
(define guile-for-build
(match guile
diff --git a/guix/build-system/emacs.scm b/guix/build-system/emacs.scm
index a7982002b6..9a46ecfd26 100644
--- a/guix/build-system/emacs.scm
+++ b/guix/build-system/emacs.scm
@@ -83,6 +83,8 @@
(phases '(@ (guix build emacs-build-system)
%standard-phases))
(outputs '("out"))
+ (include ''("^[^/]*\\.el$" "^[^/]*\\.info$" "^doc/.*\\.info$"))
+ (exclude ''("^\\.dir-locals\\.el$" "-pkg\\.el$" "^[^/]*tests?\\.el$"))
(search-paths '())
(system (%current-system))
(guile #f)
@@ -108,6 +110,8 @@
#:tests? ,tests?
#:phases ,phases
#:outputs %outputs
+ #:include ,include
+ #:exclude ,exclude
#:search-paths ',(map search-path-specification->sexp
search-paths)
#:inputs %build-inputs)))
diff --git a/guix/build-system/ocaml.scm b/guix/build-system/ocaml.scm
index f4f57b5ad5..34a22ecffa 100644
--- a/guix/build-system/ocaml.scm
+++ b/guix/build-system/ocaml.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016, 2017 Julien Lepiller <julien@lepiller.eu>
+;;; Copyright © 2017 Ben Woodcroft <donttrustben@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -15,7 +16,6 @@
;;;
;;; 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 ocaml)
#:use-module (guix store)
#:use-module (guix utils)
@@ -25,7 +25,10 @@
#:use-module (guix build-system gnu)
#:use-module (guix packages)
#:use-module (ice-9 match)
+ #:use-module (srfi srfi-1)
#:export (%ocaml-build-system-modules
+ package-with-ocaml4.01
+ strip-ocaml4.01-variant
ocaml-build
ocaml-build-system))
@@ -71,6 +74,77 @@
(let ((module (resolve-interface '(gnu packages ocaml))))
(module-ref module 'ocaml-findlib)))
+(define (default-ocaml4.01)
+ (let ((ocaml (resolve-interface '(gnu packages ocaml))))
+ (module-ref ocaml 'ocaml-4.01)))
+
+(define (default-ocaml4.01-findlib)
+ (let ((module (resolve-interface '(gnu packages ocaml))))
+ (module-ref module 'ocaml4.01-findlib)))
+
+(define* (package-with-explicit-ocaml ocaml findlib old-prefix new-prefix
+ #:key variant-property)
+ "Return a procedure of one argument, P. The procedure creates a package
+with the same fields as P, which is assumed to use OCAML-BUILD-SYSTEM, such
+that it is compiled with OCAML and FINDLIB instead. The inputs are changed
+recursively accordingly. If the name of P starts with OLD-PREFIX, this is
+replaced by NEW-PREFIX; otherwise, NEW-PREFIX is prepended to the name.
+
+When VARIANT-PROPERTY is present, it is used as a key to search for
+pre-defined variants of this transformation recorded in the 'properties' field
+of packages. The property value must be the promise of a package. This is a
+convenient way for package writers to force the transformation to use
+pre-defined variants."
+ (define package-variant
+ (if variant-property
+ (lambda (package)
+ (assq-ref (package-properties package)
+ variant-property))
+ (const #f)))
+
+ (define (transform p)
+ (cond
+ ;; If VARIANT-PROPERTY is present, use that.
+ ((package-variant p)
+ => force)
+
+ ;; Otherwise build the new package object graph.
+ ((eq? (package-build-system p) ocaml-build-system)
+ (package
+ (inherit p)
+ (location (package-location p))
+ (name (let ((name (package-name p)))
+ (string-append new-prefix
+ (if (string-prefix? old-prefix name)
+ (substring name
+ (string-length old-prefix))
+ name))))
+ (arguments
+ (let ((ocaml (if (promise? ocaml) (force ocaml) ocaml))
+ (findlib (if (promise? findlib) (force findlib) findlib)))
+ (ensure-keyword-arguments (package-arguments p)
+ `(#:ocaml ,ocaml
+ #:findlib ,findlib))))))
+ (else p)))
+
+ (define (cut? p)
+ (or (not (eq? (package-build-system p) ocaml-build-system))
+ (package-variant p)))
+
+ (package-mapping transform cut?))
+
+(define package-with-ocaml4.01
+ (package-with-explicit-ocaml (delay (default-ocaml4.01))
+ (delay (default-ocaml4.01-findlib))
+ "ocaml-" "ocaml4.01-"
+ #:variant-property 'ocaml4.01-variant))
+
+(define (strip-ocaml4.01-variant p)
+ "Remove the 'ocaml4.01-variant' property from P."
+ (package
+ (inherit p)
+ (properties (alist-delete 'ocaml4.01-variant (package-properties p)))))
+
(define* (lower name
#:key source inputs native-inputs outputs system target
(ocaml (default-ocaml))
diff --git a/guix/build-system/python.scm b/guix/build-system/python.scm
index 17173f121e..ffed837313 100644
--- a/guix/build-system/python.scm
+++ b/guix/build-system/python.scm
@@ -83,54 +83,43 @@ pre-defined variants of this transformation recorded in the 'properties' field
of packages. The property value must be the promise of a package. This is a
convenient way for package writers to force the transformation to use
pre-defined variants."
- (define transform
- ;; Memoize the transformations. Failing to do that, we would build a huge
- ;; object graph with lots of duplicates, which in turns prevents us from
- ;; benefiting from memoization in 'package-derivation'.
- (mlambdaq (p)
- (let* ((rewrite-if-package
- (lambda (content)
- ;; CONTENT may be a file name, in which case it is returned,
- ;; or a package, which is rewritten with the new PYTHON and
- ;; NEW-PREFIX.
- (if (package? content)
- (transform content)
- content)))
- (rewrite
- (match-lambda
- ((name content . rest)
- (append (list name (rewrite-if-package content)) rest)))))
-
- (cond
- ;; If VARIANT-PROPERTY is present, use that.
- ((and variant-property
- (assoc-ref (package-properties p) variant-property))
- => force)
-
- ;; Otherwise build the new package object graph.
- ((eq? (package-build-system p) python-build-system)
- (package
- (inherit p)
- (location (package-location p))
- (name (let ((name (package-name p)))
- (string-append new-prefix
- (if (string-prefix? old-prefix name)
- (substring name
- (string-length old-prefix))
- name))))
- (arguments
- (let ((python (if (promise? python)
- (force python)
- python)))
- (ensure-keyword-arguments (package-arguments p)
- `(#:python ,python))))
- (inputs (map rewrite (package-inputs p)))
- (propagated-inputs (map rewrite (package-propagated-inputs p)))
- (native-inputs (map rewrite (package-native-inputs p)))))
- (else
- p)))))
-
- transform)
+ (define package-variant
+ (if variant-property
+ (lambda (package)
+ (assq-ref (package-properties package)
+ variant-property))
+ (const #f)))
+
+ (define (transform p)
+ (cond
+ ;; If VARIANT-PROPERTY is present, use that.
+ ((package-variant p)
+ => force)
+
+ ;; Otherwise build the new package object graph.
+ ((eq? (package-build-system p) python-build-system)
+ (package
+ (inherit p)
+ (location (package-location p))
+ (name (let ((name (package-name p)))
+ (string-append new-prefix
+ (if (string-prefix? old-prefix name)
+ (substring name
+ (string-length old-prefix))
+ name))))
+ (arguments
+ (let ((python (if (promise? python)
+ (force python)
+ python)))
+ (ensure-keyword-arguments (package-arguments p)
+ `(#:python ,python))))))
+ (else p)))
+
+ (define (cut? p)
+ (or (not (eq? (package-build-system p) python-build-system))
+ (package-variant p)))
+
+ (package-mapping transform cut?))
(define package-with-python2
;; Note: delay call to 'default-python2' until after the 'arguments' field