about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-02-19T16·08+0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-02-19T16·08+0100
commit36b90e72d7e09b983acfa08f9016e8b3ece5199d (patch)
tree8e34c7062af15c4e456ee5391cc4dc7449ce73fe
parenta897b583733aaf3ee7aa0efe495f9ea046567555 (diff)
nix-shell: Add --packages flag
This allows you to easily set up a build environment containing the
specified packages from Nixpkgs.  For example:

  $ nix-shell -p sqlite xorg.libX11 hello

will start a shell in which the given packages are present.
-rw-r--r--doc/manual/nix-shell.xml32
-rwxr-xr-xscripts/nix-build.in12
2 files changed, 41 insertions, 3 deletions
diff --git a/doc/manual/nix-shell.xml b/doc/manual/nix-shell.xml
index 8178cea69fe8..d5f70a9e66a2 100644
--- a/doc/manual/nix-shell.xml
+++ b/doc/manual/nix-shell.xml
@@ -18,7 +18,6 @@
 <refsynopsisdiv>
   <cmdsynopsis>
     <command>nix-shell</command>
-    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="opt-common-syn.xml#xmlns(db=http://docbook.org/ns/docbook)xpointer(/db:nop/*)" />
     <arg><option>--arg</option> <replaceable>name</replaceable> <replaceable>value</replaceable></arg>
     <arg><option>--argstr</option> <replaceable>name</replaceable> <replaceable>value</replaceable></arg>
     <arg>
@@ -31,7 +30,16 @@
     <arg><option>--command</option> <replaceable>cmd</replaceable></arg>
     <arg><option>--exclude</option> <replaceable>regexp</replaceable></arg>
     <arg><option>--pure</option></arg>
-    <arg><replaceable>path</replaceable></arg>
+    <group choice='req'>
+      <group choice='plain'>
+        <group>
+          <arg choice='plain'><option>--packages</option></arg>
+          <arg choice='plain'><option>-p</option></arg>
+        </group>
+        <replaceable>packages</replaceable>
+      </group>
+      <arg><replaceable>path</replaceable></arg>
+    </group>
   </cmdsynopsis>
 </refsynopsisdiv>
 
@@ -114,6 +122,18 @@ also <xref linkend="sec-common-options" />.</phrase></para>
 
   </varlistentry>
 
+  <varlistentry><term><option>--packages</option> / <option>-p</option></term>
+
+    <listitem><para>Set up an environment in which the specified
+    packages are present.  The command line arguments are interpreted
+    as attribute names inside the Nix Packages collection.  Thus,
+    <literal>nix-shell -p libjpeg openjdk</literal> will start a shell
+    in which the packages denoted by the attribute names
+    <varname>libjpeg</varname> and <varname>openjdk</varname> are
+    present.</para></listitem>
+
+  </varlistentry>
+
 </variablelist>
 
 <para>The following common options are supported:</para>
@@ -155,6 +175,14 @@ the following starts a shell containing the packages
 $ nix-shell -E 'with import &lt;nixpkgs> { }; runCommand "dummy" { buildInputs = [ sqlite xorg.libX11 ]; } ""'
 </screen>
 
+A shorter way to do the same is:
+
+<screen>
+$ nix-shell -p sqlite xorg.libX11
+[nix-shell]$ echo $NIX_LDFLAGS
+… -L/nix/store/j1zg5v…-sqlite-3.8.0.2/lib -L/nix/store/0gmcz9…-libX11-1.6.1/lib …
+</screen>
+
 </para>
 
 </refsection>
diff --git a/scripts/nix-build.in b/scripts/nix-build.in
index cc6ab423d825..452cb901fac2 100755
--- a/scripts/nix-build.in
+++ b/scripts/nix-build.in
@@ -12,6 +12,7 @@ my $verbose = 0;
 my $runEnv = $0 =~ /nix-shell$/;
 my $pure = 0;
 my $fromArgs = 0;
+my $packages = 0;
 
 my @instArgs = ();
 my @buildArgs = ();
@@ -150,6 +151,10 @@ for (my $n = 0; $n < scalar @ARGV; $n++) {
         push @instArgs, "--expr";
     }
 
+    elsif ($arg eq "--packages" || $arg eq "-p") {
+        $packages = 1;
+    }
+
     elsif (substr($arg, 0, 1) eq "-") {
         push @buildArgs, $arg;
     }
@@ -159,7 +164,12 @@ for (my $n = 0; $n < scalar @ARGV; $n++) {
     }
 }
 
-if (!$fromArgs) {
+if ($packages) {
+    push @instArgs, "--expr";
+    @exprs = (
+        'with import <nixpkgs> { }; runCommand "shell" { buildInputs = [ '
+        . (join " ", map { "($_)" } @exprs) . ']; } ""');
+} elsif (!$fromArgs) {
     @exprs = ("shell.nix") if scalar @exprs == 0 && $runEnv && -e "shell.nix";
     @exprs = ("default.nix") if scalar @exprs == 0;
 }