mirror of
https://github.com/NixOS/nix.git
synced 2025-11-27 04:30:59 +01:00
Merged the Nix sources from the trunk from R9751 to R10133 for my State Nix project.
This commit is contained in:
parent
55b07d65b1
commit
a34a198006
46 changed files with 1323 additions and 265 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
AC_INIT(nix, 0.11)
|
AC_INIT(nix, 0.12)
|
||||||
AC_CONFIG_SRCDIR(README)
|
AC_CONFIG_SRCDIR(README)
|
||||||
AC_CONFIG_AUX_DIR(config)
|
AC_CONFIG_AUX_DIR(config)
|
||||||
AM_INIT_AUTOMAKE([dist-bzip2 foreign])
|
AM_INIT_AUTOMAKE([dist-bzip2 foreign])
|
||||||
|
|
@ -273,6 +273,10 @@ AM_CONDITIONAL(INIT_STATE, test "$init_state" = "yes")
|
||||||
AC_CHECK_FUNCS([setresuid setreuid lchown])
|
AC_CHECK_FUNCS([setresuid setreuid lchown])
|
||||||
|
|
||||||
|
|
||||||
|
# Nice to have, but not essential.
|
||||||
|
AC_CHECK_FUNCS([strsignal])
|
||||||
|
|
||||||
|
|
||||||
# This is needed if ATerm, Berkeley DB or bzip2 are static libraries,
|
# This is needed if ATerm, Berkeley DB or bzip2 are static libraries,
|
||||||
# and the Nix libraries are dynamic.
|
# and the Nix libraries are dynamic.
|
||||||
if test "$(uname)" = "Darwin"; then
|
if test "$(uname)" = "Darwin"; then
|
||||||
|
|
|
||||||
|
|
@ -36,10 +36,10 @@ build farm, since:
|
||||||
builds, and Nix expressions are self-contained.</para></listitem>
|
builds, and Nix expressions are self-contained.</para></listitem>
|
||||||
|
|
||||||
<listitem><para>Nix will only rebuild things that have actually
|
<listitem><para>Nix will only rebuild things that have actually
|
||||||
changed. For instance, if the sources of a component haven't
|
changed. For instance, if the sources of a package haven't changed
|
||||||
changed between runs of the build farm, the component won't be
|
between runs of the build farm, the package won't be rebuilt (unless
|
||||||
rebuild (unless it was garbage-collected). Also, dependencies
|
it was garbage-collected). Also, dependencies typically don't
|
||||||
typically don't change very often, so they only need to be built
|
change very often, so they only need to be built
|
||||||
once.</para></listitem>
|
once.</para></listitem>
|
||||||
|
|
||||||
<listitem><para>The results of a Nix build farm can be made
|
<listitem><para>The results of a Nix build farm can be made
|
||||||
|
|
|
||||||
|
|
@ -441,6 +441,15 @@ in config.someSetting</programlisting>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
<varlistentry><term><function>builtins.readFile</function>
|
||||||
|
<replaceable>path</replaceable></term>
|
||||||
|
|
||||||
|
<listitem><para>Return the contents of the file
|
||||||
|
<replaceable>path</replaceable> as a string.</para></listitem>
|
||||||
|
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
|
||||||
<varlistentry><term><function>removeAttrs</function>
|
<varlistentry><term><function>removeAttrs</function>
|
||||||
<replaceable>attrs</replaceable> <replaceable>list</replaceable></term>
|
<replaceable>attrs</replaceable> <replaceable>list</replaceable></term>
|
||||||
|
|
||||||
|
|
@ -477,7 +486,7 @@ removeAttrs { x = 1; y = 2; z = 3; } ["a" "x" "z"]</screen>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
|
||||||
<varlistentry><term><function>builtins.substr</function>
|
<varlistentry><term><function>builtins.substring</function>
|
||||||
<replaceable>start</replaceable> <replaceable>len</replaceable>
|
<replaceable>start</replaceable> <replaceable>len</replaceable>
|
||||||
<replaceable>s</replaceable></term>
|
<replaceable>s</replaceable></term>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -74,9 +74,9 @@
|
||||||
|
|
||||||
<glossentry><glossterm>Nix expression</glossterm>
|
<glossentry><glossterm>Nix expression</glossterm>
|
||||||
|
|
||||||
<glossdef><para>A high-level description of software components and
|
<glossdef><para>A high-level description of software packages and
|
||||||
compositions thereof. Deploying software using Nix entails writing
|
compositions thereof. Deploying software using Nix entails writing
|
||||||
Nix expressions for your components. Nix expressions are translated
|
Nix expressions for your packages. Nix expressions are translated
|
||||||
to derivations that are stored in the Nix store. These derivations
|
to derivations that are stored in the Nix store. These derivations
|
||||||
can then be built.</para></glossdef>
|
can then be built.</para></glossdef>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,9 +42,8 @@ platforms as well.</para>
|
||||||
<section><title>Obtaining Nix</title>
|
<section><title>Obtaining Nix</title>
|
||||||
|
|
||||||
<para>The easiest way to obtain Nix is to download a <link
|
<para>The easiest way to obtain Nix is to download a <link
|
||||||
xlink:href="http://www.cs.uu.nl/groups/ST/Trace/Nix">source
|
xlink:href="http://nix.cs.uu.nl/">source distribution</link>. RPMs
|
||||||
distribution</link>. RPMs for Red Hat, SuSE, and Fedora Core are also
|
for Red Hat, SuSE, and Fedora Core are also available.</para>
|
||||||
available.</para>
|
|
||||||
|
|
||||||
<para>Alternatively, the most recent sources of Nix can be obtained
|
<para>Alternatively, the most recent sources of Nix can be obtained
|
||||||
from its <link
|
from its <link
|
||||||
|
|
@ -161,12 +160,12 @@ options.</para>
|
||||||
|
|
||||||
<section><title>Installing from RPMs</title>
|
<section><title>Installing from RPMs</title>
|
||||||
|
|
||||||
<para>RPM packages of Nix can be downloaded from <uri
|
<para>RPM packages of Nix can be downloaded from <link
|
||||||
xlink:href="http://www.cs.uu.nl/groups/ST/Trace/Nix">http://www.cs.uu.nl/groups/ST/Trace/Nix</uri>.
|
xlink:href="http://nix.cs.uu.nl/" />. These RPMs should work for most
|
||||||
These RPMs should work for most fairly recent releases of SuSE and Red
|
fairly recent releases of SuSE and Red Hat Linux. They have been
|
||||||
Hat Linux. They have been known to work work on SuSE Linux 8.1 and
|
known to work work on SuSE Linux 8.1 and 9.0, and Red Hat 9.0. In
|
||||||
9.0, and Red Hat 9.0. In fact, it should work on any RPM-based Linux
|
fact, it should work on any RPM-based Linux distribution based on
|
||||||
distribution based on <literal>glibc</literal> 2.3 or later.</para>
|
<literal>glibc</literal> 2.3 or later.</para>
|
||||||
|
|
||||||
<para>Once downloaded, the RPMs can be installed or upgraded using
|
<para>Once downloaded, the RPMs can be installed or upgraded using
|
||||||
<command>rpm -U</command>. For example,
|
<command>rpm -U</command>. For example,
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ are complete. In general, when you’re making a package for a package
|
||||||
management system like RPM, you have to specify for each package what
|
management system like RPM, you have to specify for each package what
|
||||||
its dependencies are, but there are no guarantees that this
|
its dependencies are, but there are no guarantees that this
|
||||||
specification is complete. If you forget a dependency, then the
|
specification is complete. If you forget a dependency, then the
|
||||||
component will build and work correctly on <emphasis>your</emphasis>
|
package will build and work correctly on <emphasis>your</emphasis>
|
||||||
machine if you have the dependency installed, but not on the end
|
machine if you have the dependency installed, but not on the end
|
||||||
user's machine if it's not there.</para>
|
user's machine if it's not there.</para>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
<command>nix-build</command>
|
<command>nix-build</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/*)" />
|
<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>--arg</option> <replaceable>name</replaceable> <replaceable>value</replaceable></arg>
|
||||||
|
<arg><option>--argstr</option> <replaceable>name</replaceable> <replaceable>value</replaceable></arg>
|
||||||
<arg>
|
<arg>
|
||||||
<group choice='req'>
|
<group choice='req'>
|
||||||
<arg choice='plain'><option>--attr</option></arg>
|
<arg choice='plain'><option>--attr</option></arg>
|
||||||
|
|
|
||||||
|
|
@ -62,11 +62,11 @@ also <xref linkend="sec-channels" />.</para>
|
||||||
<varlistentry><term><option>--update</option></term>
|
<varlistentry><term><option>--update</option></term>
|
||||||
|
|
||||||
<listitem><para>Downloads the Nix expressions of all subscribed
|
<listitem><para>Downloads the Nix expressions of all subscribed
|
||||||
channels, makes the conjunction of these the default for
|
channels, makes them the default for <command>nix-env</command>
|
||||||
<command>nix-env</command> operations (by calling <command>nix-env
|
operations (by symlinking them in the directory
|
||||||
-I</command>), and performs a <command>nix-pull</command> on the
|
<filename>~/.nix-defexpr</filename>), and performs a
|
||||||
manifests of all channels to make pre-built binaries
|
<command>nix-pull</command> on the manifests of all channels to
|
||||||
available.</para></listitem>
|
make pre-built binaries available.</para></listitem>
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
<command>nix-env</command>
|
<command>nix-env</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/*)" />
|
<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>--arg</option> <replaceable>name</replaceable> <replaceable>value</replaceable></arg>
|
||||||
|
<arg><option>--argstr</option> <replaceable>name</replaceable> <replaceable>value</replaceable></arg>
|
||||||
<arg>
|
<arg>
|
||||||
<group choice='req'>
|
<group choice='req'>
|
||||||
<arg choice='plain'><option>--file</option></arg>
|
<arg choice='plain'><option>--file</option></arg>
|
||||||
|
|
@ -48,7 +49,7 @@
|
||||||
<refsection><title>Description</title>
|
<refsection><title>Description</title>
|
||||||
|
|
||||||
<para>The command <command>nix-env</command> is used to manipulate Nix
|
<para>The command <command>nix-env</command> is used to manipulate Nix
|
||||||
user environments. User environments are sets of software components
|
user environments. User environments are sets of software packages
|
||||||
available to a user at some point in time. In other words, they are a
|
available to a user at some point in time. In other words, they are a
|
||||||
synthesised view of the programs available in the Nix store. There
|
synthesised view of the programs available in the Nix store. There
|
||||||
may be many user environments: different users can have different
|
may be many user environments: different users can have different
|
||||||
|
|
@ -141,13 +142,33 @@ linkend="sec-common-options" />.</para>
|
||||||
|
|
||||||
<varlistentry><term><filename>~/.nix-defexpr</filename></term>
|
<varlistentry><term><filename>~/.nix-defexpr</filename></term>
|
||||||
|
|
||||||
<!-- !!! .nix-defexpr can be a directory now -->
|
<listitem><para>A directory that contains the default Nix
|
||||||
|
expressions used by the <option>--install</option>,
|
||||||
<listitem><para>The default Nix expression used by the
|
<option>--upgrade</option>, and <option>--query
|
||||||
<option>--install</option>, <option>--upgrade</option>, and
|
--available</option> operations to obtain derivations. The
|
||||||
<option>--query --available</option> operations to obtain
|
<option>--file</option> option may be used to override this
|
||||||
derivations. The <option>--file</option> option may be used to
|
default.</para>
|
||||||
override this default.</para></listitem>
|
|
||||||
|
<para>The Nix expressions in this directory are combined into a
|
||||||
|
single attribute set, with each file as an attribute that has the
|
||||||
|
name of the file. Thus, if <filename>~/.nix-defexpr</filename>
|
||||||
|
contains two files, <filename>foo</filename> and
|
||||||
|
<filename>bar</filename>, then the default Nix expression will
|
||||||
|
essentially be
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
{
|
||||||
|
foo = import ~/.nix-defexpr/foo;
|
||||||
|
bar = import ~/.nix-defexpr/bar;
|
||||||
|
}</programlisting>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>The command <command>nix-channel</command> places symlinks
|
||||||
|
to the downloaded Nix expressions from each subscribed channel in
|
||||||
|
this directory.</para>
|
||||||
|
|
||||||
|
</listitem>
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
|
@ -212,11 +233,21 @@ number of possible ways:
|
||||||
<para>If there are multiple derivations matching a name in
|
<para>If there are multiple derivations matching a name in
|
||||||
<replaceable>args</replaceable> that have the same name (e.g.,
|
<replaceable>args</replaceable> that have the same name (e.g.,
|
||||||
<literal>gcc-3.3.6</literal> and <literal>gcc-4.1.1</literal>), then
|
<literal>gcc-3.3.6</literal> and <literal>gcc-4.1.1</literal>), then
|
||||||
only the highest version will be installed. You can force the
|
the derivation with the highest <emphasis>priority</emphasis> is
|
||||||
installation of multiple derivations with the same name by being
|
used. A derivation can define a priority by declaring the
|
||||||
specific about the versions. For instance, <literal>nix-env -i
|
<varname>meta.priority</varname> attribute. This attribute should
|
||||||
gcc-3.3.6 gcc-4.1.1</literal> will install both version of GCC (and
|
be a number, with a higher value denoting a lower priority. The
|
||||||
will probably cause a user environment conflict!).</para></listitem>
|
default priority is <literal>0</literal>.</para>
|
||||||
|
|
||||||
|
<para>If there are multiple matching derivations with the same
|
||||||
|
priority, then the derivation with the highest version will be
|
||||||
|
installed.</para>
|
||||||
|
|
||||||
|
<para>You can force the installation of multiple derivations with
|
||||||
|
the same name by being specific about the versions. For instance,
|
||||||
|
<literal>nix-env -i gcc-3.3.6 gcc-4.1.1</literal> will install both
|
||||||
|
version of GCC (and will probably cause a user environment
|
||||||
|
conflict!).</para></listitem>
|
||||||
|
|
||||||
<listitem><para>If <link
|
<listitem><para>If <link
|
||||||
linkend='opt-attr'><option>--attr</option></link>
|
linkend='opt-attr'><option>--attr</option></link>
|
||||||
|
|
@ -263,6 +294,15 @@ number of possible ways:
|
||||||
|
|
||||||
<variablelist>
|
<variablelist>
|
||||||
|
|
||||||
|
<varlistentry><term><option>--prebuild-only</option> / <option>-b</option></term>
|
||||||
|
|
||||||
|
<listitem><para>Use only derivations for which a substitute is
|
||||||
|
registered, i.e., there is a pre-built binary available that can
|
||||||
|
be downloaded in lieu of building the derivation. Thus, no
|
||||||
|
packages will be built from source.</para></listitem>
|
||||||
|
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry><term><option>--preserve-installed</option></term>
|
<varlistentry><term><option>--preserve-installed</option></term>
|
||||||
<term><option>-P</option></term>
|
<term><option>-P</option></term>
|
||||||
|
|
||||||
|
|
@ -378,7 +418,7 @@ the following paths will be substituted:
|
||||||
|
|
||||||
<!--######################################################################-->
|
<!--######################################################################-->
|
||||||
|
|
||||||
<refsection><title>Operation <option>--upgrade</option></title>
|
<refsection xml:id="rsec-nix-env-upgrade"><title>Operation <option>--upgrade</option></title>
|
||||||
|
|
||||||
<refsection><title>Synopsis</title>
|
<refsection><title>Synopsis</title>
|
||||||
|
|
||||||
|
|
@ -463,6 +503,9 @@ installed.</para>
|
||||||
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
|
<para>For the other flags, see <option
|
||||||
|
linkend="rsec-nix-env-install">--install</option>.</para>
|
||||||
|
|
||||||
</refsection>
|
</refsection>
|
||||||
|
|
||||||
<refsection><title>Examples</title>
|
<refsection><title>Examples</title>
|
||||||
|
|
@ -572,6 +615,111 @@ $ nix-env -e '*' <lineannotation>(remove everything)</lineannotation></screen>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!--######################################################################-->
|
||||||
|
|
||||||
|
<refsection xml:id="rsec-nix-env-set-flag"><title>Operation <option>--set-flag</option></title>
|
||||||
|
|
||||||
|
<refsection><title>Synopsis</title>
|
||||||
|
|
||||||
|
<cmdsynopsis>
|
||||||
|
<command>nix-env</command>
|
||||||
|
<arg choice='plain'><option>--set-flag</option></arg>
|
||||||
|
<arg choice='plain'><replaceable>name</replaceable></arg>
|
||||||
|
<arg choice='plain'><replaceable>value</replaceable></arg>
|
||||||
|
<arg choice='plain' rep='repeat'><replaceable>drvnames</replaceable></arg>
|
||||||
|
</cmdsynopsis>
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
<refsection><title>Description</title>
|
||||||
|
|
||||||
|
<para>The <option>--set-flag</option> operation allows meta attributes
|
||||||
|
of installed packages to be modified. There are several attributes
|
||||||
|
that can be usefully modified, because they affect the behaviour of
|
||||||
|
<command>nix-env</command> or the user environment build
|
||||||
|
script:
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
|
||||||
|
<listitem><para><varname>priority</varname> can be changed to
|
||||||
|
resolve filename clashes. The user environment build script uses
|
||||||
|
the <varname>meta.priority</varname> attribute of derivations to
|
||||||
|
resolve filename collisions between packages. Lower priority values
|
||||||
|
denote a higher priority. For instance, the GCC wrapper package and
|
||||||
|
the Binutils package in Nixpkgs both have a file
|
||||||
|
<filename>bin/ld</filename>, so previously if you tried to install
|
||||||
|
both you would get a collision. Now, on the other hand, the GCC
|
||||||
|
wrapper declares a higher priority than Binutils, so the former’s
|
||||||
|
<filename>bin/ld</filename> is symlinked in the user
|
||||||
|
environment.</para></listitem>
|
||||||
|
|
||||||
|
<listitem><para><varname>keep</varname> can be set to
|
||||||
|
<literal>true</literal> to prevent the package from being upgraded
|
||||||
|
or replaced. This is useful if you want to hang on to an older
|
||||||
|
version of a package.</para></listitem>
|
||||||
|
|
||||||
|
<listitem><para><varname>active</varname> can be set to
|
||||||
|
<literal>false</literal> to “disable” the package. That is, no
|
||||||
|
symlinks will be generated to the files of the package, but it
|
||||||
|
remains part of the profile (so it won’t be garbage-collected). It
|
||||||
|
can be set back to <literal>true</literal> to re-enable the
|
||||||
|
package.</para></listitem>
|
||||||
|
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
<refsection><title>Examples</title>
|
||||||
|
|
||||||
|
<para>To prevent the currently installed Firefox from being upgraded:
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
$ nix-env --set-flag keep true firefox</screen>
|
||||||
|
|
||||||
|
After this, <command>nix-env -u</command> will ignore Firefox.</para>
|
||||||
|
|
||||||
|
<para>To disable the currently installed Firefox, then install a new
|
||||||
|
Firefox while the old remains part of the profile:
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
$ nix-env -q \*
|
||||||
|
firefox-2.0.0.9 <lineannotation>(the current one)</lineannotation>
|
||||||
|
|
||||||
|
$ nix-env --preserve-installed -i firefox-2.0.0.11
|
||||||
|
installing `firefox-2.0.0.11'
|
||||||
|
building path(s) `/nix/store/myy0y59q3ig70dgq37jqwg1j0rsapzsl-user-environment'
|
||||||
|
Collission between `/nix/store/<replaceable>...</replaceable>-firefox-2.0.0.11/bin/firefox'
|
||||||
|
and `/nix/store/<replaceable>...</replaceable>-firefox-2.0.0.9/bin/firefox'.
|
||||||
|
<lineannotation>(i.e., can’t have two active at the same time)</lineannotation>
|
||||||
|
|
||||||
|
$ nix-env --set-flag active false firefox
|
||||||
|
setting flag on `firefox-2.0.0.9'
|
||||||
|
|
||||||
|
$ nix-env --preserve-installed -i firefox-2.0.0.11
|
||||||
|
installing `firefox-2.0.0.11'
|
||||||
|
|
||||||
|
$ nix-env -q \*
|
||||||
|
firefox-2.0.0.11 <lineannotation>(the enabled one)</lineannotation>
|
||||||
|
firefox-2.0.0.9 <lineannotation>(the disabled one)</lineannotation></screen>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>To make files from <literal>binutils</literal> take precedence
|
||||||
|
over files from <literal>gcc</literal>:
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
$ nix-env --set-flag priority 5 binutils
|
||||||
|
$ nix-env --set-flag priority 10 gcc</screen>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!--######################################################################-->
|
<!--######################################################################-->
|
||||||
|
|
||||||
<refsection><title>Operation <option>--query</option></title>
|
<refsection><title>Operation <option>--query</option></title>
|
||||||
|
|
@ -598,7 +746,12 @@ $ nix-env -e '*' <lineannotation>(remove everything)</lineannotation></screen>
|
||||||
<arg choice='plain'><option>-s</option></arg>
|
<arg choice='plain'><option>-s</option></arg>
|
||||||
</group>
|
</group>
|
||||||
</arg>
|
</arg>
|
||||||
<arg><option>--attr-path</option></arg>
|
<arg>
|
||||||
|
<group choice='req'>
|
||||||
|
<arg choice='plain'><option>--attr-path</option></arg>
|
||||||
|
<arg choice='plain'><option>-P</option></arg>
|
||||||
|
</group>
|
||||||
|
</arg>
|
||||||
<arg><option>--no-name</option></arg>
|
<arg><option>--no-name</option></arg>
|
||||||
<arg>
|
<arg>
|
||||||
<group choice='req'>
|
<group choice='req'>
|
||||||
|
|
@ -621,6 +774,7 @@ $ nix-env -e '*' <lineannotation>(remove everything)</lineannotation></screen>
|
||||||
<arg choice='plain'><option>-b</option></arg>
|
<arg choice='plain'><option>-b</option></arg>
|
||||||
</group>
|
</group>
|
||||||
</arg>
|
</arg>
|
||||||
|
|
||||||
<arg>
|
<arg>
|
||||||
<group choice='req'>
|
<group choice='req'>
|
||||||
<arg choice='plain'><option>--attr</option></arg>
|
<arg choice='plain'><option>--attr</option></arg>
|
||||||
|
|
@ -707,6 +861,16 @@ user environment elements, etc. -->
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry><term><option>--prebuild-only</option> / <option>-b</option></term>
|
||||||
|
|
||||||
|
<listitem><para>Show only derivations for which a substitute is
|
||||||
|
registered, i.e., there is a pre-built binary available that can
|
||||||
|
be downloaded in lieu of building the derivation. Thus, this
|
||||||
|
shows all packages that probably can be installed
|
||||||
|
quickly.</para></listitem>
|
||||||
|
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry><term><option>--status</option></term>
|
<varlistentry><term><option>--status</option></term>
|
||||||
<term><option>-s</option></term>
|
<term><option>-s</option></term>
|
||||||
|
|
||||||
|
|
@ -726,8 +890,8 @@ user environment elements, etc. -->
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry><term><option>--attr</option></term>
|
<varlistentry><term><option>--attr-path</option></term>
|
||||||
<term><option>-a</option></term>
|
<term><option>-P</option></term>
|
||||||
|
|
||||||
<listitem><para>Print the <emphasis>attribute path</emphasis> of
|
<listitem><para>Print the <emphasis>attribute path</emphasis> of
|
||||||
the derivation, which can be used to unambiguously select it using
|
the derivation, which can be used to unambiguously select it using
|
||||||
|
|
@ -750,35 +914,35 @@ user environment elements, etc. -->
|
||||||
<listitem><para>Compare installed versions to available versions,
|
<listitem><para>Compare installed versions to available versions,
|
||||||
or vice versa (if <option>--available</option> is given). This is
|
or vice versa (if <option>--available</option> is given). This is
|
||||||
useful for quickly seeing whether upgrades for installed
|
useful for quickly seeing whether upgrades for installed
|
||||||
components are available in a Nix expression. A column is added
|
packages are available in a Nix expression. A column is added
|
||||||
with the following meaning:
|
with the following meaning:
|
||||||
|
|
||||||
<variablelist>
|
<variablelist>
|
||||||
|
|
||||||
<varlistentry><term><literal><</literal> <replaceable>version</replaceable></term>
|
<varlistentry><term><literal><</literal> <replaceable>version</replaceable></term>
|
||||||
|
|
||||||
<listitem><para>A newer version of the component is available
|
<listitem><para>A newer version of the package is available
|
||||||
or installed.</para></listitem>
|
or installed.</para></listitem>
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry><term><literal>=</literal> <replaceable>version</replaceable></term>
|
<varlistentry><term><literal>=</literal> <replaceable>version</replaceable></term>
|
||||||
|
|
||||||
<listitem><para>At most the same version of the component is
|
<listitem><para>At most the same version of the package is
|
||||||
available or installed.</para></listitem>
|
available or installed.</para></listitem>
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry><term><literal>></literal> <replaceable>version</replaceable></term>
|
<varlistentry><term><literal>></literal> <replaceable>version</replaceable></term>
|
||||||
|
|
||||||
<listitem><para>Only older versions of the component are
|
<listitem><para>Only older versions of the package are
|
||||||
available or installed.</para></listitem>
|
available or installed.</para></listitem>
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry><term><literal>- ?</literal></term>
|
<varlistentry><term><literal>- ?</literal></term>
|
||||||
|
|
||||||
<listitem><para>No version of the component is available or
|
<listitem><para>No version of the package is available or
|
||||||
installed.</para></listitem>
|
installed.</para></listitem>
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
@ -819,6 +983,14 @@ user environment elements, etc. -->
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry><term><option>--meta</option></term>
|
||||||
|
|
||||||
|
<listitem><para>Print all of the meta-attributes of the
|
||||||
|
derivation. This option is only available with
|
||||||
|
<option>--xml</option>.</para></listitem>
|
||||||
|
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
</refsection>
|
</refsection>
|
||||||
|
|
|
||||||
|
|
@ -779,4 +779,178 @@ archive is read from standard input.</para>
|
||||||
</refsection>
|
</refsection>
|
||||||
|
|
||||||
|
|
||||||
|
<!--######################################################################-->
|
||||||
|
|
||||||
|
<refsection xml:id='refsec-nix-store-export'><title>Operation <option>--export</option></title>
|
||||||
|
|
||||||
|
<refsection>
|
||||||
|
<title>Synopsis</title>
|
||||||
|
<cmdsynopsis>
|
||||||
|
<command>nix-store</command>
|
||||||
|
<arg choice='plain'><option>--export</option></arg>
|
||||||
|
<arg choice='plain' rep='repeat'><replaceable>paths</replaceable></arg>
|
||||||
|
</cmdsynopsis>
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
<refsection><title>Description</title>
|
||||||
|
|
||||||
|
<para>The operation <option>--export</option> writes a serialisation
|
||||||
|
of the specified store paths to standard output in a format that can
|
||||||
|
be imported into another Nix store with <command
|
||||||
|
linkend="refsec-nix-store-import">nix-store --import</command>. This
|
||||||
|
is like <command linkend="refsec-nix-store-dump">nix-store
|
||||||
|
--dump</command>, except that the NAR archive produced by that command
|
||||||
|
doesn’t contain the necessary meta-information to allow it to be
|
||||||
|
imported into another Nix store (namely, the set of references of the
|
||||||
|
path).</para>
|
||||||
|
|
||||||
|
<para>This command does not produce a <emphasis>closure</emphasis> of
|
||||||
|
the specified paths, so if a store path references other store paths
|
||||||
|
that are missing in the target Nix store, the import will fail. To
|
||||||
|
copy a whole closure, do something like
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
$ nix-store --export $(nix-store -qR <replaceable>paths</replaceable>) > out</screen>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>For an example of how <option>--export</option> and
|
||||||
|
<option>--import</option> can be used, see the source of the <command
|
||||||
|
linkend="sec-nix-copy-closure">nix-copy-closure</command>
|
||||||
|
command.</para>
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
|
||||||
|
<!--######################################################################-->
|
||||||
|
|
||||||
|
<refsection xml:id='refsec-nix-store-import'><title>Operation <option>--import</option></title>
|
||||||
|
|
||||||
|
<refsection>
|
||||||
|
<title>Synopsis</title>
|
||||||
|
<cmdsynopsis>
|
||||||
|
<command>nix-store</command>
|
||||||
|
<arg choice='plain'><option>--import</option></arg>
|
||||||
|
</cmdsynopsis>
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
<refsection><title>Description</title>
|
||||||
|
|
||||||
|
<para>The operation <option>--export</option> reads a serialisation of
|
||||||
|
a set of store paths produced by <command
|
||||||
|
linkend="refsec-nix-store-export">nix-store --import</command> from
|
||||||
|
standard input and adds those store paths to the Nix store. Paths
|
||||||
|
that already exist in the Nix store are ignored. If a path refers to
|
||||||
|
another path that doesn’t exist in the Nix store, the import
|
||||||
|
fails.</para>
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
|
||||||
|
<!--######################################################################-->
|
||||||
|
|
||||||
|
<refsection><title>Operation <option>--optimise</option></title>
|
||||||
|
|
||||||
|
<refsection>
|
||||||
|
<title>Synopsis</title>
|
||||||
|
<cmdsynopsis>
|
||||||
|
<command>nix-store</command>
|
||||||
|
<arg choice='plain'><option>--optimise</option></arg>
|
||||||
|
</cmdsynopsis>
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
<refsection><title>Description</title>
|
||||||
|
|
||||||
|
<para>The operation <option>--optimise</option> reduces Nix store disk
|
||||||
|
space usage by finding identical files in the store and hard-linking
|
||||||
|
them to each other. It typically reduces the size of the store by
|
||||||
|
something like 25-35%. Only regular files and symlinks are
|
||||||
|
hard-linked in this manner. Files are considered identical when they
|
||||||
|
have the same NAR archive serialisation: that is, regular files must
|
||||||
|
have the same contents and permission (executable or non-executable),
|
||||||
|
and symlinks must have the same contents.</para>
|
||||||
|
|
||||||
|
<para>After completion, or when the command is interrupted, a report
|
||||||
|
on the achieved savings is printed on standard error.</para>
|
||||||
|
|
||||||
|
<para>Use <option>-vv</option> or <option>-vvv</option> to get some
|
||||||
|
progress indication.</para>
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
<refsection><title>Example</title>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
$ nix-store --optimise
|
||||||
|
hashing files in `/nix/store/qhqx7l2f1kmwihc9bnxs7rc159hsxnf3-gcc-4.1.1'
|
||||||
|
<replaceable>...</replaceable>
|
||||||
|
541838819 bytes (516.74 MiB) freed by hard-linking 54143 files;
|
||||||
|
there are 114486 files with equal contents out of 215894 files in total
|
||||||
|
</screen>
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
|
||||||
|
<!--######################################################################-->
|
||||||
|
|
||||||
|
<refsection><title>Operation <option>--read-log</option></title>
|
||||||
|
|
||||||
|
<refsection>
|
||||||
|
<title>Synopsis</title>
|
||||||
|
<cmdsynopsis>
|
||||||
|
<command>nix-store</command>
|
||||||
|
<group choice='req'>
|
||||||
|
<arg choice='plain'><option>--read-log</option></arg>
|
||||||
|
<arg choice='plain'><option>-l</option></arg>
|
||||||
|
</group>
|
||||||
|
<arg choice='plain' rep='repeat'><replaceable>paths</replaceable></arg>
|
||||||
|
</cmdsynopsis>
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
<refsection><title>Description</title>
|
||||||
|
|
||||||
|
<para>The operation <option>--read-log</option> prints the build log
|
||||||
|
of the specified store paths on standard output. The build log is
|
||||||
|
whatever the builder of a derivation wrote to standard output and
|
||||||
|
standard error. If a store path is not a derivation, the deriver of
|
||||||
|
the store path is used.</para>
|
||||||
|
|
||||||
|
<para>Build logs are kept in
|
||||||
|
<filename>/nix/var/log/nix/drvs</filename>. However, there is no
|
||||||
|
guarantee that a build log is available for any particular store
|
||||||
|
path. For instance, if the path was downloaded as a pre-built binary
|
||||||
|
through a substitute, then the log is unavailable.</para>
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
<refsection><title>Example</title>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
$ nix-store -l $(which ktorrent)
|
||||||
|
building /nix/store/dhc73pvzpnzxhdgpimsd9sw39di66ph1-ktorrent-2.2.1
|
||||||
|
unpacking sources
|
||||||
|
unpacking source archive /nix/store/p8n1jpqs27mgkjw07pb5269717nzf5f8-ktorrent-2.2.1.tar.gz
|
||||||
|
ktorrent-2.2.1/
|
||||||
|
ktorrent-2.2.1/NEWS
|
||||||
|
<replaceable>...</replaceable>
|
||||||
|
</screen>
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
|
||||||
|
</refsection>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- TODO: export, import operations -->
|
||||||
|
|
||||||
|
|
||||||
</refentry>
|
</refentry>
|
||||||
|
|
|
||||||
|
|
@ -268,6 +268,17 @@
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
|
||||||
|
<varlistentry><term><option>--argstr</option> <replaceable>name</replaceable> <replaceable>value</replaceable></term>
|
||||||
|
|
||||||
|
<listitem><para>This option is like <option>--arg</option>, only the
|
||||||
|
value is not a Nix expression but a string. So instead of
|
||||||
|
<literal>--arg system \"i686-linux\"</literal> (the outer quotes are
|
||||||
|
to keep the shell happy) you can say <literal>--argstr system
|
||||||
|
i686-linux</literal>.</para></listitem>
|
||||||
|
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
|
||||||
<varlistentry xml:id="opt-attr"><term><option>--attr</option> / <option>-A</option>
|
<varlistentry xml:id="opt-attr"><term><option>--attr</option> / <option>-A</option>
|
||||||
<replaceable>attrPath</replaceable></term>
|
<replaceable>attrPath</replaceable></term>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,12 @@
|
||||||
<nop xmlns="http://docbook.org/ns/docbook">
|
<nop xmlns="http://docbook.org/ns/docbook">
|
||||||
|
|
||||||
|
<arg>
|
||||||
|
<group choice='req'>
|
||||||
|
<arg choice='plain'><option>--prebuilt-only</option></arg>
|
||||||
|
<arg choice='plain'><option>-b</option></arg>
|
||||||
|
</group>
|
||||||
|
</arg>
|
||||||
|
|
||||||
<arg>
|
<arg>
|
||||||
<group choice='req'>
|
<group choice='req'>
|
||||||
<arg choice='plain'><option>--attr</option></arg>
|
<arg choice='plain'><option>--attr</option></arg>
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@
|
||||||
|
|
||||||
|
|
||||||
<para>This chapter discusses how to do package management with Nix,
|
<para>This chapter discusses how to do package management with Nix,
|
||||||
i.e., how to obtain, install, upgrade, and erase components. This is
|
i.e., how to obtain, install, upgrade, and erase packages. This is
|
||||||
the “user’s” perspective of the Nix system — people
|
the “user’s” perspective of the Nix system — people
|
||||||
who want to <emphasis>create</emphasis> components should consult
|
who want to <emphasis>create</emphasis> packages should consult
|
||||||
<xref linkend='chap-writing-nix-expressions' />.</para>
|
<xref linkend='chap-writing-nix-expressions' />.</para>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -16,8 +16,8 @@ who want to <emphasis>create</emphasis> components should consult
|
||||||
|
|
||||||
<para>The main command for package management is <link
|
<para>The main command for package management is <link
|
||||||
linkend="sec-nix-env"><command>nix-env</command></link>. You can use
|
linkend="sec-nix-env"><command>nix-env</command></link>. You can use
|
||||||
it to install, upgrade, and erase components, and to query what
|
it to install, upgrade, and erase packages, and to query what
|
||||||
components are installed or are available for installation.</para>
|
packages are installed or are available for installation.</para>
|
||||||
|
|
||||||
<para>In Nix, different users can have different “views”
|
<para>In Nix, different users can have different “views”
|
||||||
on the set of installed applications. That is, there might be lots of
|
on the set of installed applications. That is, there might be lots of
|
||||||
|
|
@ -30,10 +30,10 @@ environment</emphasis>, which is just a directory tree consisting of
|
||||||
symlinks to the files of the active applications. </para>
|
symlinks to the files of the active applications. </para>
|
||||||
|
|
||||||
<para>Components are installed from a set of <emphasis>Nix
|
<para>Components are installed from a set of <emphasis>Nix
|
||||||
expressions</emphasis> that tell Nix how to build those components,
|
expressions</emphasis> that tell Nix how to build those packages,
|
||||||
including, if necessary, their dependencies. There is a collection of
|
including, if necessary, their dependencies. There is a collection of
|
||||||
Nix expressions called the Nix Package collection that contains
|
Nix expressions called the Nix Package collection that contains
|
||||||
components ranging from basic development stuff such as GCC and Glibc,
|
packages ranging from basic development stuff such as GCC and Glibc,
|
||||||
to end-user applications like Mozilla Firefox. (Nix is however not
|
to end-user applications like Mozilla Firefox. (Nix is however not
|
||||||
tied to the Nix Package collection; you could write your own Nix
|
tied to the Nix Package collection; you could write your own Nix
|
||||||
expressions based on it, or completely new ones.) You can download
|
expressions based on it, or completely new ones.) You can download
|
||||||
|
|
@ -41,7 +41,7 @@ the latest version from <link
|
||||||
xlink:href='http://nix.cs.uu.nl/dist/nix' />.</para>
|
xlink:href='http://nix.cs.uu.nl/dist/nix' />.</para>
|
||||||
|
|
||||||
<para>Assuming that you have downloaded and unpacked a release of Nix
|
<para>Assuming that you have downloaded and unpacked a release of Nix
|
||||||
Packages, you can view the set of available components in the release:
|
Packages, you can view the set of available packages in the release:
|
||||||
|
|
||||||
<screen>
|
<screen>
|
||||||
$ nix-env -qaf nixpkgs-<replaceable>version</replaceable> '*'
|
$ nix-env -qaf nixpkgs-<replaceable>version</replaceable> '*'
|
||||||
|
|
@ -74,7 +74,7 @@ gcc-4.1.1</screen>
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>It is also possible to see the <emphasis>status</emphasis> of
|
<para>It is also possible to see the <emphasis>status</emphasis> of
|
||||||
available components, i.e., whether they are installed into the user
|
available packages, i.e., whether they are installed into the user
|
||||||
environment and/or present in the system:
|
environment and/or present in the system:
|
||||||
|
|
||||||
<screen>
|
<screen>
|
||||||
|
|
@ -86,24 +86,24 @@ IPS bison-1.875d
|
||||||
...</screen>
|
...</screen>
|
||||||
|
|
||||||
The first character (<literal>I</literal>) indicates whether the
|
The first character (<literal>I</literal>) indicates whether the
|
||||||
component is installed in your current user environment. The second
|
package is installed in your current user environment. The second
|
||||||
(<literal>P</literal>) indicates whether it is present on your system
|
(<literal>P</literal>) indicates whether it is present on your system
|
||||||
(in which case installing it into your user environment would be a
|
(in which case installing it into your user environment would be a
|
||||||
very quick operation). The last one (<literal>S</literal>) indicates
|
very quick operation). The last one (<literal>S</literal>) indicates
|
||||||
whether there is a so-called <emphasis>substitute</emphasis> for the
|
whether there is a so-called <emphasis>substitute</emphasis> for the
|
||||||
component, which is Nix’s mechanism for doing binary deployment. It
|
package, which is Nix’s mechanism for doing binary deployment. It
|
||||||
just means that Nix knows that it can fetch a pre-built component from
|
just means that Nix knows that it can fetch a pre-built package from
|
||||||
somewhere (typically a network server) instead of building it
|
somewhere (typically a network server) instead of building it
|
||||||
locally.</para>
|
locally.</para>
|
||||||
|
|
||||||
<para>So now that we have a set of Nix expressions we can build the
|
<para>So now that we have a set of Nix expressions we can build the
|
||||||
components contained in them. This is done using <literal>nix-env
|
packages contained in them. This is done using <literal>nix-env
|
||||||
-i</literal>. For instance,
|
-i</literal>. For instance,
|
||||||
|
|
||||||
<screen>
|
<screen>
|
||||||
$ nix-env -f nixpkgs-<replaceable>version</replaceable> -i subversion</screen>
|
$ nix-env -f nixpkgs-<replaceable>version</replaceable> -i subversion</screen>
|
||||||
|
|
||||||
will install the component called <literal>subversion</literal> (which
|
will install the package called <literal>subversion</literal> (which
|
||||||
is, of course, the <link
|
is, of course, the <link
|
||||||
xlink:href='http://subversion.tigris.org/'>Subversion version
|
xlink:href='http://subversion.tigris.org/'>Subversion version
|
||||||
management system</link>).</para>
|
management system</link>).</para>
|
||||||
|
|
@ -112,7 +112,7 @@ management system</link>).</para>
|
||||||
Subversion and all its dependencies. This will take quite a while —
|
Subversion and all its dependencies. This will take quite a while —
|
||||||
typically an hour or two on modern machines. Fortunately, there is a
|
typically an hour or two on modern machines. Fortunately, there is a
|
||||||
faster way (so do a Ctrl-C on that install operation!): you just need
|
faster way (so do a Ctrl-C on that install operation!): you just need
|
||||||
to tell Nix that pre-built binaries of all those components are
|
to tell Nix that pre-built binaries of all those packages are
|
||||||
available somewhere. This is done using the
|
available somewhere. This is done using the
|
||||||
<command>nix-pull</command> command, which must be supplied with a URL
|
<command>nix-pull</command> command, which must be supplied with a URL
|
||||||
containing a <emphasis>manifest</emphasis> describing what binaries
|
containing a <emphasis>manifest</emphasis> describing what binaries
|
||||||
|
|
@ -153,7 +153,7 @@ expressions, use <parameter>-i</parameter> instead of
|
||||||
<parameter>-u</parameter>; <parameter>-i</parameter> will remove
|
<parameter>-u</parameter>; <parameter>-i</parameter> will remove
|
||||||
whatever version is already installed.</para>
|
whatever version is already installed.</para>
|
||||||
|
|
||||||
<para>You can also upgrade all components for which there are newer
|
<para>You can also upgrade all packages for which there are newer
|
||||||
versions:
|
versions:
|
||||||
|
|
||||||
<screen>
|
<screen>
|
||||||
|
|
@ -199,19 +199,19 @@ set.</para></footnote></para>
|
||||||
implementing the ability to allow different users to have different
|
implementing the ability to allow different users to have different
|
||||||
configurations, and to do atomic upgrades and rollbacks. To
|
configurations, and to do atomic upgrades and rollbacks. To
|
||||||
understand how they work, it’s useful to know a bit about how Nix
|
understand how they work, it’s useful to know a bit about how Nix
|
||||||
works. In Nix, components are stored in unique locations in the
|
works. In Nix, packages are stored in unique locations in the
|
||||||
<emphasis>Nix store</emphasis> (typically,
|
<emphasis>Nix store</emphasis> (typically,
|
||||||
<filename>/nix/store</filename>). For instance, a particular version
|
<filename>/nix/store</filename>). For instance, a particular version
|
||||||
of the Subversion component might be stored in a directory
|
of the Subversion package might be stored in a directory
|
||||||
<filename>/nix/store/dpmvp969yhdqs7lm2r1a3gng7pyq6vy4-subversion-1.1.3/</filename>,
|
<filename>/nix/store/dpmvp969yhdqs7lm2r1a3gng7pyq6vy4-subversion-1.1.3/</filename>,
|
||||||
while another version might be stored in
|
while another version might be stored in
|
||||||
<filename>/nix/store/5mq2jcn36ldlmh93yj1n8s9c95pj7c5s-subversion-1.1.2</filename>.
|
<filename>/nix/store/5mq2jcn36ldlmh93yj1n8s9c95pj7c5s-subversion-1.1.2</filename>.
|
||||||
The long strings prefixed to the directory names are cryptographic
|
The long strings prefixed to the directory names are cryptographic
|
||||||
hashes<footnote><para>160-bit truncations of SHA-256 hashes encoded in
|
hashes<footnote><para>160-bit truncations of SHA-256 hashes encoded in
|
||||||
a base-32 notation, to be precise.</para></footnote> of
|
a base-32 notation, to be precise.</para></footnote> of
|
||||||
<emphasis>all</emphasis> inputs involved in building the component —
|
<emphasis>all</emphasis> inputs involved in building the package —
|
||||||
sources, dependencies, compiler flags, and so on. So if two
|
sources, dependencies, compiler flags, and so on. So if two
|
||||||
components differ in any way, they end up in different locations in
|
packages differ in any way, they end up in different locations in
|
||||||
the file system, so they don’t interfere with each other. <xref
|
the file system, so they don’t interfere with each other. <xref
|
||||||
linkend='fig-user-environments' /> shows a part of a typical Nix
|
linkend='fig-user-environments' /> shows a part of a typical Nix
|
||||||
store.</para>
|
store.</para>
|
||||||
|
|
@ -231,12 +231,12 @@ $ /nix/store/dpmvp969yhdq...-subversion-1.1.3/bin/svn</screen>
|
||||||
|
|
||||||
every time you want to run Subversion. Of course we could set up the
|
every time you want to run Subversion. Of course we could set up the
|
||||||
<envar>PATH</envar> environment variable to include the
|
<envar>PATH</envar> environment variable to include the
|
||||||
<filename>bin</filename> directory of every component we want to use,
|
<filename>bin</filename> directory of every package we want to use,
|
||||||
but this is not very convenient since changing <envar>PATH</envar>
|
but this is not very convenient since changing <envar>PATH</envar>
|
||||||
doesn’t take effect for already existing processes. The solution Nix
|
doesn’t take effect for already existing processes. The solution Nix
|
||||||
uses is to create directory trees of symlinks to
|
uses is to create directory trees of symlinks to
|
||||||
<emphasis>activated</emphasis> components. These are called
|
<emphasis>activated</emphasis> packages. These are called
|
||||||
<emphasis>user environments</emphasis> and they are components
|
<emphasis>user environments</emphasis> and they are packages
|
||||||
themselves (though automatically generated by
|
themselves (though automatically generated by
|
||||||
<command>nix-env</command>), so they too reside in the Nix store. For
|
<command>nix-env</command>), so they too reside in the Nix store. For
|
||||||
instance, in <xref linkend='fig-user-environments' /> the user
|
instance, in <xref linkend='fig-user-environments' /> the user
|
||||||
|
|
@ -285,8 +285,8 @@ operation, a new user environment and generation link are created
|
||||||
based on the current one, and finally the <filename>default</filename>
|
based on the current one, and finally the <filename>default</filename>
|
||||||
symlink is made to point at the new generation. This last step is
|
symlink is made to point at the new generation. This last step is
|
||||||
atomic on Unix, which explains how we can do atomic upgrades. (Note
|
atomic on Unix, which explains how we can do atomic upgrades. (Note
|
||||||
that the building/installing of new components doesn’t interfere in
|
that the building/installing of new packages doesn’t interfere in
|
||||||
any way with old components, since they are stored in different
|
any way with old packages, since they are stored in different
|
||||||
locations in the Nix store.)</para>
|
locations in the Nix store.)</para>
|
||||||
|
|
||||||
<para>If you find that you want to undo a <command>nix-env</command>
|
<para>If you find that you want to undo a <command>nix-env</command>
|
||||||
|
|
@ -352,18 +352,18 @@ This will <emphasis>not</emphasis> change the
|
||||||
|
|
||||||
<para><command>nix-env</command> operations such as upgrades
|
<para><command>nix-env</command> operations such as upgrades
|
||||||
(<option>-u</option>) and uninstall (<option>-e</option>) never
|
(<option>-u</option>) and uninstall (<option>-e</option>) never
|
||||||
actually delete components from the system. All they do (as shown
|
actually delete packages from the system. All they do (as shown
|
||||||
above) is to create a new user environment that no longer contains
|
above) is to create a new user environment that no longer contains
|
||||||
symlinks to the “deleted” components.</para>
|
symlinks to the “deleted” packages.</para>
|
||||||
|
|
||||||
<para>Of course, since disk space is not infinite, unused components
|
<para>Of course, since disk space is not infinite, unused packages
|
||||||
should be removed at some point. You can do this by running the Nix
|
should be removed at some point. You can do this by running the Nix
|
||||||
garbage collector. It will remove from the Nix store any component
|
garbage collector. It will remove from the Nix store any package
|
||||||
not used (directly or indirectly) by any generation of any
|
not used (directly or indirectly) by any generation of any
|
||||||
profile.</para>
|
profile.</para>
|
||||||
|
|
||||||
<para>Note however that as long as old generations reference a
|
<para>Note however that as long as old generations reference a
|
||||||
component, it will not be deleted. After all, we wouldn’t be able to
|
package, it will not be deleted. After all, we wouldn’t be able to
|
||||||
do a rollback otherwise. So in order for garbage collection to be
|
do a rollback otherwise. So in order for garbage collection to be
|
||||||
effective, you should also delete (some) old generations. Of course,
|
effective, you should also delete (some) old generations. Of course,
|
||||||
this should only be done if you are certain that you will not need to
|
this should only be done if you are certain that you will not need to
|
||||||
|
|
@ -486,7 +486,7 @@ makes the union of each channel’s Nix expressions the default for
|
||||||
<screen>
|
<screen>
|
||||||
$ nix-env -u '*'</screen>
|
$ nix-env -u '*'</screen>
|
||||||
|
|
||||||
to upgrade all components in your profile to the latest versions
|
to upgrade all packages in your profile to the latest versions
|
||||||
available in the subscribed channels.</para>
|
available in the subscribed channels.</para>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ to the following chapters.</para>
|
||||||
<orderedlist>
|
<orderedlist>
|
||||||
|
|
||||||
<listitem><para>Download a source tarball or RPM from <link
|
<listitem><para>Download a source tarball or RPM from <link
|
||||||
xlink:href='http://www.cs.uu.nl/groups/ST/Trace/Nix'/>. Build source
|
xlink:href='http://nix.cs.uu.nl/'/>. Build source
|
||||||
distributions using the regular sequence:
|
distributions using the regular sequence:
|
||||||
|
|
||||||
<screen>
|
<screen>
|
||||||
|
|
@ -22,8 +22,9 @@ $ make install <lineannotation>(as root)</lineannotation></screen>
|
||||||
|
|
||||||
This will install Nix in <filename>/nix</filename>. You shouldn't
|
This will install Nix in <filename>/nix</filename>. You shouldn't
|
||||||
change the prefix if at all possible since that will make it
|
change the prefix if at all possible since that will make it
|
||||||
impossible to use our pre-built components. Alternatively, you could
|
impossible to use pre-built binaries from the Nixpkgs channel and
|
||||||
grab an RPM if you're on an RPM-based system. You should also add
|
other channels. Alternatively, you could grab an RPM if you're on an
|
||||||
|
RPM-based system. You should also add
|
||||||
<filename>/nix/etc/profile.d/nix.sh</filename> to your
|
<filename>/nix/etc/profile.d/nix.sh</filename> to your
|
||||||
<filename>~/.bashrc</filename> (or some other login
|
<filename>~/.bashrc</filename> (or some other login
|
||||||
file).</para></listitem>
|
file).</para></listitem>
|
||||||
|
|
@ -40,14 +41,14 @@ $ nix-channel --add \
|
||||||
<screen>
|
<screen>
|
||||||
$ nix-channel --update</screen>
|
$ nix-channel --update</screen>
|
||||||
|
|
||||||
Note that this in itself doesn't download any components, it just
|
Note that this in itself doesn't download any packages, it just
|
||||||
downloads the Nix expressions that build them and stores them
|
downloads the Nix expressions that build them and stores them
|
||||||
somewhere (under <filename>~/.nix-defexpr</filename>, in case you're
|
somewhere (under <filename>~/.nix-defexpr</filename>, in case you're
|
||||||
curious). Also, it registers the fact that pre-built binaries are
|
curious). Also, it registers the fact that pre-built binaries are
|
||||||
available remotely.</para></listitem>
|
available remotely.</para></listitem>
|
||||||
|
|
||||||
<listitem><para>See what installable components are currently
|
<listitem><para>See what installable packages are currently available
|
||||||
available in the channel:
|
in the channel:
|
||||||
|
|
||||||
<screen>
|
<screen>
|
||||||
$ nix-env -qa ’*’ <lineannotation>(mind the quotes!)</lineannotation>
|
$ nix-env -qa ’*’ <lineannotation>(mind the quotes!)</lineannotation>
|
||||||
|
|
@ -59,13 +60,13 @@ libxslt-1.1.0
|
||||||
|
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
|
|
||||||
<listitem><para>Install some components from the channel:
|
<listitem><para>Install some packages from the channel:
|
||||||
|
|
||||||
<screen>
|
<screen>
|
||||||
$ nix-env -i hello firefox <replaceable>...</replaceable> </screen>
|
$ nix-env -i hello firefox <replaceable>...</replaceable> </screen>
|
||||||
|
|
||||||
This should download the pre-built components; it should not build
|
This should download pre-built packages; it should not build them
|
||||||
them locally (if it does, something went wrong).</para></listitem>
|
locally (if it does, something went wrong).</para></listitem>
|
||||||
|
|
||||||
<listitem><para>Test that they work:
|
<listitem><para>Test that they work:
|
||||||
|
|
||||||
|
|
@ -92,8 +93,8 @@ $ nix-env -e hello</screen>
|
||||||
$ nix-channel --update
|
$ nix-channel --update
|
||||||
$ nix-env -u '*'</screen>
|
$ nix-env -u '*'</screen>
|
||||||
|
|
||||||
The latter command will upgrade each installed component for which
|
The latter command will upgrade each installed package for which there
|
||||||
there is a “newer” version (as determined by comparing the version
|
is a “newer” version (as determined by comparing the version
|
||||||
numbers).</para></listitem>
|
numbers).</para></listitem>
|
||||||
|
|
||||||
<listitem><para>You can also install specific packages directly from
|
<listitem><para>You can also install specific packages directly from
|
||||||
|
|
@ -107,7 +108,7 @@ appear asking you whether it’s okay to install the package. Say
|
||||||
installed.</para></listitem>
|
installed.</para></listitem>
|
||||||
|
|
||||||
<listitem><para>If you're unhappy with the result of a
|
<listitem><para>If you're unhappy with the result of a
|
||||||
<command>nix-env</command> action (e.g., an upgraded component turned
|
<command>nix-env</command> action (e.g., an upgraded package turned
|
||||||
out not to work properly), you can go back:
|
out not to work properly), you can go back:
|
||||||
|
|
||||||
<screen>
|
<screen>
|
||||||
|
|
@ -124,7 +125,7 @@ $ nix-collect-garbage -d</screen>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
The first command deletes old “generations” of your profile (making
|
The first command deletes old “generations” of your profile (making
|
||||||
rollbacks impossible, but also making the components in those old
|
rollbacks impossible, but also making the packages in those old
|
||||||
generations available for garbage collection), while the second
|
generations available for garbage collection), while the second
|
||||||
command actually deletes them.-->
|
command actually deletes them.-->
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,36 +8,222 @@
|
||||||
|
|
||||||
<!--==================================================================-->
|
<!--==================================================================-->
|
||||||
|
|
||||||
<section xml:id="ssec-relnotes-0.11"><title>Release 0.11 (TBA)</title>
|
<section xml:id="ssec-relnotes-0.11"><title>Release 0.11 (December 31,
|
||||||
|
2007)</title>
|
||||||
|
|
||||||
|
<para>Nix 0.11 has many improvements over the previous stable release.
|
||||||
|
The most important improvement is secure multi-user support. It also
|
||||||
|
features many usability enhancements and language extensions, many of
|
||||||
|
them prompted by NixOS, the purely functional Linux distribution based
|
||||||
|
on Nix. Here is an (incomplete) list:</para>
|
||||||
|
|
||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: multi-user support. The old setuid method for
|
<listitem><para>Secure multi-user support. A single Nix store can
|
||||||
sharing a store between multiple users has been
|
now be shared between multiple (possible untrusted) users. This is
|
||||||
removed.</para></listitem>
|
an important feature for NixOS, where it allows non-root users to
|
||||||
|
install software. The old setuid method for sharing a store between
|
||||||
|
multiple users has been removed. Details for setting up a
|
||||||
|
multi-user store can be found in the manual.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>The new command <command>nix-copy-closure</command>
|
<listitem><para>The new command <command>nix-copy-closure</command>
|
||||||
gives you an easy and efficient way to exchange software between
|
gives you an easy and efficient way to exchange software between
|
||||||
machines. It copies the missing parts of the closure of a set of
|
machines. It copies the missing parts of the closure of a set of
|
||||||
store path to or from a remote machine.</para></listitem>
|
store path to or from a remote machine via
|
||||||
|
<command>ssh</command>.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
<listitem><para><command>nix-prefetch-url</command> now by default
|
<listitem><para>A new kind of string literal: strings between double
|
||||||
computes the SHA-256 hash of the file instead of the MD5 hash. In
|
single-quotes (<literal>''</literal>) have indentation
|
||||||
calls to <function>fetchurl</function> you should pass an
|
“intelligently” removed. This allows large strings (such as shell
|
||||||
<literal>sha256</literal> attribute instead of
|
scripts or configuration file fragments in NixOS) to cleanly follow
|
||||||
<literal>md5</literal>. You can pass either a hexadecimal or a
|
the indentation of the surrounding expression. It also requires
|
||||||
base-32 encoding of the hash.</para></listitem>
|
much less escaping, since <literal>''</literal> is less common in
|
||||||
|
most languages than <literal>"</literal>.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para><command>nix-env</command> <option>--set</option>
|
||||||
|
modifies the current generation of a profile so that it contains
|
||||||
|
exactly the specified derivation, and nothing else. For example,
|
||||||
|
<literal>nix-env -p /nix/var/nix/profiles/browser --set
|
||||||
|
firefox</literal> lets the profile named
|
||||||
|
<filename>browser</filename> contain just Firefox.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para><command>nix-env</command> now maintains
|
||||||
|
meta-information about installed packages in profiles. The
|
||||||
|
meta-information is the contents of the <varname>meta</varname>
|
||||||
|
attribute of derivations, such as <varname>description</varname> or
|
||||||
|
<varname>homepage</varname>. The command <literal>nix-env -q --xml
|
||||||
|
--meta</literal> shows all meta-information.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para><command>nix-env</command> now uses the
|
||||||
|
<varname>meta.priority</varname> attribute of derivations to resolve
|
||||||
|
filename collisions between packages. Lower priority values denote
|
||||||
|
a higher priority. For instance, the GCC wrapper package and the
|
||||||
|
Binutils package in Nixpkgs both have a file
|
||||||
|
<filename>bin/ld</filename>, so previously if you tried to install
|
||||||
|
both you would get a collision. Now, on the other hand, the GCC
|
||||||
|
wrapper declares a higher priority than Binutils, so the former’s
|
||||||
|
<filename>bin/ld</filename> is symlinked in the user
|
||||||
|
environment.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para><command>nix-env -i / -u</command>: instead of
|
||||||
|
breaking package ties by version, break them by priority and version
|
||||||
|
number. That is, if there are multiple packages with the same name,
|
||||||
|
then pick the package with the highest priority, and only use the
|
||||||
|
version if there are multiple packages with the same
|
||||||
|
priority.</para>
|
||||||
|
|
||||||
|
<para>This makes it possible to mark specific versions/variant in
|
||||||
|
Nixpkgs more or less desirable than others. A typical example would
|
||||||
|
be a beta version of some package (e.g.,
|
||||||
|
<literal>gcc-4.2.0rc1</literal>) which should not be installed even
|
||||||
|
though it is the highest version, except when it is explicitly
|
||||||
|
selected (e.g., <literal>nix-env -i
|
||||||
|
gcc-4.2.0rc1</literal>).</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para><command>nix-env --set-flag</command> allows meta
|
||||||
|
attributes of installed packages to be modified. There are several
|
||||||
|
attributes that can be usefully modified, because they affect the
|
||||||
|
behaviour of <command>nix-env</command> or the user environment
|
||||||
|
build script:
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
|
||||||
|
<listitem><para><varname>meta.priority</varname> can be changed
|
||||||
|
to resolve filename clashes (see above).</para></listitem>
|
||||||
|
|
||||||
|
<listitem><para><varname>meta.keep</varname> can be set to
|
||||||
|
<literal>true</literal> to prevent the package from being
|
||||||
|
upgraded or replaced. Useful if you want to hang on to an older
|
||||||
|
version of a package.</para></listitem>
|
||||||
|
|
||||||
|
<listitem><para><varname>meta.active</varname> can be set to
|
||||||
|
<literal>false</literal> to “disable” the package. That is, no
|
||||||
|
symlinks will be generated to the files of the package, but it
|
||||||
|
remains part of the profile (so it won’t be garbage-collected).
|
||||||
|
Set it back to <literal>true</literal> to re-enable the
|
||||||
|
package.</para></listitem>
|
||||||
|
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para><command>nix-env -q</command> now has a flag
|
||||||
|
<option>--prebuilt-only</option> (<option>-b</option>) that causes
|
||||||
|
<command>nix-env</command> to show only those derivations whose
|
||||||
|
output is already in the Nix store or that can be substituted (i.e.,
|
||||||
|
downloaded from somewhere). In other words, it shows the packages
|
||||||
|
that can be installed “quickly”, i.e., don’t need to be built from
|
||||||
|
source. The <option>-b</option> flag is also available in
|
||||||
|
<command>nix-env -i</command> and <command>nix-env -u</command> to
|
||||||
|
filter out derivations for which no pre-built binary is
|
||||||
|
available.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para>The new option <option>--argstr</option> (in
|
||||||
|
<command>nix-env</command>, <command>nix-instantiate</command> and
|
||||||
|
<command>nix-build</command>) is like <option>--arg</option>, except
|
||||||
|
that the value is a string. For example, <literal>--argstr system
|
||||||
|
i686-linux</literal> is equivalent to <literal>--arg system
|
||||||
|
\"i686-linux\"</literal> (note that <option>--argstr</option>
|
||||||
|
prevents annoying quoting around shell arguments).</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
<listitem><para><command>nix-store</command> has a new operation
|
<listitem><para><command>nix-store</command> has a new operation
|
||||||
<option>--read-log</option> (<option>-l</option>)
|
<option>--read-log</option> (<option>-l</option>)
|
||||||
<parameter>paths</parameter> that shows the build log of the given
|
<parameter>paths</parameter> that shows the build log of the given
|
||||||
paths.</para></listitem>
|
paths.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<listitem><para>TODO: semantic cleanups of string concatenation
|
||||||
|
etc. (mostly in r6740).</para></listitem>
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para>Nix now uses Berkeley DB 4.5. The database is
|
||||||
|
upgraded automatically, but you should be careful not to use old
|
||||||
|
versions of Nix that still use Berkeley DB 4.4.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- foo
|
||||||
|
<listitem><para>TODO: option <option>- -reregister</option> in
|
||||||
|
<command>nix-store - -register-validity</command>.</para></listitem>
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para>The option <option>--max-silent-time</option>
|
||||||
|
(corresponding to the configuration setting
|
||||||
|
<literal>build-max-silent-time</literal>) allows you to set a
|
||||||
|
timeout on builds — if a build produces no output on
|
||||||
|
<literal>stdout</literal> or <literal>stderr</literal> for the given
|
||||||
|
number of seconds, it is terminated. This is useful for recovering
|
||||||
|
automatically from builds that are stuck in an infinite
|
||||||
|
loop.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para><command>nix-channel</command>: each subscribed
|
||||||
|
channel is its own attribute in the top-level expression generated
|
||||||
|
for the channel. This allows disambiguation (e.g. <literal>nix-env
|
||||||
|
-i -A nixpkgs_unstable.firefox</literal>).</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para>The substitutes table has been removed from the
|
||||||
|
database. This makes operations such as <command>nix-pull</command>
|
||||||
|
and <command>nix-channel --update</command> much, much
|
||||||
|
faster.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para><command>nix-pull</command> now supports
|
||||||
|
bzip2-compressed manifests. This speeds up
|
||||||
|
channels.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para><command>nix-prefetch-url</command> now has a
|
||||||
|
limited form of caching. This is used by
|
||||||
|
<command>nix-channel</command> to prevent unnecessary downloads when
|
||||||
|
the channel hasn’t changed.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para><command>nix-prefetch-url</command> now by default
|
||||||
|
computes the SHA-256 hash of the file instead of the MD5 hash. In
|
||||||
|
calls to <function>fetchurl</function> you should pass the
|
||||||
|
<literal>sha256</literal> attribute instead of
|
||||||
|
<literal>md5</literal>. You can pass either a hexadecimal or a
|
||||||
|
base-32 encoding of the hash.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para>Nix can now perform builds in an automatically
|
||||||
|
generated “chroot”. This prevents a builder from accessing stuff
|
||||||
|
outside of the Nix store, and thus helps ensure purity. This is an
|
||||||
|
experimental feature.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para>The new command <command>nix-store
|
||||||
|
--optimise</command> reduces Nix store disk space usage by finding
|
||||||
|
identical files in the store and hard-linking them to each other.
|
||||||
|
It typically reduces the size of the store by something like
|
||||||
|
25-35%.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
|
<listitem><para><filename>~/.nix-defexpr</filename> can now be a
|
||||||
|
directory, in which case the Nix expressions in that directory are
|
||||||
|
combined into an attribute set, with the file names used as the
|
||||||
|
names of the attributes. The command <command>nix-env
|
||||||
|
--import</command> (which set the
|
||||||
|
<filename>~/.nix-defexpr</filename> symlink) is
|
||||||
|
removed.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>Derivations can specify the new special attribute
|
<listitem><para>Derivations can specify the new special attribute
|
||||||
<varname>allowedReferences</varname> to enforce that the references
|
<varname>allowedReferences</varname> to enforce that the references
|
||||||
in the output of a derivation are a subset of a declared set of
|
in the output of a derivation are a subset of a declared set of
|
||||||
|
|
@ -47,17 +233,6 @@
|
||||||
for booting Linux don’t have any dependencies.</para></listitem>
|
for booting Linux don’t have any dependencies.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: semantic cleanups of string concatenation
|
|
||||||
etc. (mostly in r6740).</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: now using Berkeley DB 4.5.</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: option <option>--reregister</option> in
|
|
||||||
<command>nix-store --register-validity</command>.</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>The new attribute
|
<listitem><para>The new attribute
|
||||||
<varname>exportReferencesGraph</varname> allows builders access to
|
<varname>exportReferencesGraph</varname> allows builders access to
|
||||||
the references graph of their inputs. This is used in NixOS for
|
the references graph of their inputs. This is used in NixOS for
|
||||||
|
|
@ -65,72 +240,27 @@
|
||||||
populated with the closure of certain paths.</para></listitem>
|
populated with the closure of certain paths.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: option <option>--max-silent-time</option>,
|
<listitem><para>Fixed-output derivations (like
|
||||||
configuration setting
|
<function>fetchurl</function>) can define the attribute
|
||||||
<literal>build-max-silent-time</literal>.</para></listitem>
|
<varname>impureEnvVars</varname> to allow external environment
|
||||||
|
variables to be passed to builders. This is used in Nixpkgs to
|
||||||
|
support proxy configuration, among other things.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: <command>nix-env</command>
|
<listitem><para>Several new built-in functions:
|
||||||
<option>--set</option>.</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: <option>--argstr</option>.</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: <command>nix-env</command> now maintains meta
|
|
||||||
info about installed packages in user environments. <option>-q
|
|
||||||
--xml --meta</option> to show all meta info.</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: <command>nix-env</command>
|
|
||||||
<option>--set-flag</option>. Specific flags:
|
|
||||||
<literal>active</literal>, <literal>priority</literal>,
|
|
||||||
<literal>keep</literal>.</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: <command>nix-env</command> <option>-i</option>
|
|
||||||
/ <option>-u</option> take package priorities into
|
|
||||||
account.</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
<listitem><para><command>nix-env -q</command> now has a flag
|
|
||||||
<option>--prebuilt-only</option> (<option>-b</option>) that causes
|
|
||||||
<command>nix-env</command> to show only those derivations whose
|
|
||||||
output is already in the Nix store or that can be substituted (i.e.,
|
|
||||||
downloaded from somewhere). In other words, it shows the packages
|
|
||||||
that can be installed “quickly”, i.e., don’t need to be built from
|
|
||||||
source. TODO: flag is also available in nix-env -i /
|
|
||||||
-u.</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: new built-ins
|
|
||||||
<function>builtins.attrNames</function>,
|
<function>builtins.attrNames</function>,
|
||||||
<function>builtins.filterSource</function>,
|
<function>builtins.filterSource</function>,
|
||||||
<function>builtins.sub</function>,
|
<function>builtins.isAttrs</function>,
|
||||||
|
<function>builtins.isFunction</function>,
|
||||||
|
<function>builtins.listToAttrs</function>,
|
||||||
<function>builtins.stringLength</function>,
|
<function>builtins.stringLength</function>,
|
||||||
<function>builtins.substring</function>.</para></listitem>
|
<function>builtins.sub</function>,
|
||||||
|
<function>builtins.substring</function>,
|
||||||
|
<function>throw</function>,
|
||||||
|
<function>builtins.trace</function>,
|
||||||
|
<function>builtins.readFile</function>.</para></listitem>
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: each subscribed channel is its own attribute
|
|
||||||
in the top-level expression generated for the channel, this allows
|
|
||||||
disambiguation (<command>nix-env -qaA</command>).</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>The substitutes table has been removed from the
|
|
||||||
database. This makes operations such as <command>nix-pull</command>
|
|
||||||
and <command>nix-channel --update</command>
|
|
||||||
<emphasis>much</emphasis> faster.</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
<listitem><para><command>nix-prefetch-url</command> now has a
|
|
||||||
limited form of caching. This is used by
|
|
||||||
<command>nix-channel</command> to prevent unnecessary downloads when
|
|
||||||
the channel hasn’t changed.</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
<listitem><para>TODO: chroot support.</para></listitem>
|
|
||||||
|
|
||||||
|
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,9 @@
|
||||||
<title>Troubleshooting</title>
|
<title>Troubleshooting</title>
|
||||||
|
|
||||||
|
|
||||||
<para>This section provides solutions for some common problems.</para>
|
<para>This section provides solutions for some common problems. See
|
||||||
|
the <link xlink:href="https://bugs.cs.uu.nl/browse/NIX">Nix
|
||||||
|
bug tracker</link> for a list of currently known issues.</para>
|
||||||
|
|
||||||
|
|
||||||
<section><title>Berkeley DB: <quote>Cannot allocate memory</quote></title>
|
<section><title>Berkeley DB: <quote>Cannot allocate memory</quote></title>
|
||||||
|
|
@ -77,6 +79,46 @@ $ nix-store --verify</screen>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
<section><title>Berkeley DB out of locks</title>
|
||||||
|
|
||||||
|
<para>It is possible, especially in <command>nix-store
|
||||||
|
--verify</command> or when running the garbage collector, to run out
|
||||||
|
of Berkeley DB locks, like this:
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
$ nix-store --verify
|
||||||
|
checking path existence
|
||||||
|
checking path realisability
|
||||||
|
checking the derivers table
|
||||||
|
checking the references table
|
||||||
|
Berkeley DB error: Lock table is out of available object entries
|
||||||
|
error: Db::get: Cannot allocate memory</screen>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>A workaround is to increase the number of locks that Berkeley DB
|
||||||
|
allocates. (The real solution would be for Nix to not use so many
|
||||||
|
locks.) This can be done by putting the following in the file
|
||||||
|
<filename>/nix/var/nix/db/<link
|
||||||
|
xlink:href="http://www.oracle.com/technology/documentation/berkeley-db/db/ref/env/db_config.html">DB_CONFIG</link></filename>:
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
set_lk_max_locks 100000
|
||||||
|
set_lk_max_lockers 100000
|
||||||
|
set_lk_max_objects 100000
|
||||||
|
</programlisting>
|
||||||
|
|
||||||
|
(Increase these numbers if necessary.) Then make sure that there are
|
||||||
|
no running Nix processes and delete the Berkeley DB environment:
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
$ rm /nix/var/nix/db/__db.*</screen>
|
||||||
|
|
||||||
|
The Berkeley DB environment is automatically recreated with the new
|
||||||
|
limits when you run any Nix command.</para>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
<section><title>Collisions in <command>nix-env</command></title>
|
<section><title>Collisions in <command>nix-env</command></title>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
|
|
||||||
<para>This chapter shows you how to write Nix expressions, which are
|
<para>This chapter shows you how to write Nix expressions, which are
|
||||||
the things that tell Nix how to build components. It starts with a
|
the things that tell Nix how to build packages. It starts with a
|
||||||
simple example (a Nix expression for GNU Hello), and then moves
|
simple example (a Nix expression for GNU Hello), and then moves
|
||||||
on to a more in-depth look at the Nix expression language.</para>
|
on to a more in-depth look at the Nix expression language.</para>
|
||||||
|
|
||||||
|
|
@ -19,29 +19,28 @@ xlink:href='http://www.gnu.org/software/hello/hello.html'>GNU Hello
|
||||||
package</link> to the Nix Packages collection. Hello is a program
|
package</link> to the Nix Packages collection. Hello is a program
|
||||||
that prints out the text <quote>Hello, world!</quote>.</para>
|
that prints out the text <quote>Hello, world!</quote>.</para>
|
||||||
|
|
||||||
<para>To add a component to the Nix Packages collection, you generally
|
<para>To add a package to the Nix Packages collection, you generally
|
||||||
need to do three things:
|
need to do three things:
|
||||||
|
|
||||||
<orderedlist>
|
<orderedlist>
|
||||||
|
|
||||||
<listitem><para>Write a Nix expression for the component. This is a
|
<listitem><para>Write a Nix expression for the package. This is a
|
||||||
file that describes all the inputs involved in building the
|
file that describes all the inputs involved in building the package,
|
||||||
component, such as dependencies (other components required by the
|
such as dependencies, sources, and so on.</para></listitem>
|
||||||
component), sources, and so on.</para></listitem>
|
|
||||||
|
|
||||||
<listitem><para>Write a <emphasis>builder</emphasis>. This is a
|
<listitem><para>Write a <emphasis>builder</emphasis>. This is a
|
||||||
shell script<footnote><para>In fact, it can be written in any
|
shell script<footnote><para>In fact, it can be written in any
|
||||||
language, but typically it's a <command>bash</command> shell
|
language, but typically it's a <command>bash</command> shell
|
||||||
script.</para></footnote> that actually builds the component from
|
script.</para></footnote> that actually builds the package from
|
||||||
the inputs.</para></listitem>
|
the inputs.</para></listitem>
|
||||||
|
|
||||||
<listitem><para>Add the component to the file
|
<listitem><para>Add the package to the file
|
||||||
<filename>pkgs/top-level/all-packages.nix</filename>. The Nix
|
<filename>pkgs/top-level/all-packages.nix</filename>. The Nix
|
||||||
expression written in the first step is a
|
expression written in the first step is a
|
||||||
<emphasis>function</emphasis>; it requires other components in order
|
<emphasis>function</emphasis>; it requires other packages in order
|
||||||
to build it. In this step you put it all together, i.e., you call
|
to build it. In this step you put it all together, i.e., you call
|
||||||
the function with the right arguments to build the actual
|
the function with the right arguments to build the actual
|
||||||
component.</para></listitem>
|
package.</para></listitem>
|
||||||
|
|
||||||
</orderedlist>
|
</orderedlist>
|
||||||
|
|
||||||
|
|
@ -83,8 +82,8 @@ the single Nix expression in that directory
|
||||||
arguments: <varname>stdenv</varname>, <varname>fetchurl</varname>,
|
arguments: <varname>stdenv</varname>, <varname>fetchurl</varname>,
|
||||||
and <varname>perl</varname>. They are needed to build Hello, but
|
and <varname>perl</varname>. They are needed to build Hello, but
|
||||||
we don't know how to build them here; that's why they are function
|
we don't know how to build them here; that's why they are function
|
||||||
arguments. <varname>stdenv</varname> is a component that is used
|
arguments. <varname>stdenv</varname> is a package that is used
|
||||||
by almost all Nix Packages components; it provides a
|
by almost all Nix Packages packages; it provides a
|
||||||
<quote>standard</quote> environment consisting of the things you
|
<quote>standard</quote> environment consisting of the things you
|
||||||
would expect in a basic Unix environment: a C/C++ compiler (GCC,
|
would expect in a basic Unix environment: a C/C++ compiler (GCC,
|
||||||
to be precise), the Bash shell, fundamental Unix tools such as
|
to be precise), the Bash shell, fundamental Unix tools such as
|
||||||
|
|
@ -99,19 +98,19 @@ the single Nix expression in that directory
|
||||||
<replaceable>e</replaceable> is the body of the function. So
|
<replaceable>e</replaceable> is the body of the function. So
|
||||||
here, the entire remainder of the file is the body of the
|
here, the entire remainder of the file is the body of the
|
||||||
function; when given the required arguments, the body should
|
function; when given the required arguments, the body should
|
||||||
describe how to build an instance of the Hello component.</para>
|
describe how to build an instance of the Hello package.</para>
|
||||||
|
|
||||||
</callout>
|
</callout>
|
||||||
|
|
||||||
<callout arearefs='ex-hello-nix-co-2'>
|
<callout arearefs='ex-hello-nix-co-2'>
|
||||||
|
|
||||||
<para>So we have to build a component. Building something from
|
<para>So we have to build a package. Building something from
|
||||||
other stuff is called a <emphasis>derivation</emphasis> in Nix (as
|
other stuff is called a <emphasis>derivation</emphasis> in Nix (as
|
||||||
opposed to sources, which are built by humans instead of
|
opposed to sources, which are built by humans instead of
|
||||||
computers). We perform a derivation by calling
|
computers). We perform a derivation by calling
|
||||||
<varname>stdenv.mkDerivation</varname>.
|
<varname>stdenv.mkDerivation</varname>.
|
||||||
<varname>mkDerivation</varname> is a function provided by
|
<varname>mkDerivation</varname> is a function provided by
|
||||||
<varname>stdenv</varname> that builds a component from a set of
|
<varname>stdenv</varname> that builds a package from a set of
|
||||||
<emphasis>attributes</emphasis>. An attribute set is just a list
|
<emphasis>attributes</emphasis>. An attribute set is just a list
|
||||||
of key/value pairs where each value is an arbitrary Nix
|
of key/value pairs where each value is an arbitrary Nix
|
||||||
expression. They take the general form
|
expression. They take the general form
|
||||||
|
|
@ -125,10 +124,10 @@ the single Nix expression in that directory
|
||||||
<callout arearefs='ex-hello-nix-co-3'>
|
<callout arearefs='ex-hello-nix-co-3'>
|
||||||
|
|
||||||
<para>The attribute <varname>name</varname> specifies the symbolic
|
<para>The attribute <varname>name</varname> specifies the symbolic
|
||||||
name and version of the component. Nix doesn't really care about
|
name and version of the package. Nix doesn't really care about
|
||||||
these things, but they are used by for instance <command>nix-env
|
these things, but they are used by for instance <command>nix-env
|
||||||
-q</command> to show a <quote>human-readable</quote> name for
|
-q</command> to show a <quote>human-readable</quote> name for
|
||||||
components. This attribute is required by
|
packages. This attribute is required by
|
||||||
<varname>mkDerivation</varname>.</para>
|
<varname>mkDerivation</varname>.</para>
|
||||||
|
|
||||||
</callout>
|
</callout>
|
||||||
|
|
@ -149,7 +148,7 @@ the single Nix expression in that directory
|
||||||
|
|
||||||
<callout arearefs='ex-hello-nix-co-5'>
|
<callout arearefs='ex-hello-nix-co-5'>
|
||||||
|
|
||||||
<para>The builder has to know what the sources of the component
|
<para>The builder has to know what the sources of the package
|
||||||
are. Here, the attribute <varname>src</varname> is bound to the
|
are. Here, the attribute <varname>src</varname> is bound to the
|
||||||
result of a call to the <command>fetchurl</command> function.
|
result of a call to the <command>fetchurl</command> function.
|
||||||
Given a URL and an MD5 hash of the expected contents of the file
|
Given a URL and an MD5 hash of the expected contents of the file
|
||||||
|
|
@ -246,7 +245,7 @@ steps:</para>
|
||||||
|
|
||||||
<para>Since Hello needs Perl, we have to make sure that Perl is in
|
<para>Since Hello needs Perl, we have to make sure that Perl is in
|
||||||
the <envar>PATH</envar>. The <envar>perl</envar> environment
|
the <envar>PATH</envar>. The <envar>perl</envar> environment
|
||||||
variable points to the location of the Perl component (since it
|
variable points to the location of the Perl package (since it
|
||||||
was passed in as an attribute to the derivation), so
|
was passed in as an attribute to the derivation), so
|
||||||
<filename><replaceable>$perl</replaceable>/bin</filename> is the
|
<filename><replaceable>$perl</replaceable>/bin</filename> is the
|
||||||
directory containing the Perl interpreter.</para>
|
directory containing the Perl interpreter.</para>
|
||||||
|
|
@ -276,7 +275,7 @@ steps:</para>
|
||||||
|
|
||||||
<para>GNU Hello is a typical Autoconf-based package, so we first
|
<para>GNU Hello is a typical Autoconf-based package, so we first
|
||||||
have to run its <filename>configure</filename> script. In Nix
|
have to run its <filename>configure</filename> script. In Nix
|
||||||
every component is stored in a separate location in the Nix store,
|
every package is stored in a separate location in the Nix store,
|
||||||
for instance
|
for instance
|
||||||
<filename>/nix/store/9a54ba97fb71b65fda531012d0443ce2-hello-2.1.1</filename>.
|
<filename>/nix/store/9a54ba97fb71b65fda531012d0443ce2-hello-2.1.1</filename>.
|
||||||
Nix computes this path by cryptographically hashing all attributes
|
Nix computes this path by cryptographically hashing all attributes
|
||||||
|
|
@ -338,7 +337,7 @@ rec { <co xml:id='ex-hello-composition-co-1' />
|
||||||
function; it is missing some arguments that have to be filled in
|
function; it is missing some arguments that have to be filled in
|
||||||
somewhere. In the Nix Packages collection this is done in the file
|
somewhere. In the Nix Packages collection this is done in the file
|
||||||
<filename>pkgs/top-level/all-packages.nix</filename>, where all
|
<filename>pkgs/top-level/all-packages.nix</filename>, where all
|
||||||
Nix expressions for components are imported and called with the
|
Nix expressions for packages are imported and called with the
|
||||||
appropriate arguments. <xref linkend='ex-hello-composition' /> shows
|
appropriate arguments. <xref linkend='ex-hello-composition' /> shows
|
||||||
some fragments of
|
some fragments of
|
||||||
<filename>all-packages.nix</filename>.</para>
|
<filename>all-packages.nix</filename>.</para>
|
||||||
|
|
@ -352,7 +351,7 @@ some fragments of
|
||||||
<emphasis>mutually recursive</emphasis> set of attributes. That
|
<emphasis>mutually recursive</emphasis> set of attributes. That
|
||||||
is, the attributes can refer to each other. This is precisely
|
is, the attributes can refer to each other. This is precisely
|
||||||
what we want since we want to <quote>plug</quote> the
|
what we want since we want to <quote>plug</quote> the
|
||||||
various components into each other.</para>
|
various packages into each other.</para>
|
||||||
|
|
||||||
</callout>
|
</callout>
|
||||||
|
|
||||||
|
|
@ -522,8 +521,8 @@ genericBuild <co xml:id='ex-hello-builder2-co-3' /></programlisting>
|
||||||
<callout arearefs='ex-hello-builder2-co-1'>
|
<callout arearefs='ex-hello-builder2-co-1'>
|
||||||
|
|
||||||
<para>The <envar>buildInputs</envar> variable tells
|
<para>The <envar>buildInputs</envar> variable tells
|
||||||
<filename>setup</filename> to use the indicated components as
|
<filename>setup</filename> to use the indicated packages as
|
||||||
<quote>inputs</quote>. This means that if a component provides a
|
<quote>inputs</quote>. This means that if a package provides a
|
||||||
<filename>bin</filename> subdirectory, it's added to
|
<filename>bin</filename> subdirectory, it's added to
|
||||||
<envar>PATH</envar>; if it has a <filename>include</filename>
|
<envar>PATH</envar>; if it has a <filename>include</filename>
|
||||||
subdirectory, it's added to GCC's header search path; and so
|
subdirectory, it's added to GCC's header search path; and so
|
||||||
|
|
@ -594,9 +593,9 @@ Laziness means that arguments to functions are evaluated only when
|
||||||
they are needed. Functional means that functions are
|
they are needed. Functional means that functions are
|
||||||
<quote>normal</quote> values that can be passed around and manipulated
|
<quote>normal</quote> values that can be passed around and manipulated
|
||||||
in interesting ways. The language is not a full-featured, general
|
in interesting ways. The language is not a full-featured, general
|
||||||
purpose language. It's main job is to describe components,
|
purpose language. It's main job is to describe packages,
|
||||||
compositions of components, and the variability within
|
compositions of packages, and the variability within
|
||||||
components.</para>
|
packages.</para>
|
||||||
|
|
||||||
<para>This section presents the various features of the
|
<para>This section presents the various features of the
|
||||||
language.</para>
|
language.</para>
|
||||||
|
|
@ -613,7 +612,10 @@ language.</para>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
|
|
||||||
<para><emphasis>Strings</emphasis> are enclosed between double
|
<para><emphasis>Strings</emphasis> can be written in three
|
||||||
|
ways.</para>
|
||||||
|
|
||||||
|
<para>The most common way is to enclose the string between double
|
||||||
quotes, e.g., <literal>"foo bar"</literal>. Strings can span
|
quotes, e.g., <literal>"foo bar"</literal>. Strings can span
|
||||||
multiple lines. The special characters <literal>"</literal> and
|
multiple lines. The special characters <literal>"</literal> and
|
||||||
<literal>\</literal> and the character sequence
|
<literal>\</literal> and the character sequence
|
||||||
|
|
@ -659,8 +661,73 @@ configureFlags = "
|
||||||
some of which in turn contain expressions (e.g.,
|
some of which in turn contain expressions (e.g.,
|
||||||
<literal>${mesa}</literal>).</para>
|
<literal>${mesa}</literal>).</para>
|
||||||
|
|
||||||
<para>As a convenience, <emphasis>URIs</emphasis> as defined in
|
<para>The second way to write string literals is as an
|
||||||
appendix B of <link
|
<emphasis>indented string</emphasis>, which is enclosed between
|
||||||
|
pairs of <emphasis>double single-quotes</emphasis>, like so:
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
''
|
||||||
|
This is the first line.
|
||||||
|
This is the second line.
|
||||||
|
This is the third line.
|
||||||
|
''</programlisting>
|
||||||
|
|
||||||
|
This kind of string literal intelligently strips indentation from
|
||||||
|
the start of each line. To be precise, it strips from each line a
|
||||||
|
number of spaces equal to the minimal indentation of the string as
|
||||||
|
a whole (disregarding the indentation of empty lines). For
|
||||||
|
instance, the first and second line are indented two space, while
|
||||||
|
the third line is indented three spaces. Thus, two spaces are
|
||||||
|
stripped from each line, so the resulting string is
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
"This is the first line.\nThis is the second line.\n This is the third line.\n"</programlisting>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>Note that the whitespace and newline following the opening
|
||||||
|
<literal>''</literal> is ignored if there is no non-whitespace
|
||||||
|
text on the initial line.</para>
|
||||||
|
|
||||||
|
<para>Antiquotation
|
||||||
|
(<literal>${<replaceable>expr</replaceable>}}</literal>) is
|
||||||
|
supported in indented strings.</para>
|
||||||
|
|
||||||
|
<para>Since <literal>${</literal> and <literal>''</literal> have
|
||||||
|
special meaning in indented strings, you need a way to quote them.
|
||||||
|
<literal>${</literal> can be escaped by prefixing it with
|
||||||
|
<literal>''</literal>, i.e., <literal>''${</literal>.
|
||||||
|
<literal>''</literal> can be escaped by prefixing it with
|
||||||
|
<literal>'</literal>, i.e., <literal>'''</literal>. Finally,
|
||||||
|
linefeed, carriage-return and tab characters can be writted as
|
||||||
|
<literal>''\n</literal>, <literal>''\r</literal>,
|
||||||
|
<literal>''\t</literal>.</para>
|
||||||
|
|
||||||
|
<para>Indented strings are primarily useful in that they allow
|
||||||
|
multi-line string literals to follow the indentation of the
|
||||||
|
enclosing Nix expression, and that less escaping is typically
|
||||||
|
necessary for strings representing languages such as shell scripts
|
||||||
|
and configuration files because <literal>''</literal> is much less
|
||||||
|
common than <literal>"</literal>. Example:
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
<replaceable>...</replaceable>
|
||||||
|
postInstall =
|
||||||
|
''
|
||||||
|
mkdir $out/bin $out/etc
|
||||||
|
cp foo $out/bin
|
||||||
|
echo "Hello World" > $out/etc/foo.conf
|
||||||
|
${if enableBar then "cp bar $out/bin" else ""}
|
||||||
|
'';
|
||||||
|
<replaceable>...</replaceable>
|
||||||
|
}
|
||||||
|
</programlisting>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>Finally, as a convenience, <emphasis>URIs</emphasis> as
|
||||||
|
defined in appendix B of <link
|
||||||
xlink:href='http://www.ietf.org/rfc/rfc2396.txt'>RFC 2396</link>
|
xlink:href='http://www.ietf.org/rfc/rfc2396.txt'>RFC 2396</link>
|
||||||
can be written <emphasis>as is</emphasis>, without quotes. For
|
can be written <emphasis>as is</emphasis>, without quotes. For
|
||||||
instance, the string
|
instance, the string
|
||||||
|
|
@ -1191,7 +1258,7 @@ set, the attributes of which specify the inputs of the build.</para>
|
||||||
|
|
||||||
<listitem><para>There must be an attribute named
|
<listitem><para>There must be an attribute named
|
||||||
<varname>name</varname> whose value must be a string. This is used
|
<varname>name</varname> whose value must be a string. This is used
|
||||||
as a symbolic name for the component by <command>nix-env</command>,
|
as a symbolic name for the package by <command>nix-env</command>,
|
||||||
and it is appended to the hash in the output path of the
|
and it is appended to the hash in the output path of the
|
||||||
derivation.</para></listitem>
|
derivation.</para></listitem>
|
||||||
|
|
||||||
|
|
@ -1579,7 +1646,7 @@ impureEnvVars = ["http_proxy" "https_proxy" <replaceable>...</replaceable>];
|
||||||
|
|
||||||
<para>The standard build environment in the Nix Packages collection
|
<para>The standard build environment in the Nix Packages collection
|
||||||
provides a basic environment for building Unix packages. It consists
|
provides a basic environment for building Unix packages. It consists
|
||||||
of the following components:
|
of the following packages:
|
||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
|
|
||||||
|
|
@ -1645,13 +1712,13 @@ following:
|
||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
|
|
||||||
<listitem><para>All input components specified in the
|
<listitem><para>All input packages specified in the
|
||||||
<envar>buildInputs</envar> environment variable have their
|
<envar>buildInputs</envar> environment variable have their
|
||||||
<filename>/bin</filename> subdirectory added to <envar>PATH</envar>,
|
<filename>/bin</filename> subdirectory added to <envar>PATH</envar>,
|
||||||
their <filename>/include</filename> subdirectory added to the C/C++
|
their <filename>/include</filename> subdirectory added to the C/C++
|
||||||
header file search path, and their <filename>/lib</filename>
|
header file search path, and their <filename>/lib</filename>
|
||||||
subdirectory added to the linker search path. This can be extended.
|
subdirectory added to the linker search path. This can be extended.
|
||||||
For instance, when the <command>pkgconfig</command> component is
|
For instance, when the <command>pkgconfig</command> package is
|
||||||
used, the subdirectory <filename>/lib/pkgconfig</filename> of each
|
used, the subdirectory <filename>/lib/pkgconfig</filename> of each
|
||||||
input is added to the <envar>PKG_CONFIG_PATH</envar> environment
|
input is added to the <envar>PKG_CONFIG_PATH</envar> environment
|
||||||
variable.</para></listitem>
|
variable.</para></listitem>
|
||||||
|
|
@ -1668,8 +1735,8 @@ following:
|
||||||
|
|
||||||
<para>The <filename>setup</filename> script also exports a function
|
<para>The <filename>setup</filename> script also exports a function
|
||||||
called <function>genericBuild</function> that knows how to build
|
called <function>genericBuild</function> that knows how to build
|
||||||
typical Autoconf-style components. It can be customised to perform
|
typical Autoconf-style packages. It can be customised to perform
|
||||||
builds for any type of component. It is advisable to use
|
builds for any type of package. It is advisable to use
|
||||||
<function>genericBuild</function> since it provides facilities that
|
<function>genericBuild</function> since it provides facilities that
|
||||||
are almost always useful such as unpacking of sources, patching of
|
are almost always useful such as unpacking of sources, patching of
|
||||||
sources, nested logging, etc.</para>
|
sources, nested logging, etc.</para>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#! /bin/sh -e
|
#! /bin/sh -e
|
||||||
|
|
||||||
make clean
|
make clean # comment this out when needed !!!
|
||||||
|
|
||||||
export nixstatepath=/nixstate2/nix
|
export nixstatepath=/nixstate2/nix
|
||||||
export ACLOCAL_PATH=/home/wouterdb/.nix-profile/share/aclocal
|
export ACLOCAL_PATH=/home/wouterdb/.nix-profile/share/aclocal
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
svn merge -r 9584:9751 https://svn.cs.uu.nl:12443/repos/trace/nix/trunk
|
svn merge -r 9751:10133 https://svn.cs.uu.nl:12443/repos/trace/nix/trunk
|
||||||
|
|
||||||
#already done:
|
#already done:
|
||||||
# 8628
|
# 8628
|
||||||
|
|
@ -28,3 +28,4 @@ svn merge -r 9584:9751 https://svn.cs.uu.nl:12443/repos/trace/nix/trunk
|
||||||
# 9561
|
# 9561
|
||||||
# 9584
|
# 9584
|
||||||
# 9751
|
# 9751
|
||||||
|
# 10133 TODO
|
||||||
|
|
|
||||||
35
misc/vim/syntax/nix.vim
Normal file
35
misc/vim/syntax/nix.vim
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
" Vim syntax file
|
||||||
|
" Language: nix
|
||||||
|
" Maintainer: Marc Weber <marco-oweber@gmx.de>
|
||||||
|
" Modify and commit if you feel that way
|
||||||
|
" Last Change: 2007 Dec
|
||||||
|
|
||||||
|
" Quit when a (custom) syntax file was already loaded
|
||||||
|
if exists("b:current_syntax")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
syn keyword nixKeyword let throw inherit import true false null with
|
||||||
|
syn keyword nixConditional if else then
|
||||||
|
syn keyword nixBrace ( ) { } =
|
||||||
|
syn keyword nixBuiltin __currentSystem __currentTime __isFunction __getEnv __trace __toPath __pathExists
|
||||||
|
\ __readFile __toXML __toFile __filterSource __attrNames __getAttr __hasAttr __isAttrs __listToAttrs __isList
|
||||||
|
\ __head __tail __add __sub __lessThan __substring __stringLength
|
||||||
|
|
||||||
|
syn match nixAttr "\w\+\ze\s*="
|
||||||
|
syn match nixFuncArg "\zs\w\+\ze\s*:"
|
||||||
|
syn region nixStringParam start=+\${+ end=+}+
|
||||||
|
syn region nixMultiLineComment start=+/\*+ skip=+\\"+ end=+\*/+
|
||||||
|
syn match nixEndOfLineComment "#.*$"
|
||||||
|
syn region nixString start=+"+ skip=+\\"+ end=+"+ contains=nixStringParam
|
||||||
|
|
||||||
|
hi def link nixKeyword Keyword
|
||||||
|
hi def link nixConditional Conditional
|
||||||
|
hi def link nixBrace Special
|
||||||
|
hi def link nixString String
|
||||||
|
hi def link nixBuiltin Special
|
||||||
|
hi def link nixStringParam Macro
|
||||||
|
hi def link nixMultiLineComment Comment
|
||||||
|
hi def link nixEndOfLineComment Comment
|
||||||
|
hi def link nixAttr Identifier
|
||||||
|
hi def link nixFuncArg Identifier
|
||||||
|
|
@ -116,9 +116,9 @@ print NIX "]";
|
||||||
close NIX;
|
close NIX;
|
||||||
|
|
||||||
|
|
||||||
# Instantiate store expressions from the Nix expression.
|
# Instantiate store derivations from the Nix expression.
|
||||||
my @storeExprs;
|
my @storeExprs;
|
||||||
print STDERR "instantiating store expressions...\n";
|
print STDERR "instantiating store derivations...\n";
|
||||||
my $pid = open(READ, "$binDir/nix-instantiate $nixExpr|")
|
my $pid = open(READ, "$binDir/nix-instantiate $nixExpr|")
|
||||||
or die "cannot run nix-instantiate";
|
or die "cannot run nix-instantiate";
|
||||||
while (<READ>) {
|
while (<READ>) {
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ __FBSDID("$FreeBSD: src/usr.bin/bsdiff/bspatch/bspatch.c,v 1.1 2005/08/06 01:59:
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
static off_t offtin(u_char *buf)
|
static off_t offtin(u_char *buf)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
|
|
||||||
%x STRING
|
%x STRING
|
||||||
|
%x IND_STRING
|
||||||
|
|
||||||
|
|
||||||
%{
|
%{
|
||||||
|
|
@ -122,6 +123,26 @@ inherit { return INHERIT; }
|
||||||
<STRING>\" { BEGIN(INITIAL); return '"'; }
|
<STRING>\" { BEGIN(INITIAL); return '"'; }
|
||||||
<STRING>. return yytext[0]; /* just in case: shouldn't be reached */
|
<STRING>. return yytext[0]; /* just in case: shouldn't be reached */
|
||||||
|
|
||||||
|
\'\'(\ *\n)? { BEGIN(IND_STRING); return IND_STRING_OPEN; }
|
||||||
|
<IND_STRING>([^\$\']|\$[^\{\']|\'[^\'])+ {
|
||||||
|
yylval->t = makeIndStr(toATerm(yytext));
|
||||||
|
return IND_STR;
|
||||||
|
}
|
||||||
|
<IND_STRING>\'\'\$ {
|
||||||
|
yylval->t = makeIndStr(toATerm("$"));
|
||||||
|
return IND_STR;
|
||||||
|
}
|
||||||
|
<IND_STRING>\'\'\' {
|
||||||
|
yylval->t = makeIndStr(toATerm("''"));
|
||||||
|
return IND_STR;
|
||||||
|
}
|
||||||
|
<IND_STRING>\'\'\\. {
|
||||||
|
yylval->t = unescapeStr(yytext + 2);
|
||||||
|
return IND_STR;
|
||||||
|
}
|
||||||
|
<IND_STRING>\$\{ { BEGIN(INITIAL); return DOLLAR_CURLY; }
|
||||||
|
<IND_STRING>\'\' { BEGIN(INITIAL); return IND_STRING_CLOSE; }
|
||||||
|
<IND_STRING>. return yytext[0]; /* just in case: shouldn't be reached */
|
||||||
|
|
||||||
{PATH} { yylval->t = toATerm(yytext); return PATH; /* !!! alloc */ }
|
{PATH} { yylval->t = toATerm(yytext); return PATH; /* !!! alloc */ }
|
||||||
{URI} { yylval->t = toATerm(yytext); return URI; /* !!! alloc */ }
|
{URI} { yylval->t = toATerm(yytext); return URI; /* !!! alloc */ }
|
||||||
|
|
@ -148,4 +169,10 @@ void backToString(yyscan_t scanner)
|
||||||
BEGIN(STRING);
|
BEGIN(STRING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void backToIndString(yyscan_t scanner)
|
||||||
|
{
|
||||||
|
struct yyguts_t * yyg = (struct yyguts_t *) scanner;
|
||||||
|
BEGIN(IND_STRING);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,9 @@ Int | int | Expr |
|
||||||
Str | string ATermList | Expr |
|
Str | string ATermList | Expr |
|
||||||
Str | string | Expr | ObsoleteStr
|
Str | string | Expr | ObsoleteStr
|
||||||
|
|
||||||
|
# Internal to the parser, doesn't occur in ASTs.
|
||||||
|
IndStr | string | Expr |
|
||||||
|
|
||||||
# A path is a reference to a file system object that is to be copied
|
# A path is a reference to a file system object that is to be copied
|
||||||
# to the Nix store when used as a derivation attribute. When it is
|
# to the Nix store when used as a derivation attribute. When it is
|
||||||
# concatenated to a string (i.e., `str + path'), it is also copied and
|
# concatenated to a string (i.e., `str + path'), it is also copied and
|
||||||
|
|
|
||||||
|
|
@ -68,9 +68,100 @@ static Expr fixAttrs(int recursive, ATermList as)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void backToString(yyscan_t scanner);
|
static Expr stripIndentation(ATermList es)
|
||||||
|
{
|
||||||
|
if (es == ATempty) return makeStr("");
|
||||||
|
|
||||||
|
/* Figure out the minimum indentation. Note that by design
|
||||||
|
whitespace-only final lines are not taken into account. (So
|
||||||
|
the " " in "\n ''" is ignored, but the " " in "\n foo''" is.) */
|
||||||
|
bool atStartOfLine = true; /* = seen only whitespace in the current line */
|
||||||
|
unsigned int minIndent = 1000000;
|
||||||
|
unsigned int curIndent = 0;
|
||||||
|
ATerm e;
|
||||||
|
for (ATermIterator i(es); i; ++i) {
|
||||||
|
if (!matchIndStr(*i, e)) {
|
||||||
|
/* Anti-quotations end the current start-of-line whitespace. */
|
||||||
|
if (atStartOfLine) {
|
||||||
|
atStartOfLine = false;
|
||||||
|
if (curIndent < minIndent) minIndent = curIndent;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
string s = aterm2String(e);
|
||||||
|
for (unsigned int j = 0; j < s.size(); ++j) {
|
||||||
|
if (atStartOfLine) {
|
||||||
|
if (s[j] == ' ')
|
||||||
|
curIndent++;
|
||||||
|
else if (s[j] == '\n') {
|
||||||
|
/* Empty line, doesn't influence minimum
|
||||||
|
indentation. */
|
||||||
|
curIndent = 0;
|
||||||
|
} else {
|
||||||
|
atStartOfLine = false;
|
||||||
|
if (curIndent < minIndent) minIndent = curIndent;
|
||||||
|
}
|
||||||
|
} else if (s[j] == '\n') {
|
||||||
|
atStartOfLine = true;
|
||||||
|
curIndent = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Strip spaces from each line. */
|
||||||
|
ATermList es2 = ATempty;
|
||||||
|
atStartOfLine = true;
|
||||||
|
unsigned int curDropped = 0;
|
||||||
|
unsigned int n = ATgetLength(es);
|
||||||
|
for (ATermIterator i(es); i; ++i, --n) {
|
||||||
|
if (!matchIndStr(*i, e)) {
|
||||||
|
atStartOfLine = false;
|
||||||
|
curDropped = 0;
|
||||||
|
es2 = ATinsert(es2, *i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
string s = aterm2String(e);
|
||||||
|
string s2;
|
||||||
|
for (unsigned int j = 0; j < s.size(); ++j) {
|
||||||
|
if (atStartOfLine) {
|
||||||
|
if (s[j] == ' ') {
|
||||||
|
if (curDropped++ >= minIndent)
|
||||||
|
s2 += s[j];
|
||||||
|
}
|
||||||
|
else if (s[j] == '\n') {
|
||||||
|
curDropped = 0;
|
||||||
|
s2 += s[j];
|
||||||
|
} else {
|
||||||
|
atStartOfLine = false;
|
||||||
|
curDropped = 0;
|
||||||
|
s2 += s[j];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s2 += s[j];
|
||||||
|
if (s[j] == '\n') atStartOfLine = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove the last line if it is empty and consists only of
|
||||||
|
spaces. */
|
||||||
|
if (n == 1) {
|
||||||
|
unsigned int p = s2.find_last_of('\n');
|
||||||
|
if (p != string::npos && s2.find_first_not_of(' ', p + 1) == string::npos)
|
||||||
|
s2 = string(s2, 0, p + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
es2 = ATinsert(es2, makeStr(s2));
|
||||||
|
}
|
||||||
|
|
||||||
|
return makeConcatStrings(ATreverse(es2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void backToString(yyscan_t scanner);
|
||||||
|
void backToIndString(yyscan_t scanner);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static Pos makeCurPos(YYLTYPE * loc, ParseData * data)
|
static Pos makeCurPos(YYLTYPE * loc, ParseData * data)
|
||||||
{
|
{
|
||||||
return makePos(toATerm(data->path),
|
return makePos(toATerm(data->path),
|
||||||
|
|
@ -121,10 +212,11 @@ static void freeAndUnprotect(void * p)
|
||||||
|
|
||||||
%type <t> start expr expr_function expr_if expr_op
|
%type <t> start expr expr_function expr_if expr_op
|
||||||
%type <t> expr_app expr_select expr_simple bind inheritsrc formal
|
%type <t> expr_app expr_select expr_simple bind inheritsrc formal
|
||||||
%type <ts> binds ids expr_list formals string_parts
|
%type <ts> binds ids expr_list formals string_parts ind_string_parts
|
||||||
%token <t> ID INT STR PATH URI
|
%token <t> ID INT STR IND_STR PATH URI
|
||||||
%token IF THEN ELSE ASSERT WITH LET IN REC INHERIT EQ NEQ AND OR IMPL
|
%token IF THEN ELSE ASSERT WITH LET IN REC INHERIT EQ NEQ AND OR IMPL
|
||||||
%token DOLLAR_CURLY /* == ${ */
|
%token DOLLAR_CURLY /* == ${ */
|
||||||
|
%token IND_STRING_OPEN IND_STRING_CLOSE
|
||||||
|
|
||||||
%nonassoc IMPL
|
%nonassoc IMPL
|
||||||
%left OR
|
%left OR
|
||||||
|
|
@ -199,6 +291,9 @@ expr_simple
|
||||||
else if (ATgetNext($2) == ATempty) $$ = ATgetFirst($2);
|
else if (ATgetNext($2) == ATempty) $$ = ATgetFirst($2);
|
||||||
else $$ = makeConcatStrings(ATreverse($2));
|
else $$ = makeConcatStrings(ATreverse($2));
|
||||||
}
|
}
|
||||||
|
| IND_STRING_OPEN ind_string_parts IND_STRING_CLOSE {
|
||||||
|
$$ = stripIndentation(ATreverse($2));
|
||||||
|
}
|
||||||
| PATH { $$ = makePath(toATerm(absPath(aterm2String($1), data->basePath))); }
|
| PATH { $$ = makePath(toATerm(absPath(aterm2String($1), data->basePath))); }
|
||||||
| URI { $$ = makeStr($1, ATempty); }
|
| URI { $$ = makeStr($1, ATempty); }
|
||||||
| '(' expr ')' { $$ = $2; }
|
| '(' expr ')' { $$ = $2; }
|
||||||
|
|
@ -219,6 +314,12 @@ string_parts
|
||||||
| { $$ = ATempty; }
|
| { $$ = ATempty; }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
ind_string_parts
|
||||||
|
: ind_string_parts IND_STR { $$ = ATinsert($1, $2); }
|
||||||
|
| ind_string_parts DOLLAR_CURLY expr '}' { backToIndString(scanner); $$ = ATinsert($1, $3); }
|
||||||
|
| { $$ = ATempty; }
|
||||||
|
;
|
||||||
|
|
||||||
binds
|
binds
|
||||||
: binds bind { $$ = ATinsert($1, $2); }
|
: binds bind { $$ = ATinsert($1, $2); }
|
||||||
| { $$ = ATempty; }
|
| { $$ = ATempty; }
|
||||||
|
|
|
||||||
|
|
@ -769,6 +769,17 @@ static Expr prim_dirOf(EvalState & state, const ATermVector & args)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return the contents of a file as a string. */
|
||||||
|
static Expr prim_readFile(EvalState & state, const ATermVector & args)
|
||||||
|
{
|
||||||
|
PathSet context;
|
||||||
|
Path path = coerceToPath(state, args[0], context);
|
||||||
|
if (!context.empty())
|
||||||
|
throw EvalError(format("string `%1%' cannot refer to other paths") % path);
|
||||||
|
return makeStr(readFile(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
* Creating files
|
* Creating files
|
||||||
*************************************************************/
|
*************************************************************/
|
||||||
|
|
@ -1054,8 +1065,8 @@ static Expr prim_toString(EvalState & state, const ATermVector & args)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* `substr start len str' returns the substring of `str' starting at
|
/* `substring start len str' returns the substring of `str' starting
|
||||||
character position `min(start, stringLength str)' inclusive and
|
at character position `min(start, stringLength str)' inclusive and
|
||||||
ending at `min(start + len, stringLength str)'. `start' must be
|
ending at `min(start + len, stringLength str)'. `start' must be
|
||||||
non-negative. */
|
non-negative. */
|
||||||
static Expr prim_substring(EvalState & state, const ATermVector & args)
|
static Expr prim_substring(EvalState & state, const ATermVector & args)
|
||||||
|
|
@ -1079,6 +1090,14 @@ static Expr prim_stringLength(EvalState & state, const ATermVector & args)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Expr prim_unsafeDiscardStringContext(EvalState & state, const ATermVector & args)
|
||||||
|
{
|
||||||
|
PathSet context;
|
||||||
|
string s = coerceToString(state, args[0], context);
|
||||||
|
return makeStr(s, PathSet());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
* Primop registration
|
* Primop registration
|
||||||
*************************************************************/
|
*************************************************************/
|
||||||
|
|
@ -1116,6 +1135,7 @@ void EvalState::addPrimOps()
|
||||||
addPrimOp("__pathExists", 1, prim_pathExists);
|
addPrimOp("__pathExists", 1, prim_pathExists);
|
||||||
addPrimOp("baseNameOf", 1, prim_baseNameOf);
|
addPrimOp("baseNameOf", 1, prim_baseNameOf);
|
||||||
addPrimOp("dirOf", 1, prim_dirOf);
|
addPrimOp("dirOf", 1, prim_dirOf);
|
||||||
|
addPrimOp("__readFile", 1, prim_readFile);
|
||||||
|
|
||||||
// Creating files
|
// Creating files
|
||||||
addPrimOp("__toXML", 1, prim_toXML);
|
addPrimOp("__toXML", 1, prim_toXML);
|
||||||
|
|
@ -1145,6 +1165,8 @@ void EvalState::addPrimOps()
|
||||||
addPrimOp("toString", 1, prim_toString);
|
addPrimOp("toString", 1, prim_toString);
|
||||||
addPrimOp("__substring", 3, prim_substring);
|
addPrimOp("__substring", 3, prim_substring);
|
||||||
addPrimOp("__stringLength", 1, prim_stringLength);
|
addPrimOp("__stringLength", 1, prim_stringLength);
|
||||||
|
addPrimOp("__unsafeDiscardStringContext", 1, prim_unsafeDiscardStringContext);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1671,6 +1671,44 @@ void DerivationGoal::startBuilder()
|
||||||
makeValidityRegistration(refs, false));
|
makeValidityRegistration(refs, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The same for derivations
|
||||||
|
s = drv.env["exportBuildReferencesGraph"];
|
||||||
|
ss = tokenizeString(s);
|
||||||
|
if (ss.size() % 2 != 0)
|
||||||
|
throw BuildError(format("odd number of tokens in `exportReferencesGraph': `%1%'") % s);
|
||||||
|
for (Strings::iterator i = ss.begin(); i != ss.end(); ) {
|
||||||
|
string fileName = *i++;
|
||||||
|
checkStoreName(fileName); /* !!! abuse of this function */
|
||||||
|
|
||||||
|
/* Check that the store path is valid. */
|
||||||
|
Path storePath = *i++;
|
||||||
|
if (!isInStore(storePath))
|
||||||
|
throw BuildError(format("`exportReferencesGraph' contains a non-store path `%1%'")
|
||||||
|
% storePath);
|
||||||
|
storePath = toStorePath(storePath);
|
||||||
|
if (!store->isValidPath(storePath))
|
||||||
|
throw BuildError(format("`exportReferencesGraph' contains an invalid path `%1%'")
|
||||||
|
% storePath);
|
||||||
|
|
||||||
|
/* Write closure info to `fileName'. */
|
||||||
|
PathSet refs1,refs;
|
||||||
|
computeFSClosure(storePath, refs1, true, false, 0); //TODO !!!!!!!!!!!!!!!!!!!!!!!!!!! WE (MAY) ALSO NEED TO COPY STATE
|
||||||
|
for (PathSet::iterator j = refs1.begin(); j != refs1.end() ; j++) {
|
||||||
|
refs.insert (*j);
|
||||||
|
if (isDerivation (*j)) {
|
||||||
|
Derivation deriv = derivationFromPath (*j);
|
||||||
|
for (DerivationOutputs::iterator k=deriv.outputs.begin();
|
||||||
|
k != deriv.outputs.end(); k++) {
|
||||||
|
refs.insert(k->second.path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* !!! in secure Nix, the writing should be done on the
|
||||||
|
build uid for security (maybe). */
|
||||||
|
writeStringToFile(tmpDir + "/" + fileName,
|
||||||
|
makeValidityRegistration(refs, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* If `build-users-group' is not empty, then we have to build as
|
/* If `build-users-group' is not empty, then we have to build as
|
||||||
one of the members of that group. */
|
one of the members of that group. */
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ static string gcLockName = "gc.lock";
|
||||||
static string tempRootsDir = "temproots";
|
static string tempRootsDir = "temproots";
|
||||||
static string gcRootsDir = "gcroots";
|
static string gcRootsDir = "gcroots";
|
||||||
|
|
||||||
const unsigned int defaultGcLevel = 1000;
|
static const int defaultGcLevel = 1000;
|
||||||
|
|
||||||
|
|
||||||
/* Acquire the global GC lock. This is used to prevent new Nix
|
/* Acquire the global GC lock. This is used to prevent new Nix
|
||||||
|
|
@ -450,7 +450,7 @@ void LocalStore::collectGarbage(GCAction action, const PathSet & pathsToDelete,
|
||||||
queryBoolSetting("gc-keep-outputs", false);
|
queryBoolSetting("gc-keep-outputs", false);
|
||||||
bool gcKeepDerivations =
|
bool gcKeepDerivations =
|
||||||
queryBoolSetting("gc-keep-derivations", true);
|
queryBoolSetting("gc-keep-derivations", true);
|
||||||
unsigned int gcKeepOutputsThreshold =
|
int gcKeepOutputsThreshold =
|
||||||
queryIntSetting ("gc-keep-outputs-threshold", defaultGcLevel);
|
queryIntSetting ("gc-keep-outputs-threshold", defaultGcLevel);
|
||||||
|
|
||||||
//printMsg(lvlError, format("gcKeepOutputs %1% gcKeepDerivations: %2%") % gcKeepOutputs % gcKeepDerivations);
|
//printMsg(lvlError, format("gcKeepOutputs %1% gcKeepDerivations: %2%") % gcKeepOutputs % gcKeepDerivations);
|
||||||
|
|
@ -536,7 +536,7 @@ void LocalStore::collectGarbage(GCAction action, const PathSet & pathsToDelete,
|
||||||
else if (store->isValidStatePath(j->second.path))
|
else if (store->isValidStatePath(j->second.path))
|
||||||
computeFSClosure(j->second.path, livePaths, true, true, 0);
|
computeFSClosure(j->second.path, livePaths, true, true, 0);
|
||||||
=======
|
=======
|
||||||
*/
|
|
||||||
|
|
||||||
string gcLevelStr = drv.env["__gcLevel"];
|
string gcLevelStr = drv.env["__gcLevel"];
|
||||||
int gcLevel;
|
int gcLevel;
|
||||||
|
|
@ -550,6 +550,20 @@ void LocalStore::collectGarbage(GCAction action, const PathSet & pathsToDelete,
|
||||||
if (store->isValidPath(j->second.path) || store->isValidStatePath(j->second.path))
|
if (store->isValidPath(j->second.path) || store->isValidStatePath(j->second.path))
|
||||||
computeFSClosure(j->second.path, livePaths, true, true, 0);
|
computeFSClosure(j->second.path, livePaths, true, true, 0);
|
||||||
}
|
}
|
||||||
|
=======
|
||||||
|
*/
|
||||||
|
|
||||||
|
string gcLevelStr = drv.env["__gcLevel"];
|
||||||
|
int gcLevel;
|
||||||
|
if (!string2Int(gcLevelStr, gcLevel))
|
||||||
|
gcLevel = defaultGcLevel;
|
||||||
|
|
||||||
|
if (gcLevel >= gcKeepOutputsThreshold)
|
||||||
|
for (DerivationOutputs::iterator j = drv.outputs.begin();
|
||||||
|
j != drv.outputs.end(); ++j)
|
||||||
|
if (store->isValidPath(j->second.path) || store->isValidStatePath(j->second.path))
|
||||||
|
computeFSClosure(j->second.path, livePaths, true, true, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action == gcReturnLive) {
|
if (action == gcReturnLive) {
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,25 @@ Path toStoreOrStatePath(const Path & path)
|
||||||
return Path(path, 0, slash);
|
return Path(path, 0, slash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Path followLinksToStore(const Path & _path)
|
||||||
|
{
|
||||||
|
Path path = absPath(_path);
|
||||||
|
while (!isInStore(path)) {
|
||||||
|
if (!isLink(path)) break;
|
||||||
|
string target = readLink(path);
|
||||||
|
path = absPath(target, dirOf(path));
|
||||||
|
}
|
||||||
|
if (!isInStore(path))
|
||||||
|
throw Error(format("path `%1%' is not in the Nix store") % path);
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Path followLinksToStorePath(const Path & path)
|
||||||
|
{
|
||||||
|
return toStorePath(followLinksToStore(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void checkStoreName(const string & name)
|
void checkStoreName(const string & name)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -259,11 +259,21 @@ bool isStatePath(const Path & path);
|
||||||
|
|
||||||
void checkStoreName(const string & name);
|
void checkStoreName(const string & name);
|
||||||
|
|
||||||
|
|
||||||
/* Chop off the parts after the top-level store name, e.g.,
|
/* Chop off the parts after the top-level store name, e.g.,
|
||||||
/nix/store/abcd-foo/bar => /nix/store/abcd-foo. */
|
/nix/store/abcd-foo/bar => /nix/store/abcd-foo. */
|
||||||
Path toStorePath(const Path & path);
|
Path toStorePath(const Path & path);
|
||||||
Path toStoreOrStatePath(const Path & path);
|
Path toStoreOrStatePath(const Path & path);
|
||||||
|
|
||||||
|
/* Follow symlinks until we end up with a path in the Nix store. */
|
||||||
|
Path followLinksToStore(const Path & path);
|
||||||
|
|
||||||
|
|
||||||
|
/* Same as followLinksToStore(), but apply toStorePath() to the
|
||||||
|
result. */
|
||||||
|
Path followLinksToStorePath(const Path & path);
|
||||||
|
|
||||||
|
|
||||||
/* Constructs a unique store path name. */
|
/* Constructs a unique store path name. */
|
||||||
Path makeStorePath(const string & type,
|
Path makeStorePath(const string & type,
|
||||||
const Hash & hash, const string & suffix);
|
const Hash & hash, const string & suffix);
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
@ -106,8 +107,7 @@ Path canonPath(const Path & path, bool resolveSymlinks)
|
||||||
/* If s points to a symlink, resolve it and restart (since
|
/* If s points to a symlink, resolve it and restart (since
|
||||||
the symlink target might contain new symlinks). */
|
the symlink target might contain new symlinks). */
|
||||||
if (resolveSymlinks && isLink(s)) {
|
if (resolveSymlinks && isLink(s)) {
|
||||||
followCount++;
|
if (++followCount >= maxFollow)
|
||||||
if (followCount >= maxFollow)
|
|
||||||
throw Error(format("infinite symlink recursion in path `%1%'") % path);
|
throw Error(format("infinite symlink recursion in path `%1%'") % path);
|
||||||
temp = absPath(readLink(s), dirOf(s))
|
temp = absPath(readLink(s), dirOf(s))
|
||||||
+ string(i, end);
|
+ string(i, end);
|
||||||
|
|
@ -1031,8 +1031,15 @@ string statusToString(int status)
|
||||||
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
|
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
|
||||||
if (WIFEXITED(status))
|
if (WIFEXITED(status))
|
||||||
return (format("failed with exit code %1%") % WEXITSTATUS(status)).str();
|
return (format("failed with exit code %1%") % WEXITSTATUS(status)).str();
|
||||||
else if (WIFSIGNALED(status))
|
else if (WIFSIGNALED(status)) {
|
||||||
return (format("failed due to signal %1%") % WTERMSIG(status)).str();
|
int sig = WTERMSIG(status);
|
||||||
|
#if HAVE_STRSIGNAL
|
||||||
|
const char * description = strsignal(sig);
|
||||||
|
return (format("failed due to signal %1% (%2%)") % sig % description).str();
|
||||||
|
#else
|
||||||
|
return (format("failed due to signal %1%") % sig).str();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return "died abnormally";
|
return "died abnormally";
|
||||||
} else return "succeeded";
|
} else return "succeeded";
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ Operations:
|
||||||
--set: create a user environment containing a single derivation
|
--set: create a user environment containing a single derivation
|
||||||
--uninstall / -e: remove derivations from the user environment
|
--uninstall / -e: remove derivations from the user environment
|
||||||
--query / -q: perform a query on an environment or Nix expression
|
--query / -q: perform a query on an environment or Nix expression
|
||||||
|
--set-flag NAME VALUE: set derivation meta-attribute to given value
|
||||||
|
|
||||||
The previous operations take a list of derivation names. The special
|
The previous operations take a list of derivation names. The special
|
||||||
name `*' may be used to indicate all derivations.
|
name `*' may be used to indicate all derivations.
|
||||||
|
|
@ -20,8 +21,6 @@ name `*' may be used to indicate all derivations.
|
||||||
--delete-generations GENERATIONS...: deleted listed generations,
|
--delete-generations GENERATIONS...: deleted listed generations,
|
||||||
`old' for all non-current generations
|
`old' for all non-current generations
|
||||||
|
|
||||||
--import / -I FILE: set default Nix expression
|
|
||||||
|
|
||||||
--version: output version information
|
--version: output version information
|
||||||
--help: display help
|
--help: display help
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -430,7 +430,7 @@ static DrvInfos filterBySelector(EvalState & state, const DrvInfos & allElems,
|
||||||
/* Check that all selectors have been used. */
|
/* Check that all selectors have been used. */
|
||||||
for (DrvNames::iterator i = selectors.begin();
|
for (DrvNames::iterator i = selectors.begin();
|
||||||
i != selectors.end(); ++i)
|
i != selectors.end(); ++i)
|
||||||
if (i->hits == 0)
|
if (i->hits == 0 && i->fullName != "*")
|
||||||
throw Error(format("selector `%1%' matches no derivations")
|
throw Error(format("selector `%1%' matches no derivations")
|
||||||
% i->fullName);
|
% i->fullName);
|
||||||
|
|
||||||
|
|
@ -438,13 +438,18 @@ static DrvInfos filterBySelector(EvalState & state, const DrvInfos & allElems,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool isPath(const string & s)
|
||||||
|
{
|
||||||
|
return s.find('/') != string::npos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void queryInstSources(EvalState & state,
|
static void queryInstSources(EvalState & state,
|
||||||
const InstallSourceInfo & instSource, const Strings & args,
|
const InstallSourceInfo & instSource, const Strings & args,
|
||||||
DrvInfos & elems, bool newestOnly)
|
DrvInfos & elems, bool newestOnly)
|
||||||
{
|
{
|
||||||
InstallSourceType type = instSource.type;
|
InstallSourceType type = instSource.type;
|
||||||
|
if (type == srcUnknown && args.size() > 0 && isPath(args.front()))
|
||||||
if (type == srcUnknown && args.size() > 0 && args.front()[0] == '/')
|
|
||||||
type = srcStorePaths;
|
type = srcStorePaths;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
|
@ -496,25 +501,24 @@ static void queryInstSources(EvalState & state,
|
||||||
for (Strings::const_iterator i = args.begin();
|
for (Strings::const_iterator i = args.begin();
|
||||||
i != args.end(); ++i)
|
i != args.end(); ++i)
|
||||||
{
|
{
|
||||||
assertStorePath(*i);
|
Path path = followLinksToStorePath(*i);
|
||||||
|
|
||||||
DrvInfo elem;
|
DrvInfo elem;
|
||||||
elem.attrs = boost::shared_ptr<ATermMap>(new ATermMap(0)); /* ugh... */
|
elem.attrs = boost::shared_ptr<ATermMap>(new ATermMap(0)); /* ugh... */
|
||||||
string name = baseNameOf(*i);
|
string name = baseNameOf(path);
|
||||||
string::size_type dash = name.find('-');
|
string::size_type dash = name.find('-');
|
||||||
if (dash != string::npos)
|
if (dash != string::npos)
|
||||||
name = string(name, dash + 1);
|
name = string(name, dash + 1);
|
||||||
|
|
||||||
if (isDerivation(*i)) {
|
if (isDerivation(path)) {
|
||||||
elem.setDrvPath(*i);
|
elem.setDrvPath(path);
|
||||||
elem.setOutPath(findOutput(derivationFromPath(*i), "out"));
|
elem.setOutPath(findOutput(derivationFromPath(path), "out"));
|
||||||
|
|
||||||
if (name.size() >= drvExtension.size() &&
|
if (name.size() >= drvExtension.size() &&
|
||||||
string(name, name.size() - drvExtension.size()) == drvExtension)
|
string(name, name.size() - drvExtension.size()) == drvExtension)
|
||||||
name = string(name, 0, name.size() - drvExtension.size());
|
name = string(name, 0, name.size() - drvExtension.size());
|
||||||
}
|
}
|
||||||
else
|
else elem.setOutPath(path);
|
||||||
elem.setOutPath(*i);
|
|
||||||
|
|
||||||
elem.name = name;
|
elem.name = name;
|
||||||
|
|
||||||
|
|
@ -964,7 +968,7 @@ static void opSet(Globals & globals,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void uninstallDerivations(Globals & globals, DrvNames & selectors,
|
static void uninstallDerivations(Globals & globals, Strings & selectors,
|
||||||
Path & profile)
|
Path & profile)
|
||||||
{
|
{
|
||||||
PathLocks lock;
|
PathLocks lock;
|
||||||
|
|
@ -977,11 +981,13 @@ static void uninstallDerivations(Globals & globals, DrvNames & selectors,
|
||||||
{
|
{
|
||||||
DrvName drvName(i->name);
|
DrvName drvName(i->name);
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (DrvNames::iterator j = selectors.begin();
|
for (Strings::iterator j = selectors.begin(); j != selectors.end(); ++j)
|
||||||
j != selectors.end(); ++j)
|
/* !!! the repeated calls to followLinksToStorePath() are
|
||||||
if (j->matches(drvName)) {
|
expensive, should pre-compute them. */
|
||||||
printMsg(lvlInfo,
|
if ((isPath(*j) && i->queryOutPath(globals.state) == followLinksToStorePath(*j))
|
||||||
format("uninstalling `%1%'") % i->name);
|
|| DrvName(*j).matches(drvName))
|
||||||
|
{
|
||||||
|
printMsg(lvlInfo, format("uninstalling `%1%'") % i->name);
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -1000,11 +1006,7 @@ static void opUninstall(Globals & globals,
|
||||||
{
|
{
|
||||||
if (opFlags.size() > 0)
|
if (opFlags.size() > 0)
|
||||||
throw UsageError(format("unknown flag `%1%'") % opFlags.front());
|
throw UsageError(format("unknown flag `%1%'") % opFlags.front());
|
||||||
|
uninstallDerivations(globals, opArgs, globals.profile);
|
||||||
DrvNames drvNames = drvNamesFromArgs(opArgs);
|
|
||||||
|
|
||||||
uninstallDerivations(globals, drvNames,
|
|
||||||
globals.profile);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,13 @@ Operations:
|
||||||
|
|
||||||
--gc: run the garbage collector
|
--gc: run the garbage collector
|
||||||
|
|
||||||
--dump: dump a path as a Nix archive
|
--dump: dump a path as a Nix archive, forgetting dependencies
|
||||||
--restore: restore a path from a Nix archive
|
--restore: restore a path from a Nix archive, without
|
||||||
|
registering validity
|
||||||
|
|
||||||
|
--export: export a path as a Nix archive, marking dependencies
|
||||||
|
--import: import a path from a Nix archive, and register as
|
||||||
|
valid
|
||||||
|
|
||||||
--init: initialise the Nix database
|
--init: initialise the Nix database
|
||||||
--verify: verify Nix structures
|
--verify: verify Nix structures
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,9 @@ static Path gcRoot;
|
||||||
static int rootNr = 0;
|
static int rootNr = 0;
|
||||||
static bool indirectRoot = false;
|
static bool indirectRoot = false;
|
||||||
|
|
||||||
|
/*
|
||||||
//Fixes the path and checks if it is a store path , see also toStorePath
|
//Fixes the path and checks if it is a store path , see also toStorePath
|
||||||
|
<<<<<<< .working
|
||||||
static Path fixPath(Path path)
|
static Path fixPath(Path path)
|
||||||
{
|
{
|
||||||
path = absPath(path);
|
path = absPath(path);
|
||||||
|
|
@ -55,6 +57,9 @@ static Path fixStoreOrStatePath(Path path)
|
||||||
return toStoreOrStatePath(path);
|
return toStoreOrStatePath(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
=======
|
||||||
|
>>>>>>> .merge-right.r10133
|
||||||
|
*/
|
||||||
|
|
||||||
static Path useDeriver(Path path)
|
static Path useDeriver(Path path)
|
||||||
{
|
{
|
||||||
|
|
@ -99,7 +104,7 @@ static void opRealise(Strings opFlags, Strings opArgs)
|
||||||
|
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); ++i)
|
i != opArgs.end(); ++i)
|
||||||
*i = fixPath(*i);
|
*i = followLinksToStorePath(*i);
|
||||||
|
|
||||||
if (opArgs.size() > 1) {
|
if (opArgs.size() > 1) {
|
||||||
PathSet drvPaths;
|
PathSet drvPaths;
|
||||||
|
|
@ -292,7 +297,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); ++i)
|
i != opArgs.end(); ++i)
|
||||||
{
|
{
|
||||||
*i = fixPath(*i);
|
*i = followLinksToStorePath(*i);
|
||||||
if (forceRealise) realisePath(*i);
|
if (forceRealise) realisePath(*i);
|
||||||
Derivation drv = derivationFromPathTxn(noTxn, *i);
|
Derivation drv = derivationFromPathTxn(noTxn, *i);
|
||||||
cout << format("%1%\n") % findOutput(drv, "out");
|
cout << format("%1%\n") % findOutput(drv, "out");
|
||||||
|
|
@ -313,8 +318,10 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); ++i)
|
i != opArgs.end(); ++i)
|
||||||
{
|
{
|
||||||
Path path = maybeUseOutput(fixStoreOrStatePath(*i), useOutput, forceRealise);
|
Path path = maybeUseOutput(followLinksToStorePath(*i), useOutput, forceRealise);
|
||||||
if (query == qRequisites) store->storePathRequisites(path, includeOutputs, paths, true, false, revision);
|
|
||||||
|
if (query == qRequisites)
|
||||||
|
store->storePathRequisites(path, includeOutputs, paths, true, false, revision);
|
||||||
else if (query == qRequisitesState) store->storePathRequisites(path, includeOutputs, paths, false, true, revision);
|
else if (query == qRequisitesState) store->storePathRequisites(path, includeOutputs, paths, false, true, revision);
|
||||||
else if (query == qRequisitesFull) store->storePathRequisites(path, includeOutputs, paths, true, true, revision);
|
else if (query == qRequisitesFull) store->storePathRequisites(path, includeOutputs, paths, true, true, revision);
|
||||||
else if (query == qReferences) store->queryStoreReferences(path, paths, revision);
|
else if (query == qReferences) store->queryStoreReferences(path, paths, revision);
|
||||||
|
|
@ -335,7 +342,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); ++i)
|
i != opArgs.end(); ++i)
|
||||||
{
|
{
|
||||||
Path deriver = store->queryDeriver(fixPath(*i));
|
Path deriver = store->queryDeriver(followLinksToStorePath(*i));
|
||||||
cout << format("%1%\n") %
|
cout << format("%1%\n") %
|
||||||
(deriver == "" ? "unknown-deriver" : deriver);
|
(deriver == "" ? "unknown-deriver" : deriver);
|
||||||
}
|
}
|
||||||
|
|
@ -345,7 +352,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); ++i)
|
i != opArgs.end(); ++i)
|
||||||
{
|
{
|
||||||
Path path = useDeriver(fixPath(*i));
|
Path path = useDeriver(followLinksToStorePath(*i));
|
||||||
Derivation drv = derivationFromPathTxn(noTxn, path);
|
Derivation drv = derivationFromPathTxn(noTxn, path);
|
||||||
StringPairs::iterator j = drv.env.find(bindingName);
|
StringPairs::iterator j = drv.env.find(bindingName);
|
||||||
if (j == drv.env.end())
|
if (j == drv.env.end())
|
||||||
|
|
@ -359,7 +366,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); ++i)
|
i != opArgs.end(); ++i)
|
||||||
{
|
{
|
||||||
Path path = maybeUseOutput(fixPath(*i), useOutput, forceRealise);
|
Path path = maybeUseOutput(followLinksToStorePath(*i), useOutput, forceRealise);
|
||||||
Hash hash = store->queryPathHash(path);
|
Hash hash = store->queryPathHash(path);
|
||||||
assert(hash.type == htSHA256);
|
assert(hash.type == htSHA256);
|
||||||
cout << format("sha256:%1%\n") % printHash32(hash);
|
cout << format("sha256:%1%\n") % printHash32(hash);
|
||||||
|
|
@ -370,7 +377,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
PathSet done;
|
PathSet done;
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); ++i)
|
i != opArgs.end(); ++i)
|
||||||
printTree(fixPath(*i), "", "", done);
|
printTree(followLinksToStorePath(*i), "", "", done);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -378,7 +385,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
PathSet roots;
|
PathSet roots;
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); ++i)
|
i != opArgs.end(); ++i)
|
||||||
roots.insert(maybeUseOutput(fixPath(*i), useOutput, forceRealise));
|
roots.insert(maybeUseOutput(followLinksToStorePath(*i), useOutput, forceRealise));
|
||||||
printDotGraph(roots);
|
printDotGraph(roots);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -386,7 +393,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
case qResolve: {
|
case qResolve: {
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); ++i)
|
i != opArgs.end(); ++i)
|
||||||
cout << format("%1%\n") % fixPath(*i);
|
cout << format("%1%\n") % followLinksToStorePath(*i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -403,7 +410,7 @@ static void opReadLog(Strings opFlags, Strings opArgs)
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); ++i)
|
i != opArgs.end(); ++i)
|
||||||
{
|
{
|
||||||
Path path = useDeriver(fixPath(*i));
|
Path path = useDeriver(followLinksToStorePath(*i));
|
||||||
|
|
||||||
Path logPath = (format("%1%/%2%/%3%") %
|
Path logPath = (format("%1%/%2%/%3%") %
|
||||||
nixLogDir % drvsLogDir % baseNameOf(path)).str();
|
nixLogDir % drvsLogDir % baseNameOf(path)).str();
|
||||||
|
|
@ -460,7 +467,7 @@ static void opCheckValidity(Strings opFlags, Strings opArgs)
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); ++i)
|
i != opArgs.end(); ++i)
|
||||||
{
|
{
|
||||||
Path path = fixPath(*i);
|
Path path = followLinksToStorePath(*i);
|
||||||
if (!store->isValidPath(path))
|
if (!store->isValidPath(path))
|
||||||
if (printInvalid)
|
if (printInvalid)
|
||||||
cout << format("%1%\n") % path;
|
cout << format("%1%\n") % path;
|
||||||
|
|
@ -535,7 +542,7 @@ static void opDelete(Strings opFlags, Strings opArgs)
|
||||||
PathSet pathsToDelete;
|
PathSet pathsToDelete;
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); ++i)
|
i != opArgs.end(); ++i)
|
||||||
pathsToDelete.insert(fixPath(*i));
|
pathsToDelete.insert(followLinksToStorePath(*i));
|
||||||
|
|
||||||
PathSet dummy;
|
PathSet dummy;
|
||||||
PrintFreed freed(true, false);
|
PrintFreed freed(true, false);
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
Hello World
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
source common.sh
|
source common.sh
|
||||||
|
|
||||||
try () {
|
try () {
|
||||||
echo -n "$2" > $TEST_ROOT/vector
|
printf "%s" "$2" > $TEST_ROOT/vector
|
||||||
hash=$($nixhash $EXTRA --flat --type "$1" $TEST_ROOT/vector)
|
hash=$($nixhash $EXTRA --flat --type "$1" $TEST_ROOT/vector)
|
||||||
if test "$hash" != "$3"; then
|
if test "$hash" != "$3"; then
|
||||||
echo "hash $1, expected $3, got $hash"
|
echo "hash $1, expected $3, got $hash"
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,20 @@ sed "s|^$|PATH='$PATH'|" < $NIX_DATA_DIR/nix/corepkgs/nar/nar.sh > tmp
|
||||||
chmod +x tmp
|
chmod +x tmp
|
||||||
mv tmp $NIX_DATA_DIR/nix/corepkgs/nar/nar.sh
|
mv tmp $NIX_DATA_DIR/nix/corepkgs/nar/nar.sh
|
||||||
|
|
||||||
|
# An uberhack for Mac OS X 10.5: download-using-manifests uses Perl,
|
||||||
|
# and Perl links against Darwin's libutil.dylib (in /usr/lib), but
|
||||||
|
# when running "make check", the libtool wrapper script around the Nix
|
||||||
|
# binaries sets DYLD_LIBRARY_PATH so that Perl finds Nix's (completely
|
||||||
|
# different) libutil --- so it barfs. So generate a shell wrapper
|
||||||
|
# around download-using-manifests that clears DYLD_LIBRARY_PATH.
|
||||||
|
mv $NIX_BIN_DIR/nix/download-using-manifests.pl $NIX_BIN_DIR/nix/download-using-manifests.pl.real
|
||||||
|
cat > $NIX_BIN_DIR/nix/download-using-manifests.pl <<EOF
|
||||||
|
#! $SHELL -e
|
||||||
|
export DYLD_LIBRARY_PATH=
|
||||||
|
exec $NIX_BIN_DIR/nix/download-using-manifests.pl.real "\$@"
|
||||||
|
EOF
|
||||||
|
chmod +x $NIX_BIN_DIR/nix/download-using-manifests.pl
|
||||||
|
|
||||||
# Initialise the database.
|
# Initialise the database.
|
||||||
$nixstore --init
|
$nixstore --init
|
||||||
|
|
||||||
|
|
|
||||||
1
tests/lang/eval-okay-context.exp
Normal file
1
tests/lang/eval-okay-context.exp
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Str("foo eval-okay-context.nix bar",[])
|
||||||
6
tests/lang/eval-okay-context.nix
Normal file
6
tests/lang/eval-okay-context.nix
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
let s = "foo ${builtins.substring 33 100 (baseNameOf ./eval-okay-context.nix)} bar";
|
||||||
|
in
|
||||||
|
if s == "foo eval-okay-context.nix bar"
|
||||||
|
then abort "context not discarded"
|
||||||
|
else builtins.unsafeDiscardStringContext s
|
||||||
|
|
||||||
1
tests/lang/eval-okay-ind-string.exp
Normal file
1
tests/lang/eval-okay-ind-string.exp
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Str("This is an indented multi-line string\nliteral. An amount of whitespace at\nthe start of each line matching the minimum\nindentation of all lines in the string\nliteral together will be removed. Thus,\nin this case four spaces will be\nstripped from each line, even though\n THIS LINE is indented six spaces.\n\nAlso, empty lines don't count in the\ndetermination of the indentation level (the\nprevious empty line has indentation 0, but\nit doesn't matter).\nIf the string starts with whitespace\n followed by a newline, it's stripped, but\n that's not the case here. Two spaces are\n stripped because of the \" \" at the start. \nThis line is indented\na bit further.\nAnti-quotations, like so, are\nalso allowed.\n The \\ is not special here.\n' can be followed by any character except another ', e.g. 'x'.\nLikewise for $, e.g. $$ or $varName.\nBut ' followed by ' is special, as is $ followed by {.\nIf you want them, use anti-quotations: '', ${.\n Tabs are not interpreted as whitespace (since we can't guess\n what tab settings are intended), so don't use them.\n\tThis line starts with a space and a tab, so only one\n space will be stripped from each line.\nAlso note that if the last line (just before the closing ' ')\nconsists only of whitespace, it's ignored. But here there is\nsome non-whitespace stuff, so the line isn't removed. \nThis shows a hacky way to preserve an empty line after the start.\nBut there's no reason to do so: you could just repeat the empty\nline.\n Similarly you can force an indentation level,\n in this case to 2 spaces. This works because the anti-quote\n is significant (not whitespace).\nstart on network-interfaces\n\nstart script\n\n rm -f /var/run/opengl-driver\n ln -sf 123 /var/run/opengl-driver\n\n rm -f /var/log/slim.log\n \nend script\n\nenv SLIM_CFGFILE=abc\nenv SLIM_THEMESDIR=def\nenv FONTCONFIG_FILE=/etc/fonts/fonts.conf \t\t\t\t# !!! cleanup\nenv XKB_BINDIR=foo/bin \t\t\t\t# Needed for the Xkb extension.\nenv LD_LIBRARY_PATH=libX11/lib:libXext/lib:/usr/lib/ # related to xorg-sys-opengl - needed to load libglx for (AI)GLX support (for compiz)\n\nenv XORG_DRI_DRIVER_PATH=nvidiaDrivers/X11R6/lib/modules/drivers/ \n\nexec slim/bin/slim\nEscaping of ' followed by ': ''\nEscaping of $ followed by {: ${\nAnd finally to interpret \\n etc. as in a string: \n, \r, \t.\n",[])
|
||||||
113
tests/lang/eval-okay-ind-string.nix
Normal file
113
tests/lang/eval-okay-ind-string.nix
Normal file
|
|
@ -0,0 +1,113 @@
|
||||||
|
let
|
||||||
|
|
||||||
|
s1 = ''
|
||||||
|
This is an indented multi-line string
|
||||||
|
literal. An amount of whitespace at
|
||||||
|
the start of each line matching the minimum
|
||||||
|
indentation of all lines in the string
|
||||||
|
literal together will be removed. Thus,
|
||||||
|
in this case four spaces will be
|
||||||
|
stripped from each line, even though
|
||||||
|
THIS LINE is indented six spaces.
|
||||||
|
|
||||||
|
Also, empty lines don't count in the
|
||||||
|
determination of the indentation level (the
|
||||||
|
previous empty line has indentation 0, but
|
||||||
|
it doesn't matter).
|
||||||
|
'';
|
||||||
|
|
||||||
|
s2 = '' If the string starts with whitespace
|
||||||
|
followed by a newline, it's stripped, but
|
||||||
|
that's not the case here. Two spaces are
|
||||||
|
stripped because of the " " at the start.
|
||||||
|
'';
|
||||||
|
|
||||||
|
s3 = ''
|
||||||
|
This line is indented
|
||||||
|
a bit further.
|
||||||
|
''; # indentation of last line doesn't count if it's empty
|
||||||
|
|
||||||
|
s4 = ''
|
||||||
|
Anti-quotations, like ${if true then "so" else "not so"}, are
|
||||||
|
also allowed.
|
||||||
|
'';
|
||||||
|
|
||||||
|
s5 = ''
|
||||||
|
The \ is not special here.
|
||||||
|
' can be followed by any character except another ', e.g. 'x'.
|
||||||
|
Likewise for $, e.g. $$ or $varName.
|
||||||
|
But ' followed by ' is special, as is $ followed by {.
|
||||||
|
If you want them, use anti-quotations: ${"''"}, ${"\${"}.
|
||||||
|
'';
|
||||||
|
|
||||||
|
s6 = ''
|
||||||
|
Tabs are not interpreted as whitespace (since we can't guess
|
||||||
|
what tab settings are intended), so don't use them.
|
||||||
|
This line starts with a space and a tab, so only one
|
||||||
|
space will be stripped from each line.
|
||||||
|
'';
|
||||||
|
|
||||||
|
s7 = ''
|
||||||
|
Also note that if the last line (just before the closing ' ')
|
||||||
|
consists only of whitespace, it's ignored. But here there is
|
||||||
|
some non-whitespace stuff, so the line isn't removed. '';
|
||||||
|
|
||||||
|
s8 = '' ${""}
|
||||||
|
This shows a hacky way to preserve an empty line after the start.
|
||||||
|
But there's no reason to do so: you could just repeat the empty
|
||||||
|
line.
|
||||||
|
'';
|
||||||
|
|
||||||
|
s9 = ''
|
||||||
|
${""} Similarly you can force an indentation level,
|
||||||
|
in this case to 2 spaces. This works because the anti-quote
|
||||||
|
is significant (not whitespace).
|
||||||
|
'';
|
||||||
|
|
||||||
|
s10 = ''
|
||||||
|
'';
|
||||||
|
|
||||||
|
s11 = '''';
|
||||||
|
|
||||||
|
s12 = '' '';
|
||||||
|
|
||||||
|
s13 = ''
|
||||||
|
start on network-interfaces
|
||||||
|
|
||||||
|
start script
|
||||||
|
|
||||||
|
rm -f /var/run/opengl-driver
|
||||||
|
${if true
|
||||||
|
then "ln -sf 123 /var/run/opengl-driver"
|
||||||
|
else if true
|
||||||
|
then "ln -sf 456 /var/run/opengl-driver"
|
||||||
|
else ""
|
||||||
|
}
|
||||||
|
|
||||||
|
rm -f /var/log/slim.log
|
||||||
|
|
||||||
|
end script
|
||||||
|
|
||||||
|
env SLIM_CFGFILE=${"abc"}
|
||||||
|
env SLIM_THEMESDIR=${"def"}
|
||||||
|
env FONTCONFIG_FILE=/etc/fonts/fonts.conf # !!! cleanup
|
||||||
|
env XKB_BINDIR=${"foo"}/bin # Needed for the Xkb extension.
|
||||||
|
env LD_LIBRARY_PATH=${"libX11"}/lib:${"libXext"}/lib:/usr/lib/ # related to xorg-sys-opengl - needed to load libglx for (AI)GLX support (for compiz)
|
||||||
|
|
||||||
|
${if true
|
||||||
|
then "env XORG_DRI_DRIVER_PATH=${"nvidiaDrivers"}/X11R6/lib/modules/drivers/"
|
||||||
|
else if true
|
||||||
|
then "env XORG_DRI_DRIVER_PATH=${"mesa"}/lib/modules/dri"
|
||||||
|
else ""
|
||||||
|
}
|
||||||
|
|
||||||
|
exec ${"slim"}/bin/slim
|
||||||
|
'';
|
||||||
|
|
||||||
|
s14 = ''
|
||||||
|
Escaping of ' followed by ': '''
|
||||||
|
Escaping of $ followed by {: ''${
|
||||||
|
And finally to interpret \n etc. as in a string: ''\n, ''\r, ''\t.
|
||||||
|
'';
|
||||||
|
|
||||||
|
in s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14
|
||||||
1
tests/lang/eval-okay-readfile.exp
Normal file
1
tests/lang/eval-okay-readfile.exp
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Str("builtins.readFile ./eval-okay-readfile.nix\n",[])
|
||||||
1
tests/lang/eval-okay-readfile.nix
Normal file
1
tests/lang/eval-okay-readfile.nix
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
builtins.readFile ./eval-okay-readfile.nix
|
||||||
|
|
@ -18,6 +18,9 @@ if test "$text" != "Hello World!"; then exit 1; fi
|
||||||
$nixstore --delete $outPath
|
$nixstore --delete $outPath
|
||||||
if test -e $outPath/hello; then false; fi
|
if test -e $outPath/hello; then false; fi
|
||||||
|
|
||||||
if test "$(NIX_STORE_DIR=/foo $nixinstantiate --readonly-mode hash-check.nix)" != "/foo/bbfambd3ksry4ylik1772pn2qyw1k296-dependencies.drv"; then
|
echo 'Hello World' > ./dummy
|
||||||
echo "hashDerivationModulo appears broken"
|
outPath="$(NIX_STORE_DIR=/foo $nixinstantiate --readonly-mode hash-check.nix)"
|
||||||
|
if test "$outPath" != "/foo/lfy1s6ca46rm5r6w4gg9hc0axiakjcnm-dependencies.drv"; then
|
||||||
|
echo "hashDerivationModulo appears broken, got $outPath"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ source common.sh
|
||||||
|
|
||||||
clearProfiles
|
clearProfiles
|
||||||
|
|
||||||
|
set -x
|
||||||
|
|
||||||
# Query installed: should be empty.
|
# Query installed: should be empty.
|
||||||
test "$($nixenv -p $profiles/test -q '*' | wc -l)" -eq 0
|
test "$($nixenv -p $profiles/test -q '*' | wc -l)" -eq 0
|
||||||
|
|
||||||
|
|
@ -71,6 +73,15 @@ echo $outPath10
|
||||||
$nixenv -p $profiles/test -i "$outPath10"
|
$nixenv -p $profiles/test -i "$outPath10"
|
||||||
$nixenv -p $profiles/test -q '*' | grep -q foo-1.0
|
$nixenv -p $profiles/test -q '*' | grep -q foo-1.0
|
||||||
|
|
||||||
|
# Uninstall foo-1.0, using a symlink to its store path.
|
||||||
|
ln -sfn $outPath10/bin/foo $TEST_ROOT/symlink
|
||||||
|
$nixenv -p $profiles/test -e $TEST_ROOT/symlink
|
||||||
|
if $nixenv -p $profiles/test -q '*' | grep -q foo; then false; fi
|
||||||
|
|
||||||
|
# Install foo-1.0, now using a symlink to its store path.
|
||||||
|
$nixenv -p $profiles/test -i $TEST_ROOT/symlink
|
||||||
|
$nixenv -p $profiles/test -q '*' | grep -q foo
|
||||||
|
|
||||||
# Delete all old generations.
|
# Delete all old generations.
|
||||||
$nixenv -p $profiles/test --delete-generations old
|
$nixenv -p $profiles/test --delete-generations old
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue