[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
11/66: guix: build: Add transitive source building.
From: |
Manolis Fragkiskos Ragkousis |
Subject: |
11/66: guix: build: Add transitive source building. |
Date: |
Thu, 21 May 2015 12:51:50 +0000 |
phant0mas pushed a commit to branch wip-hurd
in repository guix.
commit 3c6f07fc7cb1763659eecbffc9b2c7830ecdb777
Author: Eric Bavier <address@hidden>
Date: Wed Jan 28 13:33:28 2015 -0600
guix: build: Add transitive source building.
* guix/scripts/build.scm (%options, options->derivations): Add --sources
option.
* doc/guix.texi (Invoking guix build): Document --sources option.
* tests/guix-build.sh: Add tests.
---
doc/guix.texi | 43 +++++++++++++++++++++++++
guix/scripts/build.scm | 55 ++++++++++++++++++++++----------
tests/guix-build.sh | 82 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 163 insertions(+), 17 deletions(-)
diff --git a/doc/guix.texi b/doc/guix.texi
index c68e291..3328cba 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -2932,6 +2932,49 @@ The returned source tarball is the result of applying
any patches and
code snippets specified in the package's @code{origin} (@pxref{Defining
Packages}).
address@hidden --sources
+Fetch and return the source of @var{package-or-derivation} and all their
+dependencies, recursively. This is a handy way to obtain a local copy
+of all the source code needed to build @var{packages}, allowing you to
+eventually build them even without network access. It is an extension
+of the @code{--source} option and can accept one of the following
+optional argument values:
+
address@hidden @code
address@hidden package
+This value causes the @code{--sources} option to behave in the same way
+as the @code{--source} option.
+
address@hidden all
+Build all packages' source derivations, including any source that might
+be listed as @code{inputs}. This is the default value.
+
address@hidden
+$ guix build --sources tzdata
+The following derivations will be built:
+ /gnu/store/@dots{}-tzdata2015b.tar.gz.drv
+ /gnu/store/@dots{}-tzcode2015b.tar.gz.drv
address@hidden example
+
address@hidden transitive
+Build all packages' source derivations, as well as all source
+derivations for packages' transitive inputs. This can be used e.g. to
+prefetch package source for later offline building.
+
address@hidden
+$ guix build --sources=transitive tzdata
+The following derivations will be built:
+ /gnu/store/@dots{}-tzcode2015b.tar.gz.drv
+ /gnu/store/@dots{}-findutils-4.4.2.tar.xz.drv
+ /gnu/store/@dots{}-grep-2.21.tar.xz.drv
+ /gnu/store/@dots{}-coreutils-8.23.tar.xz.drv
+ /gnu/store/@dots{}-make-4.1.tar.xz.drv
+ /gnu/store/@dots{}-bash-4.3.tar.xz.drv
address@hidden
address@hidden example
+
address@hidden table
+
@item address@hidden
@itemx -s @var{system}
Attempt to build for @var{system}---e.g., @code{i686-linux}---instead of
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index 370c2a3..9366ab6 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -228,6 +228,9 @@ Build the given PACKAGE-OR-DERIVATION and return their
output paths.\n"))
(display (_ "
-S, --source build the packages' source derivations"))
(display (_ "
+ --sources[=TYPE] build source derivations; TYPE may optionally be one
+ of \"package\", \"all\" (default), or
\"transitive\""))
+ (display (_ "
-s, --system=SYSTEM attempt to build for SYSTEM--e.g., \"i686-linux\""))
(display (_ "
--target=TRIPLET cross-build for TRIPLET--e.g., \"armel-linux-gnu\""))
@@ -262,10 +265,22 @@ Build the given PACKAGE-OR-DERIVATION and return their
output paths.\n"))
(option '(#\V "version") #f #f
(lambda args
(show-version-and-exit "guix build")))
-
(option '(#\S "source") #f #f
(lambda (opt name arg result)
- (alist-cons 'source? #t result)))
+ (alist-cons 'source #t result)))
+ (option '("sources") #f #t
+ (lambda (opt name arg result)
+ (match arg
+ ("package"
+ (alist-cons 'source #t result))
+ ((or "all" #f)
+ (alist-cons 'source package-direct-sources result))
+ ("transitive"
+ (alist-cons 'source package-transitive-sources result))
+ (else
+ (leave (_ "invalid argument: '~a' option argument: ~a, ~
+must be one of 'package', 'all', or 'transitive'~%")
+ name arg)))))
(option '(#\s "system") #t #f
(lambda (opt name arg result)
(alist-cons 'system arg
@@ -308,28 +323,34 @@ build."
(triplet
(cut package-cross-derivation <> <> triplet <>))))
- (define src? (assoc-ref opts 'source?))
+ (define src (assoc-ref opts 'source))
(define sys (assoc-ref opts 'system))
(define graft? (assoc-ref opts 'graft?))
(parameterize ((%graft? graft?))
(let ((opts (options/with-source store
(options/resolve-packages store opts))))
- (filter-map (match-lambda
- (('argument . (? package? p))
- (if src?
+ (concatenate
+ (filter-map (match-lambda
+ (('argument . (? package? p))
+ (match src
+ (#f
+ (list (package->derivation store p sys)))
+ (#t
(let ((s (package-source p)))
- (package-source-derivation store s))
- (package->derivation store p sys)))
- (('argument . (? derivation? drv))
- drv)
- (('argument . (? derivation-path? drv))
- (call-with-input-file drv read-derivation))
- (('argument . (? store-path?))
- ;; Nothing to do; maybe for --log-file.
- #f)
- (_ #f))
- opts))))
+ (list (package-source-derivation store s))))
+ (proc
+ (map (cut package-source-derivation store <>)
+ (proc p)))))
+ (('argument . (? derivation? drv))
+ (list drv))
+ (('argument . (? derivation-path? drv))
+ (list (call-with-input-file drv read-derivation)))
+ (('argument . (? store-path?))
+ ;; Nothing to do; maybe for --log-file.
+ #f)
+ (_ #f))
+ opts)))))
(define (options/resolve-packages store opts)
"Return OPTS with package specification strings replaced by actual
diff --git a/tests/guix-build.sh b/tests/guix-build.sh
index 836c45e..a72ce09 100644
--- a/tests/guix-build.sh
+++ b/tests/guix-build.sh
@@ -36,6 +36,88 @@ guix build -e '(@@ (gnu packages bootstrap)
%bootstrap-guile)' | \
guix build hello -d | \
grep -e '-hello-[0-9\.]\+\.drv$'
+# Check --sources option with its arguments
+module_dir="t-guix-build-$$"
+mkdir "$module_dir"
+trap "rm -rf $module_dir" EXIT
+
+cat > "$module_dir/foo.scm"<<EOF
+(define-module (foo)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix build-system trivial))
+
+(define-public foo
+ (package
+ (name "foo")
+ (version "42")
+ (source (origin
+ (method url-fetch)
+ (uri "http://www.example.com/foo.tar.gz")
+ (sha256
+ (base32
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"))))
+ (build-system trivial-build-system)
+ (inputs
+ (quasiquote (("bar" ,bar))))
+ (home-page "www.example.com")
+ (synopsis "Dummy package")
+ (description "foo is a dummy package for testing.")
+ (license #f)))
+
+(define-public bar
+ (package
+ (name "bar")
+ (version "9001")
+ (source (origin
+ (method url-fetch)
+ (uri "http://www.example.com/bar.tar.gz")
+ (sha256
+ (base32
+ "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"))))
+ (build-system trivial-build-system)
+ (inputs
+ (quasiquote
+ (("data" ,(origin
+ (method url-fetch)
+ (uri "http://www.example.com/bar.dat")
+ (sha256
+ (base32
+
"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz")))))))
+ (home-page "www.example.com")
+ (synopsis "Dummy package")
+ (description "bar is a dummy package for testing.")
+ (license #f)))
+EOF
+
+GUIX_PACKAGE_PATH="$module_dir"
+export GUIX_PACKAGE_PATH
+
+# foo.tar.gz
+guix build -d -S foo
+guix build -d -S foo | grep -e 'foo\.tar\.gz'
+
+guix build -d --sources=package foo
+guix build -d --sources=package foo | grep -e 'foo\.tar\.gz'
+
+# bar.tar.gz and bar.dat
+guix build -d --sources bar
+test `guix build -d --sources bar \
+ | grep -e 'bar\.tar\.gz' -e 'bar\.dat' \
+ | wc -l` -eq 2
+
+# bar.tar.gz and bar.dat
+guix build -d --sources=all bar
+test `guix build -d --sources bar \
+ | grep -e 'bar\.tar\.gz' -e 'bar\.dat' \
+ | wc -l` -eq 2
+
+# Should include foo.tar.gz, bar.tar.gz, and bar.dat
+guix build -d --sources=transitive foo
+test `guix build -d --sources=transitive foo \
+ | grep -e 'foo\.tar\.gz' -e 'bar\.tar\.gz' -e 'bar\.dat' \
+ | wc -l` -eq 3
+
# Should all return valid log files.
drv="`guix build -d -e '(@@ (gnu packages bootstrap) %bootstrap-guile)'`"
out="`guix build -e '(@@ (gnu packages bootstrap) %bootstrap-guile)'`"
- 12/66: gnu: cppunit: Explicitly link with libdl., (continued)
- 12/66: gnu: cppunit: Explicitly link with libdl., Manolis Fragkiskos Ragkousis, 2015/05/21
- 10/66: guix: packages: Add package-direct-sources and package-transitive-sources., Manolis Fragkiskos Ragkousis, 2015/05/21
- 13/66: gnu: Add librevenge., Manolis Fragkiskos Ragkousis, 2015/05/21
- 15/66: gnu: dejagnu: Update to 1.5.3., Manolis Fragkiskos Ragkousis, 2015/05/21
- 08/66: profiles: Store search paths in manifests., Manolis Fragkiskos Ragkousis, 2015/05/21
- 16/66: gnu: help2man: Update to 1.46.6., Manolis Fragkiskos Ragkousis, 2015/05/21
- 01/66: services: Add console-keymap service., Manolis Fragkiskos Ragkousis, 2015/05/21
- 14/66: gnu: Add libwpd., Manolis Fragkiskos Ragkousis, 2015/05/21
- 18/66: gnu: wpa-supplicant: Update to 2.4., Manolis Fragkiskos Ragkousis, 2015/05/21
- 07/66: hydra: Update Guix job set., Manolis Fragkiskos Ragkousis, 2015/05/21
- 11/66: guix: build: Add transitive source building.,
Manolis Fragkiskos Ragkousis <=
- 17/66: gnu: parallel: Update to 20150422., Manolis Fragkiskos Ragkousis, 2015/05/21
- 21/66: gnu: gnupg: Update to 2.1.3., Manolis Fragkiskos Ragkousis, 2015/05/21
- 20/66: gnu: Add dovecot., Manolis Fragkiskos Ragkousis, 2015/05/21
- 22/66: gnu: subversion: Update to 1.8.13., Manolis Fragkiskos Ragkousis, 2015/05/21
- 03/66: gnu: linux-libre: Update to 4.0.1., Manolis Fragkiskos Ragkousis, 2015/05/21
- 19/66: gnu: acpica: Update to 20150410., Manolis Fragkiskos Ragkousis, 2015/05/21
- 25/66: gnu: Add libe-book., Manolis Fragkiskos Ragkousis, 2015/05/21
- 23/66: gnu: rename (gnu packages socat) to (gnu packages networking)., Manolis Fragkiskos Ragkousis, 2015/05/21
- 26/66: doc: Replace reference to profile.sh with sh-symlink, Manolis Fragkiskos Ragkousis, 2015/05/21
- 27/66: gnu: Add totem-pl-parser., Manolis Fragkiskos Ragkousis, 2015/05/21