diff mbox series

[bug#43581] guix build: Add '--without-tests'.

Message ID 20200923204249.12058-1-ludo@gnu.org
State Accepted
Headers show
Series [bug#43581] guix build: Add '--without-tests'. | expand

Checks

Context Check Description
cbaines/comparison success View comparision
cbaines/git branch success View Git branch
cbaines/applying patch success View Laminar job

Commit Message

Ludovic Courtès Sept. 23, 2020, 8:42 p.m. UTC
* 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(-)

Comments

Janneke Nieuwenhuizen Sept. 23, 2020, 9:05 p.m. UTC | #1
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
Ricardo Wurmus Sept. 23, 2020, 9:37 p.m. UTC | #2
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”.
Ludovic Courtès Sept. 27, 2020, 8:58 p.m. UTC | #3
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 mbox series

Patch

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)