The primary motivating example is openssl:
Before the change full package build took 1m54s minutes.
After the change full package build takes 59s.
About a 2x speedup.
The difference is visible because openssl builds hundreds of manpages
spawning a perl process per manual in `install` phase. Such a workload
is very easy to parallelize.
Another example would be `autotools`+`libtool` based build system where
install step requires relinking. The more binaries there are to relink
the more gain it will be to do it in parallel.
The change enables parallel installs by default only for buiilds that
already have parallel builds enabled. There is a high chance those build
systems already handle parallelism well but some packages will fail.
Consistently propagated the enableParallelBuilding to:
- cmake (enabled by default, similar to builds)
- ninja (set parallelism explicitly, don't rely on default)
- bmake (enable when requested)
- scons (enable when requested)
- meson (set parallelism explicitly, don't rely on default)
- waf (set parallelism explicitly, don't rely on default)
- qmake-4/5/6 (enable by default, similar to builds)
- xorg (always enable, similar to builds)
checkInputs used to be added to nativeBuildInputs. Now we have
nativeCheckInputs to do that instead. Doing this treewide change allows
to keep hashes identical to before the introduction of
nativeCheckInputs.
bmake runs the ksh test if /bin/ksh exists. This is never a good
indication on platforms where we can sandbox and causes problems on
darwin where this path may exist, but never would be in PATH.
We solve this problem by always enabling the test and adding ksh to
checkInputs.
ksh doesn't seem to compile with musl, so we disable it on that
platform.
These are all read from the environment by the default bmake
stdlib (e.g. <bsd.prog.mk>, <bsd.own.mk>). Some of the default
values (like building cat pages instead of man pages, or stripping
binaries when installing) don't really make sense for Nixpkgs, so we
override them here for every build using bmake.
Eventually I'd like to unify the bmake setupHook and the NetBSD make
setupHook, but not today.
* Fix varmod-localtime test by setting TZ to an absolute path to the
appropriate file in TZDIR. This avoids having an extra patch for musl
which doesn't support TZDIR at all.
* Move tests into checkPhase by applying patch from alpine
* Fix build with musl by disabling deptgt-delete_on_error test (which I
haven't debugged myself, just copied this from alpine) and fixing a
test which fails due to differing output from strerror(3) between musl
and glibc. Also we need to add a shebang to install-sh, otherwise it
won't be executed in pkgsMusl.
With this change,
nativeBuildInputs = [ bmake ];
will cause bmake to be used instead of GNU make, but with the usual
stdenv API. Packages using bmake will no longer need to implement
their own {build,check,dist}Phase.