Generic Builder Syntax
Recall from that the builder
looked something like this:
PATH=$perl/bin:$PATH
tar xvfz $src
cd hello-*
./configure --prefix=$out
make
make install
The builders for almost all Unix packages look like this — set up some
environment variables, unpack the sources, configure, build, and
install. For this reason the standard environment provides some Bash
functions that automate the build process. Here is what a builder
using the generic build facilities looks like:
buildInputs="$perl" ①
source $stdenv/setup ②
genericBuild ③
Here is what each line means:
The buildInputs variable tells
setup to use the indicated packages as
inputs
. This means that if a package provides a
bin subdirectory, it's added to
PATH; if it has a include
subdirectory, it's added to GCC's header search path; and so
on. (This is implemented in a modular way:
setup tries to source the file
pkg/nix-support/setup-hook
of all dependencies. These “setup hooks” can then set up whatever
environment variables they want; for instance, the setup hook for
Perl sets the PERL5LIB environment variable to
contain the lib/site_perl directories of all
inputs.)
The function genericBuild is defined in
the file $stdenv/setup.
The final step calls the shell function
genericBuild, which performs the steps that
were done explicitly in . The
generic builder is smart enough to figure out whether to unpack
the sources using gzip,
bzip2, etc. It can be customised in many ways;
see the Nixpkgs manual for details.
Discerning readers will note that the
buildInputs could just as well have been set in the Nix
expression, like this:
buildInputs = [ perl ];
The perl attribute can then be removed, and the
builder becomes even shorter:
source $stdenv/setup
genericBuild
In fact, mkDerivation provides a default builder
that looks exactly like that, so it is actually possible to omit the
builder for Hello entirely.