--- Begin Message ---
Subject: |
[PATCH] guix build: Add '--without-tests'. |
Date: |
Wed, 23 Sep 2020 22:42:49 +0200 |
* guix/scripts/build.scm (transform-package-tests): New procedure.
(%transformations, %transformation-options)
show-transformation-options-help): Add it.
* tests/scripts-build.scm ("options->transformation, without-tests"):
New test.
* doc/guix.texi (Package Transformation Options): Document it.
---
doc/guix.texi | 22 ++++++++++++++++++++++
guix/scripts/build.scm | 31 ++++++++++++++++++++++++++++---
tests/scripts-build.scm | 14 ++++++++++++++
3 files changed, 64 insertions(+), 3 deletions(-)
diff --git a/doc/guix.texi b/doc/guix.texi
index 949551a163..67d0a70ae0 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -9270,6 +9270,28 @@ guix build --with-branch=guile-sqlite3=master cuirass
This is similar to @option{--with-branch}, except that it builds from
@var{commit} rather than the tip of a branch. @var{commit} must be a valid
Git commit SHA1 identifier or a tag.
+
+@cindex test suite, skipping
+@item --without-tests=@var{package}
+Build @var{package} without running its tests. This can be useful in
+situations where you want to skip the lengthy test suite of a
+intermediate package, or if a package's test suite fails in a
+non-deterministic fashion. It should be used with care because running
+the test suite is a good way to ensure a package is working as intended.
+
+Turning off tests leads to a different store item. Consequently, when
+using this option, anything that depends on @var{package} must be
+rebuilt, as in this example:
+
+@example
+guix install --without-tests=python python-notebook
+@end example
+
+The command above installs @code{python-notebook} on top of
+@code{python} built without running its test suite. To do so, it also
+rebuilds everything that depends on @code{python}, including
+@code{python-notebook} itself.
+
@end table
@node Additional Build Options
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index 38e0516c95..f238e9b876 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -393,6 +393,25 @@ a checkout of the Git repository at the given URL."
(rewrite obj)
obj)))
+(define (transform-package-tests specs)
+ "Return a procedure that, when passed a package, sets #:tests? #f in its
+'arguments' field."
+ (define (package-without-tests p)
+ (package/inherit p
+ (arguments
+ (substitute-keyword-arguments (package-arguments p)
+ ((#:tests? _ #f) #f)))))
+
+ (define rewrite
+ (package-input-rewriting/spec (map (lambda (spec)
+ (cons spec package-without-tests))
+ specs)))
+
+ (lambda (store obj)
+ (if (package? obj)
+ (rewrite obj)
+ obj)))
+
(define %transformations
;; Transformations that can be applied to things to build. The car is the
;; key used in the option alist, and the cdr is the transformation
@@ -403,7 +422,8 @@ a checkout of the Git repository at the given URL."
(with-graft . ,transform-package-inputs/graft)
(with-branch . ,transform-package-source-branch)
(with-commit . ,transform-package-source-commit)
- (with-git-url . ,transform-package-source-git-url)))
+ (with-git-url . ,transform-package-source-git-url)
+ (without-tests . ,transform-package-tests)))
(define %transformation-options
;; The command-line interface to the above transformations.
@@ -423,7 +443,9 @@ a checkout of the Git repository at the given URL."
(option '("with-commit") #t #f
(parser 'with-commit))
(option '("with-git-url") #t #f
- (parser 'with-git-url)))))
+ (parser 'with-git-url))
+ (option '("without-tests") #t #f
+ (parser 'without-tests)))))
(define (show-transformation-options-help)
(display (G_ "
@@ -443,7 +465,10 @@ a checkout of the Git repository at the given URL."
build PACKAGE from COMMIT"))
(display (G_ "
--with-git-url=PACKAGE=URL
- build PACKAGE from the repository at URL")))
+ build PACKAGE from the repository at URL"))
+ (display (G_ "
+ --without-tests=PACKAGE
+ build PACKAGE without running its tests")))
(define (options->transformation opts)
diff --git a/tests/scripts-build.scm b/tests/scripts-build.scm
index 32876e956a..12114fc8f5 100644
--- a/tests/scripts-build.scm
+++ b/tests/scripts-build.scm
@@ -264,5 +264,19 @@
((("x" dep3))
(map package-source (list dep1 dep3))))))))))))
+(test-assert "options->transformation, without-tests"
+ (let* ((dep (dummy-package "dep"))
+ (p (dummy-package "foo"
+ (inputs `(("dep" ,dep)))))
+ (t (options->transformation '((without-tests . "dep")
+ (without-tests . "tar")))))
+ (with-store store
+ (let ((new (t store p)))
+ (match (bag-direct-inputs (package->bag new))
+ ((("dep" dep) ("tar" tar) _ ...)
+ ;; TODO: Check whether TAR has #:tests? #f when transformations
+ ;; apply to implicit inputs.
+ (equal? (package-arguments dep)
+ '(#:tests? #f))))))))
(test-end)
--
2.28.0
--- End Message ---
--- Begin Message ---
Subject: |
Re: [bug#43581] [PATCH] guix build: Add '--without-tests'. |
Date: |
Sun, 27 Sep 2020 22:58:44 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) |
Hi,
Jan Nieuwenhuizen <janneke@gnu.org> skribis:
>> * guix/scripts/build.scm (transform-package-tests): New procedure.
>> (%transformations, %transformation-options)
>
> Nitpick, use comma ^
>
>> show-transformation-options-help): Add it.
Oops yes, and I forgot to fix it before pushing. :-/
>> +Turning off tests leads to a different store item. Consequently, when
>> +using this option, anything that depends on @var{package} must be
>> +rebuilt, as in this example:
>
> This makes sense, so I'm curious about it's usefulness in practice, but
> there have been several times during porting sessions where I have
> disabled tests by editing the package.
Yeah, that’s the typical use case.
> $ time ./pre-inst-env guix build automake --without-tests=automake
> --verbosity=1
> The following derivation will be built:
> /gnu/store/0m9qp0rf74d6sray1ip6h050fzmrrya3-automake-1.16.2.drv
> building /gnu/store/0m9qp0rf74d6sray1ip6h050fzmrrya3-automake-1.16.2.drv...
> |offloading build of
> /gnu/store/0m9qp0rf74d6sray1ip6h050fzmrrya3-automake-1.16.2.drv to
> 'kluit.dezyne.org'
> /gnu/store/7qsz3avcfk6b6am0zj9ahsmjy8x6drxr-automake-1.16.2
>
> real 0m14.316s
> user 0m1.203s
> sys 0m0.072s
That’s also one of the packages I had in mind. :-)
Ricardo Wurmus <rekado@elephly.net> skribis:
> This looks good to me. It’s much more convenient for the casual user
> than to clone the Guix repo and to edit the package definition there, or
> to extend the package collection with GUIX_PACKAGE_PATH or even a
> channel.
Yup.
> I suppose we’d have to fix all those packages that moved the check phase
> without also checking for the “#:tests?” keyword. There are quite a few
> of those that thus wouldn’t be affected by “--without-tests”.
Right, hopefully there aren’t too many of those.
Pushed as f458cfbcc54ed87b1a87dd9e150ea276f17eab74, thanks!
Ludo’.
--- End Message ---