forked from lix-project/lix
9dbfe242e3
seconds without producing output on stdout or stderr (NIX-65). This timeout can be specified using the `--max-silent-time' option or the `build-max-silent-time' configuration setting. The default is infinity (0). * Fix a tricky race condition: if we kill the build user before the child has done its setuid() to the build user uid, then it won't be killed, and we'll potentially lock up in pid.wait(). So also send a conventional kill to the child.
140 lines
3.3 KiB
Text
140 lines
3.3 KiB
Text
#! @perl@ -w -I@libexecdir@/nix
|
|
|
|
use strict;
|
|
|
|
|
|
my $addDrvLink = 0;
|
|
my $addOutLink = 1;
|
|
|
|
my $outLink;
|
|
my $drvLink;
|
|
|
|
my @instArgs = ();
|
|
my @buildArgs = ();
|
|
my @exprs = ();
|
|
|
|
|
|
END {
|
|
foreach my $fn (glob ".nix-build-tmp-*") {
|
|
unlink $fn;
|
|
}
|
|
}
|
|
|
|
sub intHandler {
|
|
exit 1;
|
|
}
|
|
|
|
$SIG{'INT'} = 'intHandler';
|
|
|
|
|
|
for (my $n = 0; $n < scalar @ARGV; $n++) {
|
|
my $arg = $ARGV[$n];
|
|
|
|
if ($arg eq "--help") {
|
|
print STDERR <<EOF;
|
|
Usage: nix-build [OPTION]... [FILE]...
|
|
|
|
`nix-build' builds the given Nix expressions (which
|
|
default to ./default.nix if none are given). A symlink called
|
|
`result' is placed in the current directory.
|
|
|
|
Flags:
|
|
--add-drv-link: create a symlink `derivation' to the store derivation
|
|
--drv-link NAME: create symlink NAME instead of `derivation'
|
|
--no-out-link: do not create the `result' symlink
|
|
--out-link / -o NAME: create symlink NAME instead of `result'
|
|
--attr ATTR: select a specific attribution from the Nix expression
|
|
|
|
Any additional flags are passed to `nix-store'.
|
|
EOF
|
|
exit 0;
|
|
# '` hack
|
|
}
|
|
|
|
elsif ($arg eq "--add-drv-link") {
|
|
$addDrvLink = 1;
|
|
}
|
|
|
|
elsif ($arg eq "--no-out-link" or $arg eq "--no-link") {
|
|
$addOutLink = 0;
|
|
}
|
|
|
|
elsif ($arg eq "--drv-link") {
|
|
$n++;
|
|
die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV;
|
|
$drvLink = $ARGV[$n];
|
|
}
|
|
|
|
elsif ($arg eq "--out-link" or $arg eq "-o") {
|
|
$n++;
|
|
die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV;
|
|
$outLink = $ARGV[$n];
|
|
}
|
|
|
|
elsif ($arg eq "--attr" or $arg eq "-A") {
|
|
$n++;
|
|
die "$0: `--attr' requires an argument\n" unless $n < scalar @ARGV;
|
|
push @instArgs, ("--attr", $ARGV[$n]);
|
|
}
|
|
|
|
elsif ($arg eq "--arg") {
|
|
die "$0: `--arg' requires two arguments\n" unless $n + 2 < scalar @ARGV;
|
|
push @instArgs, ("--arg", $ARGV[$n + 1], $ARGV[$n + 2]);
|
|
$n += 2;
|
|
}
|
|
|
|
elsif ($arg eq "--max-jobs" or $arg eq "-j" or $arg eq "--max-silent-time") {
|
|
$n++;
|
|
die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV;
|
|
push @buildArgs, ($arg, $ARGV[$n]);
|
|
}
|
|
|
|
elsif (substr($arg, 0, 1) eq "-") {
|
|
push @buildArgs, $arg;
|
|
}
|
|
|
|
else {
|
|
push @exprs, $arg;
|
|
}
|
|
}
|
|
|
|
@exprs = ("./default.nix") if scalar @exprs == 0;
|
|
|
|
|
|
if (!defined $drvLink) {
|
|
$drvLink = "derivation";
|
|
$drvLink = ".nix-build-tmp-" . $drvLink if !$addDrvLink;
|
|
}
|
|
|
|
if (!defined $outLink) {
|
|
$outLink = "result";
|
|
$outLink = ".nix-build-tmp-" . $outLink if !$addOutLink;
|
|
}
|
|
|
|
|
|
foreach my $expr (@exprs) {
|
|
|
|
# Instantiate.
|
|
my @drvPaths;
|
|
# !!! would prefer the perl 5.8.0 pipe open feature here.
|
|
my $pid = open(DRVPATHS, "-|") || exec "@bindir@/nix-instantiate", "--add-root", $drvLink, "--indirect", @instArgs, $expr;
|
|
while (<DRVPATHS>) {chomp; push @drvPaths, $_;}
|
|
close DRVPATHS or exit 1;
|
|
|
|
foreach my $drvPath (@drvPaths) {
|
|
my $target = readlink $drvPath;
|
|
print STDERR "store derivation is $target\n";
|
|
}
|
|
|
|
# Build.
|
|
my @outPaths;
|
|
$pid = open(OUTPATHS, "-|") || exec "@bindir@/nix-store", "--add-root", $outLink, "--indirect", "-rv",
|
|
@buildArgs, @drvPaths;
|
|
while (<OUTPATHS>) {chomp; push @outPaths, $_;}
|
|
close OUTPATHS or exit 1;
|
|
|
|
foreach my $outPath (@outPaths) {
|
|
my $target = readlink $outPath;
|
|
print "$target\n";
|
|
}
|
|
}
|