nix-super/doc/manual/src/expressions/generic-builder.md

65 lines
2.1 KiB
Markdown
Raw Normal View History

2020-07-23 00:17:48 +03:00
# Generic Builder Syntax
Recall from [???](#ex-hello-builder) 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:
2020-07-23 00:17:48 +03:00
buildInputs="$perl" ①
2020-07-23 00:17:48 +03:00
source $stdenv/setup ②
2020-07-23 00:17:48 +03:00
genericBuild ③
2020-07-23 00:17:48 +03:00
Here is what each line means:
1. The `buildInputs` variable tells `setup` to use the indicated
2020-07-23 11:44:54 +03:00
packages as “inputs”. This means that if a package provides a `bin`
subdirectory, it's added to `PATH`; if it has a `include`
2020-07-23 00:17:48 +03:00
subdirectory, it's added to GCC's header search path; and so
on.\[1\]
2. The function `genericBuild` is defined in the file `$stdenv/setup`.
2020-07-23 00:17:48 +03:00
3. The final step calls the shell function `genericBuild`, which
2020-07-23 00:17:48 +03:00
performs the steps that were done explicitly in
[???](#ex-hello-builder). 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.
2020-07-23 11:44:54 +03:00
Discerning readers will note that the `buildInputs` could just as well
2020-07-23 00:17:48 +03:00
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.
1. How does it work? `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;
2020-07-23 11:44:54 +03:00
for instance, the setup hook for Perl sets the `PERL5LIB`
environment variable to contain the `lib/site_perl` directories of
all inputs.