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.
This commit is contained in:
		
							parent
							
								
									212e96f39c
								
							
						
					
					
						commit
						656390062a
					
				
					 2 changed files with 26 additions and 16 deletions
				
			
		|  | @ -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 | the dependencies of the derivation, but not the derivation itself.  It | ||||||
| will then start an interactive shell in which all environment | will then start an interactive shell in which all environment | ||||||
| variables defined by the derivation have been set to their | variables defined by the derivation have been set to their | ||||||
| corresponding values.  This is useful for reproducing the environment | corresponding values, and the script <literal>$stdenv/setup</literal> | ||||||
| of a derivation for development.</para> | has been sourced.  This is useful for reproducing the environment of a | ||||||
|  | derivation for development.</para> | ||||||
| 
 | 
 | ||||||
| </refsection> | </refsection> | ||||||
| 
 | 
 | ||||||
|  | @ -144,9 +145,9 @@ also <xref linkend="sec-common-options" />.</phrase></para> | ||||||
| 
 | 
 | ||||||
|   <varlistentry><term><option>--command</option> <replaceable>cmd</replaceable></term> |   <varlistentry><term><option>--command</option> <replaceable>cmd</replaceable></term> | ||||||
| 
 | 
 | ||||||
|     <listitem><para>In the environment of the derivation, executeq the |     <listitem><para>In the environment of the derivation, run the | ||||||
|     command <replaceable>cmd</replaceable> instead of the default |     shell command <replaceable>cmd</replaceable> instead of starting | ||||||
|     interactive shell.</para></listitem> |     an interactive shell.</para></listitem> | ||||||
| 
 | 
 | ||||||
|   </varlistentry> |   </varlistentry> | ||||||
| 
 | 
 | ||||||
|  | @ -181,10 +182,10 @@ interactive shell in which to build it: | ||||||
| 
 | 
 | ||||||
| <screen> | <screen> | ||||||
| $ nix-build '<nixpkgs>' --run-env -A pan | $ nix-build '<nixpkgs>' --run-env -A pan | ||||||
| $ tar xf $src | $ unpackPhase | ||||||
| $ cd pan-* | $ cd pan-* | ||||||
| $ ./configure | $ configurePhase | ||||||
| $ make | $ buildPhase | ||||||
| $ ./pan/gui/pan | $ ./pan/gui/pan | ||||||
| </screen> | </screen> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ | ||||||
| use strict; | use strict; | ||||||
| use Nix::Config; | use Nix::Config; | ||||||
| use Nix::Store; | use Nix::Store; | ||||||
|  | use Nix::Utils; | ||||||
| use File::Temp qw(tempdir); | use File::Temp qw(tempdir); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -15,7 +16,7 @@ my @buildArgs = (); | ||||||
| my @exprs = (); | my @exprs = (); | ||||||
| 
 | 
 | ||||||
| my $shell = $ENV{SHELL} || "/bin/sh"; | my $shell = $ENV{SHELL} || "/bin/sh"; | ||||||
| my $envCommand = "p=\$PATH; source \$stdenv/setup; PATH=\$PATH:\$p; exec $shell"; | my $envCommand = ""; # interactive shell | ||||||
| my @envExclude = (); | my @envExclude = (); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -124,7 +125,7 @@ for (my $n = 0; $n < scalar @ARGV; $n++) { | ||||||
|     elsif ($arg eq "--command") { |     elsif ($arg eq "--command") { | ||||||
|         $n++; |         $n++; | ||||||
|         die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; |         die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; | ||||||
|         $envCommand = $ARGV[$n]; |         $envCommand = "$ARGV[$n]\nexit $!"; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     elsif ($arg eq "--exclude") { |     elsif ($arg eq "--exclude") { | ||||||
|  | @ -169,15 +170,23 @@ foreach my $expr (@exprs) { | ||||||
| 
 | 
 | ||||||
|         # Set the environment. |         # Set the environment. | ||||||
|         $ENV{'NIX_BUILD_TOP'} = $ENV{'TMPDIR'} || "/tmp"; |         $ENV{'NIX_BUILD_TOP'} = $ENV{'TMPDIR'} || "/tmp"; | ||||||
|         foreach (keys %{$drv->{env}}) { |         $ENV{$_} = $drv->{env}->{$_} foreach keys %{$drv->{env}}; | ||||||
|             $ENV{$_} = $drv->{env}->{$_}; |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         # Run a shell using the derivation's environment.  For |         # Run a shell using the derivation's environment.  For | ||||||
|         # convenience, source $stdenv/setup to setup additional |         # convenience, source $stdenv/setup to setup additional | ||||||
|         # environment variables.  Also don't lose the current $PATH |         # environment variables and shell functions.  Also don't lose | ||||||
|         # directories. |         # the current $PATH directories. | ||||||
|         exec($ENV{SHELL}, "-c", $envCommand); |         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; |         die; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue