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.