forked from lix-project/lix
nix-build --run-env: Add a ‘--pure’ flag
This causes the environment to be (almost) cleared, thus giving a shell that more closely resembled the actual Nix derivation.
This commit is contained in:
parent
a4921b8ceb
commit
dc5f2e7da6
|
@ -42,6 +42,7 @@
|
||||||
<option>--run-env</option>
|
<option>--run-env</option>
|
||||||
<arg><option>--command</option> <replaceable>cmd</replaceable></arg>
|
<arg><option>--command</option> <replaceable>cmd</replaceable></arg>
|
||||||
<arg><option>--exclude</option> <replaceable>regexp</replaceable></arg>
|
<arg><option>--exclude</option> <replaceable>regexp</replaceable></arg>
|
||||||
|
<arg><option>--pure</option></arg>
|
||||||
</arg>
|
</arg>
|
||||||
<arg choice='plain' rep='repeat'><replaceable>paths</replaceable></arg>
|
<arg choice='plain' rep='repeat'><replaceable>paths</replaceable></arg>
|
||||||
</cmdsynopsis>
|
</cmdsynopsis>
|
||||||
|
@ -147,7 +148,10 @@ also <xref linkend="sec-common-options" />.</phrase></para>
|
||||||
|
|
||||||
<listitem><para>In the environment of the derivation, run the
|
<listitem><para>In the environment of the derivation, run the
|
||||||
shell command <replaceable>cmd</replaceable> instead of starting
|
shell command <replaceable>cmd</replaceable> instead of starting
|
||||||
an interactive shell.</para></listitem>
|
an interactive shell. However, if you end the shell command with
|
||||||
|
<literal>return</literal>, you still get an interactive shell.
|
||||||
|
This can be useful for doing any additional
|
||||||
|
initialisation.</para></listitem>
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
@ -159,6 +163,21 @@ also <xref linkend="sec-common-options" />.</phrase></para>
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry><term><option>--pure</option></term>
|
||||||
|
|
||||||
|
<listitem><para>If this flag is specified, the environment is
|
||||||
|
almost entirely cleared before the interactive shell is started,
|
||||||
|
so you get an environment that more closely corresponds to the
|
||||||
|
“real” Nix build. A few variables, in particular
|
||||||
|
<envar>HOME</envar>, <envar>USER</envar> and
|
||||||
|
<envar>DISPLAY</envar>, are retained. Note that
|
||||||
|
<filename>~/.bashrc</filename> and (depending on your Bash
|
||||||
|
installation) <filename>/etc/bashrc</filename> are still sourced,
|
||||||
|
so any variables set there will affect the interactive
|
||||||
|
shell.</para></listitem>
|
||||||
|
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
</refsection>
|
</refsection>
|
||||||
|
@ -189,6 +208,14 @@ $ buildPhase
|
||||||
$ ./pan/gui/pan
|
$ ./pan/gui/pan
|
||||||
</screen>
|
</screen>
|
||||||
|
|
||||||
|
To clear the environment first, and do some additional automatic
|
||||||
|
initialisation of the interactive shell:
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
$ nix-build '<nixpkgs>' --run-env -A pan --pure \
|
||||||
|
--command 'export NIX_DEBUG=1; export NIX_CORES=8; return'
|
||||||
|
</screen>
|
||||||
|
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>If a derivation has multiple outputs,
|
<para>If a derivation has multiple outputs,
|
||||||
|
|
|
@ -10,6 +10,7 @@ use File::Temp qw(tempdir);
|
||||||
my $dryRun = 0;
|
my $dryRun = 0;
|
||||||
my $verbose = 0;
|
my $verbose = 0;
|
||||||
my $runEnv = 0;
|
my $runEnv = 0;
|
||||||
|
my $pure = 0;
|
||||||
|
|
||||||
my @instArgs = ();
|
my @instArgs = ();
|
||||||
my @buildArgs = ();
|
my @buildArgs = ();
|
||||||
|
@ -134,6 +135,10 @@ for (my $n = 0; $n < scalar @ARGV; $n++) {
|
||||||
push @envExclude, $ARGV[$n];
|
push @envExclude, $ARGV[$n];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
elsif ($arg eq "--pure") {
|
||||||
|
$pure = 1;
|
||||||
|
}
|
||||||
|
|
||||||
elsif (substr($arg, 0, 1) eq "-") {
|
elsif (substr($arg, 0, 1) eq "-") {
|
||||||
push @buildArgs, $arg;
|
push @buildArgs, $arg;
|
||||||
}
|
}
|
||||||
|
@ -169,6 +174,14 @@ foreach my $expr (@exprs) {
|
||||||
or die "$0: failed to build all dependencies\n";
|
or die "$0: failed to build all dependencies\n";
|
||||||
|
|
||||||
# Set the environment.
|
# Set the environment.
|
||||||
|
if ($pure) {
|
||||||
|
foreach my $name (keys %ENV) {
|
||||||
|
next if $name eq "HOME" || $name eq "USER" || $name eq "LOGNAME" || $name eq "DISPLAY" || $name eq "PATH";
|
||||||
|
delete $ENV{$name};
|
||||||
|
}
|
||||||
|
# NixOS hack: prevent /etc/bashrc from sourcing /etc/profile.
|
||||||
|
$ENV{'__ETC_PROFILE_SOURCED'} = 1;
|
||||||
|
}
|
||||||
$ENV{'NIX_BUILD_TOP'} = $ENV{'TMPDIR'} || "/tmp";
|
$ENV{'NIX_BUILD_TOP'} = $ENV{'TMPDIR'} || "/tmp";
|
||||||
$ENV{$_} = $drv->{env}->{$_} foreach keys %{$drv->{env}};
|
$ENV{$_} = $drv->{env}->{$_} foreach keys %{$drv->{env}};
|
||||||
|
|
||||||
|
@ -180,9 +193,9 @@ foreach my $expr (@exprs) {
|
||||||
writeFile(
|
writeFile(
|
||||||
$rcfile,
|
$rcfile,
|
||||||
'[ -e ~/.bashrc ] && source ~/.bashrc; ' .
|
'[ -e ~/.bashrc ] && source ~/.bashrc; ' .
|
||||||
'p=$PATH; ' .
|
($pure ? '' : 'p=$PATH; ' ).
|
||||||
'[ -e $stdenv/setup ] && source $stdenv/setup; ' .
|
'[ -e $stdenv/setup ] && source $stdenv/setup; ' .
|
||||||
'PATH=$PATH:$p; ' .
|
($pure ? '' : 'PATH=$PATH:$p; ') .
|
||||||
'set +e; ' .
|
'set +e; ' .
|
||||||
'PS1="\n\[\033[1;32m\][nix-build:\w]$\[\033[0m\] "; ' .
|
'PS1="\n\[\033[1;32m\][nix-build:\w]$\[\033[0m\] "; ' .
|
||||||
$envCommand);
|
$envCommand);
|
||||||
|
|
Loading…
Reference in a new issue