Subject: Re: [bug#30572] [PATCH 1/7] tests: Add tests for "guix pack".

From: [email-masked] (Ludovic Courtès)
Date: Thu, 08 Mar 2018 22:05:41 +0100

Howdy,

Chris Marusich <[email-masked]> skribis:

> [email-masked] (Ludovic Courtès) writes:
>
>>> +# Use --dry-run because it takes too long to actually build everything.
>>> +GUIX_BUILD_OPTIONS="--no-substitutes --dry-run"
>>> +export GUIX_BUILD_OPTIONS
>>> +
>>> +# Build a tarball.
>>> +guix pack coreutils
>>
>> It would be ideal if we could actually build something, but built
>> something cheap.
>>
>> The way we do that in those tests is by:
>>
>>   1. Using the ‘guile-bootstrap’ package as an example, under the
>>      assumption that it’s already available, does not require
>>      networking, and is built in one or two seconds.
>>
>>   2. Using ‘--bootstrap’ or a similar option so that the derivations use
>>      ‘guile-bootstrap’ instead of ‘guile-final’, for the same reason.
>>
>> See for instance tests/guix-package.sh.
>>
>> Would you be willing to try something along these lines?
>
> That's a good idea!  I tried it (see attached patch).  Unfortunately,
> even after adding a --bootstrap option, "guix pack" tries to build many
> things, so tests/guix-pack.sh takes hours to run the first time you try
> it (it ran for 2 hours on my laptop and then failed because gcc failed
> to build for unrelated reasons):

[...]

> It's quicker after the first time, but it's a hefty one-time cost.
>
> I think so many things need to be built because "guix pack" creates the
> pack using a gexp that uses packages.  For example, instead of executing
> "tar" by looking it up in the current environment (e.g. via system*), it
> builds the "tar" package and executes the resulting "tar" program in the
> gexp that creates the pack.  Therefore, even though we do use
> guile-bootstrap to run the gexp, Guix still need to build tar and all of
> its dependencies, so the test takes hours to run.  Can we do better?

Ah indeed, I hadn’t thought about tar.

We could arrange for ‘--bootstrap’ to use:

  (search-bootstrap-binary "tar")

instead of the ‘tar’ package.  We could do the same for ‘xz’.  (You’d
need a ‘trivial-build-system’ package that copies these two binaries in
$out/bin.)

How does that sound?

> Maybe we could move tests like these to a "long-running" test target
> (e.g., "make check-long-running").  I think this could work, but I would
> much rather just write tests that run quickly.

We could do that but let’s see if we can avoid it for now.  :-)

> Maybe we could rewrite "guix pack" so that it uses system* to run tar.

I’d rather not hinder reproducibility “just” for a test.

> Finally, maybe we could stick with running the tests in "dry-run" mode.
> I'm in favor of this idea, but obviously I'm a little biased.  :-)

Well, that would work too, indeed.  :-)

> From 72e672e795fe8f4d67f7e1805ba8b88c874f3fb1 Mon Sep 17 00:00:00 2001
> From: Chris Marusich <[email-masked]>
> Date: Tue, 20 Feb 2018 02:17:54 +0100
> Subject: [PATCH 1/7] tests: Add tests for "guix pack".
>
> * guix/scripts/pack.scm (%options): Add the --bootstrap option.
>   (show-help): Document it.
>   (guix-pack): Honor it.
> * doc/guix.texi (Invoking guix pack): Document the new --bootstrap
>   option.
> * tests/guix-pack.sh: New file.
> * Makefile.am (SH_TESTS): Add guix-pack.sh.
> * gnu/packages/package-management.scm (guix) <inputs>: Add util-linux.

[...]

> +# Build a tarball with a symlink.
> +the_pack="$(guix pack --bootstrap -S /opt/gnu/bin=bin guile-bootstrap)"

In general we use backticks instead of $(…) to stick to POSIX shells.

> +# Build a tarball pack of cross-compiled software.
> +guix pack --bootstrap --target=arm-unknown-linux-gnueabihf guile-bootstrap

This one is a little bit too costly (plus it wouldn’t work because
guile-bootstrap is not actually cross-compilable), so I’d suggest add
‘--dry-run’ and removing ‘-bootstrap’.  :-)

HTH!

Ludo’.