diff --git a/doc/manual/nix-build.xml b/doc/manual/nix-build.xml index f9530dc4b4172bdc2c23096105de3234e79db22c..6640898b44cdbc81b55f9605d50e7593dcaa8f87 100644 --- a/doc/manual/nix-build.xml +++ b/doc/manual/nix-build.xml @@ -79,8 +79,9 @@ or renamed. So don’t rename the symlink.</para></warning> the dependencies of the derivation, but not the derivation itself. It will then start an interactive shell in which all environment variables defined by the derivation have been set to their -corresponding values. This is useful for reproducing the environment -of a derivation for development.</para> +corresponding values, and the script <literal>$stdenv/setup</literal> +has been sourced. This is useful for reproducing the environment of a +derivation for development.</para> </refsection> @@ -144,9 +145,9 @@ also <xref linkend="sec-common-options" />.</phrase></para> <varlistentry><term><option>--command</option> <replaceable>cmd</replaceable></term> - <listitem><para>In the environment of the derivation, executeq the - command <replaceable>cmd</replaceable> instead of the default - interactive shell.</para></listitem> + <listitem><para>In the environment of the derivation, run the + shell command <replaceable>cmd</replaceable> instead of starting + an interactive shell.</para></listitem> </varlistentry> @@ -181,10 +182,10 @@ interactive shell in which to build it: <screen> $ nix-build '<nixpkgs>' --run-env -A pan -$ tar xf $src +$ unpackPhase $ cd pan-* -$ ./configure -$ make +$ configurePhase +$ buildPhase $ ./pan/gui/pan </screen> diff --git a/scripts/nix-build.in b/scripts/nix-build.in index 76dffd253d51152b16bd32cd7407cc5fb0e8f911..4ceec4df652ae9e4c3d6507d848f66237e63408b 100755 --- a/scripts/nix-build.in +++ b/scripts/nix-build.in @@ -3,6 +3,7 @@ use strict; use Nix::Config; use Nix::Store; +use Nix::Utils; use File::Temp qw(tempdir); @@ -15,7 +16,7 @@ my @buildArgs = (); my @exprs = (); my $shell = $ENV{SHELL} || "/bin/sh"; -my $envCommand = "p=\$PATH; source \$stdenv/setup; PATH=\$PATH:\$p; exec $shell"; +my $envCommand = ""; # interactive shell my @envExclude = (); @@ -124,7 +125,7 @@ for (my $n = 0; $n < scalar @ARGV; $n++) { elsif ($arg eq "--command") { $n++; die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - $envCommand = $ARGV[$n]; + $envCommand = "$ARGV[$n]\nexit $!"; } elsif ($arg eq "--exclude") { @@ -169,15 +170,23 @@ foreach my $expr (@exprs) { # Set the environment. $ENV{'NIX_BUILD_TOP'} = $ENV{'TMPDIR'} || "/tmp"; - foreach (keys %{$drv->{env}}) { - $ENV{$_} = $drv->{env}->{$_}; - } + $ENV{$_} = $drv->{env}->{$_} foreach keys %{$drv->{env}}; # Run a shell using the derivation's environment. For # convenience, source $stdenv/setup to setup additional - # environment variables. Also don't lose the current $PATH - # directories. - exec($ENV{SHELL}, "-c", $envCommand); + # environment variables and shell functions. Also don't lose + # the current $PATH directories. + my $rcfile = "$tmpDir/rc"; + writeFile( + $rcfile, + '[ -e ~/.bashrc ] && source ~/.bashrc; ' . + 'p=$PATH; ' . + '[ -e $stdenv/setup ] && source $stdenv/setup; ' . + 'PATH=$PATH:$p; ' . + 'set +e; ' . + 'PS1="\n\[\033[1;32m\][nix-build:\w]$\[\033[0m\] "; ' . + $envCommand); + exec($ENV{SHELL}, "--rcfile", $rcfile); die; }