about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2013-07-11T12·32+0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2013-07-11T12·32+0200
commit656390062a9b612df3238f9e6a0d5ce89c3de21c (patch)
tree091c7fd804c92d01c8a0a3a90c748d002b04198d
parent212e96f39c5120ef33b363647a58ebfd61fb3f5e (diff)
nix-build --run-env: Source $stdenv/setup in the interactive shell
This ensures that not just environment variables are set, but also
shell functions such as unpackPhase, configurePhase and so on.
-rw-r--r--doc/manual/nix-build.xml17
-rwxr-xr-xscripts/nix-build.in25
2 files changed, 26 insertions, 16 deletions
diff --git a/doc/manual/nix-build.xml b/doc/manual/nix-build.xml
index f9530dc4b417..6640898b44cd 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 '&lt;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 76dffd253d51..4ceec4df652a 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;
     }