Message ID | 20200923204249.12058-1-ludo@gnu.org |
---|---|
State | Accepted |
Headers | show |
Series | [bug#43581] guix build: Add '--without-tests'. | expand |
Context | Check | Description |
---|---|---|
cbaines/comparison | success | View comparision |
cbaines/git branch | success | View Git branch |
cbaines/applying patch | success | View Laminar job |
Ludovic Courtès writes: Hi! --without-tests...beautiful! > * guix/scripts/build.scm (transform-package-tests): New procedure. > (%transformations, %transformation-options) Nitpick, use comma ^ > show-transformation-options-help): Add it. [..] > +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. [..] Otherwise, L*G*TM :-) Testing... --8<---------------cut here---------------start------------->8--- 23:02:36 janneke@dundal:~/src/guix/master [env] $ 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 23:02:55 janneke@dundal:~/src/guix/master [env] --8<---------------cut here---------------end--------------->8--- That's pretty amazing ;-) Greetings, Janneke
Ludovic Courtès <ludo@gnu.org> writes: > * 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. 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. 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”.
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’.
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)