Hi Guix!
I've just managed to bootstrap the node-tape package using some of the
helpers I introduced in 68941 (WIP).
I want to use and reproduce the method I applied for phpunit in 67092,
but it's a long method and I haven't had any input on it before now, so
I'd like to at least validate the method before reproducing it.
It consists in the following :
- defining packages in an alphabetical order, in their final form (so
using native-inputs that might not exist yet).
- defining those potentially missing native inputs in a recursive way
using package inheritance, by disabling tests and emptying
native-inputs for all inputs. In the case of PHP, this only includes
the PHPunit package, in patch 95 of 67092. In the case of node, I'll
probably need to do that on several packages (tape, tap, typescript at
least).
There are some upsides compared to an approach where we explicitely
define ...-bootstrap packages :
- way less code
- way more clarity about how the package is actually being bootstrapped.
- we don't have to define packages twice, and that matters for
PHP/Rust/JS where we have hundreds of packages for bootstrapping basic
test native-inputs.
But there are also big downsides :
- stability in time : I don't have much worry due to centralization
logic in PHP, not too much either for Rust, but in JS, bootstrapped
packages for tape might gain typescript as an input, making regular
headaches about how to bootstrap from there, if not using pinned
versions.
- computationally more intensive : updating a package could often mean
rebuilding the whole bootstrap chain. This is also the case for
unpinned inheriting ...-bootstrap packages.
I've actually done a lot of bootstrapping with a more traditionnal
approach with ...-bootstrap packages while working on the
antioxidant/rust build-system and that is quite cumbersome.
WDYT? Are there guidelines somewhere about how to do proper
bootstrapping in these cases where hundreds of packages are involved?
The actual inputs for PHPunit (patch 95 of 67092) :
(inputs
(letrec* ((package-list
(list php-sebastian-version
php-sebastian-type
php-sebastian-cli-parser
php-sebastian-recursion-context
php-sebastian-resource-operations
php-sebastian-object-enumerator
php-sebastian-global-state
php-sebastian-exporter
php-sebastian-environment
php-sebastian-diff
php-sebastian-comparator
php-sebastian-code-unit
php-phpunit-php-timer
php-phpunit-php-text-template
php-phpunit-php-invoker
php-phpunit-php-file-iterator
php-phpunit-php-code-coverage
php-phpspec-prophecy
php-phar-io-version
php-phar-io-manifest
php-myclabs-deep-copy
php-doctrine-instantiator))
(rewrite
(lambda (p)
(package
(inherit p)
(arguments '(#:tests? #f))
(native-inputs '())
(inputs (map (compose rewrite cadr) (package-inputs p)))))))
(map rewrite package-list)))
--
Best regards,
Nicolas Graves