* Lots of manual updates, in particular the new `nix-store --query'

options were documented, as well as the Nix configuration file.
This commit is contained in:
Eelco Dolstra 2005-04-08 13:00:38 +00:00
parent 4271385a73
commit 8b70f138e0
11 changed files with 462 additions and 174 deletions

View file

@ -20,6 +20,7 @@ MANUAL_SRCS = manual.xml introduction.xml installation.xml \
$(man1_MANS:.1=.xml) \ $(man1_MANS:.1=.xml) \
troubleshooting.xml bugs.xml opt-common.xml opt-common-syn.xml \ troubleshooting.xml bugs.xml opt-common.xml opt-common-syn.xml \
env-common.xml quick-start.xml nix-lang-ref.xml glossary.xml \ env-common.xml quick-start.xml nix-lang-ref.xml glossary.xml \
conf-file.xml \
style.css images style.css images
manual.is-valid: $(MANUAL_SRCS) version.txt manual.is-valid: $(MANUAL_SRCS) version.txt

View file

@ -2,36 +2,25 @@
<itemizedlist> <itemizedlist>
<listitem> <listitem><para>The man-pages generated from the DocBook documentation
<para> are ugly.</para></listitem>
The man-pages generated from the DocBook documentation are ugly.
</para>
</listitem>
<listitem> <listitem><para>Generations properly form a tree. E.g., if after
<para> switching to generation 39, we perform an installation action, a
Generations properly form a tree. E.g., if after switching to generation 43 is created which is a descendant of 39, not 42. So a
generation 39, we perform an installation action, a generation rollback from 43 ought to go back to 39. This is not currently
43 is created which is a descendant of 39, not 42. So a implemented; generations form a linear sequence.</para></listitem>
rollback from 43 ought to go back to 39. This is not
currently implemented; generations form a linear sequence.
</para>
</listitem>
<listitem> <listitem><para><emphasis>Build management.</emphasis> In principle it
<para> is already possible to do build management using Nix (by writing
<emphasis>Build management.</emphasis> In principle it is already builders that perform appropriate build steps), but the Nix expression
possible to do build management using Nix (by writing builders that language is not yet powerful enough to make this pleasant (?). The
perform appropriate build steps), but the Nix expression language is language should be extended with features from the <ulink
not yet powerful enough to make this pleasant (?). The language should url='http://www.cs.uu.nl/~eelco/maak/'>Maak build manager</ulink>.
be extended with features from the <ulink Another interesting idea is to write a <command>make</command>
url='http://www.cs.uu.nl/~eelco/maak/'>Maak build manager</ulink>. implementation that uses Nix as a back-end to support <ulink
Another interesting idea is to write a <command>make</command> url='http://www.research.att.com/~bs/bs_faq.html#legacy'>legacy</ulink>
implementation that uses Nix as a back-end to support <ulink build files.</para></listitem>
url='http://www.research.att.com/~bs/bs_faq.html#legacy'>legacy</ulink>
build files.
</para>
</listitem>
<listitem><para>For security, <command>nix-push</command> manifests <listitem><para>For security, <command>nix-push</command> manifests
should be digitally signed, and <command>nix-pull</command> should should be digitally signed, and <command>nix-pull</command> should
@ -44,6 +33,14 @@ them).</para></listitem>
<command>nix-env --delete-generations</command> to remove non-current <command>nix-env --delete-generations</command> to remove non-current
generations older than a certain age.</para></listitem> generations older than a certain age.</para></listitem>
<listitem><para>There should be a flexible way to change the user
environment builder. Currently, you have to replace
<filename><replaceable>prefix</replaceable>/share/nix/corepkgs/buildenv/builder.pl</filename>,
which is hard-coded into <command>nix-env</command>. Also, the
default builder should be more powerful. For instance, there should
be some way to specify priorities to resolve
collisions.</para></listitem>
</itemizedlist> </itemizedlist>
</appendix> </appendix>

82
doc/manual/conf-file.xml Normal file
View file

@ -0,0 +1,82 @@
<sect1 id="sec-conf-file"><title>Nix configuration file</title>
<para>A number of persistent settings of Nix are stored in the file
<filename><replaceable>prefix</replaceable>/etc/nix/nix.conf</filename>.
This file is a list of <literal><replaceable>name</replaceable> =
<replaceable>value</replaceable></literal> pairs, one per line.
Comments start with a <literal>#</literal> character. An example
configuration file is shown in <xref linkend="ex-nix-conf" />.</para>
<example id='ex-nix-conf'><title>Nix expression for GNU Hello</title>
<programlisting>
gc-keep-outputs = true # Nice for developers
gc-keep-derivations = true # Idem
env-keep-derivations = false
</programlisting>
</example>
<para>The following variables are currently available:
<variablelist>
<varlistentry id="conf-gc-keep-outputs"><term><literal>gc-keep-outputs</literal></term>
<listitem><para>If <literal>true</literal>, the garbage collector
will keep the outputs of non-garbage derivations. If
<literal>false</literal> (default), outputs will be deleted unless
they are GC roots themselves (or reachable from other roots).</para>
<para>In general, outputs must be registered as roots separately.
However, even if the output of a derivation is registered as a
root, the collector will still delete store paths that are used
only at build time (e.g., the C compiler, or source tarballs
downloaded from the network). To prevent it from doing so, set
this option to <literal>true</literal>.</para></listitem>
</varlistentry>
<varlistentry id="conf-gc-keep-derivations"><term><literal>gc-keep-derivations</literal></term>
<listitem><para>If <literal>true</literal> (default), the garbage
collector will keep the derivations from which non-garbage store
paths were built. If <literal>false</literal>, they will be
deleted unless explicitly registered as a root (or reachable from
other roots).</para>
<para>Keeping derivation around is useful for querying and
traceability (e.g., it allows you to ask with what dependencies or
options a store path was built), so by default this option is on.
Turn it off to safe a bit of disk space (or a lot if
<literal>gc-keep-outputs</literal> is also turned on).</para></listitem>
</varlistentry>
<varlistentry><term><literal>env-keep-derivations</literal></term>
<listitem><para>If <literal>false</literal> (default), derivations
are not stored in Nix user environments. That is, the derivation
any build-time-only dependencies may be garbage-collected.</para>
<para>If <literal>true</literal>, when you add a Nix derivation to
a user environment, the path of the derivation is stored in the
user environment. Thus, the derivation will not be
garbage-collected until the user environment generation is deleted
(<command>nix-env --delete-generations</command>). To prevent
build-time-only dependencies from being collected, you should also
turn on <literal>gc-keep-outputs</literal>.</para>
<para>The difference between this option and
<literal>gc-keep-derivations</literal> is that this one is
“sticky”: it applies to any user environment created while this
option was enabled, while <literal>gc-keep-derivations</literal>
only applies at the moment the garbage collector is
run.</para></listitem>
</varlistentry>
</variablelist>
</para>
</sect1>

View file

@ -79,17 +79,47 @@
</glossentry> </glossentry>
<glossentry><glossterm>closure</glossterm> <glossentry id="gloss-reference"><glossterm>reference</glossterm>
<glossdef><para>A store path <varname>P</varname> is said to have a
reference to a store path <varname>Q</varname> if the store object
at <varname>P</varname> contains the path <varname>Q</varname>
somewhere. This implies than an execution involving
<varname>P</varname> potentially needs <varname>Q</varname> to be
present. The <emphasis>references</emphasis> of a store path are
the set of store paths to which it has a reference.</para></glossdef>
</glossentry>
<glossentry id="gloss-closure"><glossterm>closure</glossterm>
<glossdef><para>The closure of a store path is the set of store <glossdef><para>The closure of a store path is the set of store
paths that are directly or indirectly “reachable” from that store paths that are directly or indirectly “reachable” from that store
path. For instance, if the store object at path path; that is, its the closure of the path under the <link
<varname>P</varname> contains a reference to path linkend="gloss-reference">references</link> relation. For instance,
<varname>Q</varname>, then <varname>Q</varname> is in the closure of if the store object at path <varname>P</varname> contains a
<varname>P</varname>. For correct deployment it is necessary to reference to path <varname>Q</varname>, then <varname>Q</varname> is
deploy whole closures, since otherwise at runtime files could be in the closure of <varname>P</varname>. For correct deployment it
missing. The command <command>nix-store -qR</command> prints out is necessary to deploy whole closures, since otherwise at runtime
closures of store paths.</para></glossdef> files could be missing. The command <command>nix-store
-qR</command> prints out closures of store paths.</para></glossdef>
</glossentry>
<glossentry id="gloss-output-path"><glossterm>output path</glossterm>
<glossdef><para>A store path produced by a derivation.</para></glossdef>
</glossentry>
<glossentry id="gloss-deriver"><glossterm>deriver</glossterm>
<glossdef><para>The deriver of an <link
linkend="gloss-output-path">output path</link> is the store
derivation that built it.</para></glossdef>
</glossentry> </glossentry>

View file

@ -35,6 +35,7 @@
<title>Command Reference</title> <title>Command Reference</title>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="opt-common.xml" /> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="opt-common.xml" />
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="env-common.xml" /> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="env-common.xml" />
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="conf-file.xml" />
<sect1> <sect1>
<title>nix-env</title> <title>nix-env</title>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="nix-env.xml" /> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="nix-env.xml" />

View file

@ -10,14 +10,14 @@
<command>nix-push</command> <command>nix-push</command>
<group choice='req'> <group choice='req'>
<arg choice='req'> <arg choice='req'>
<arg choice='plain'><replaceable>archives-put-url</replaceable></arg> <arg choice='plain'><replaceable>archivesPutURL</replaceable></arg>
<arg choice='plain'><replaceable>archives-get-url</replaceable></arg> <arg choice='plain'><replaceable>archivesGetURL</replaceable></arg>
<arg choice='plain'><replaceable>manifest-put-url</replaceable></arg> <arg choice='plain'><replaceable>manifestPutURL</replaceable></arg>
</arg> </arg>
<arg choice='req'> <arg choice='req'>
<arg choice='plain'><option>--copy</option></arg> <arg choice='plain'><option>--copy</option></arg>
<arg choice='plain'><replaceable>archives-dir</replaceable></arg> <arg choice='plain'><replaceable>archivesDir</replaceable></arg>
<arg choice='plain'><replaceable>manifest-file</replaceable></arg> <arg choice='plain'><replaceable>manifestFile</replaceable></arg>
</arg> </arg>
</group> </group>
<arg choice='plain' rep='repeat'><replaceable>paths</replaceable></arg> <arg choice='plain' rep='repeat'><replaceable>paths</replaceable></arg>
@ -59,20 +59,20 @@ machines using the <command>nix-pull</command> command.</para>
archives.</para></listitem> archives.</para></listitem>
<listitem><para>Each store path is uploaded to the remote directory <listitem><para>Each store path is uploaded to the remote directory
specified by <replaceable>archives-put-url</replaceable>. HTTP PUT specified by <replaceable>archivesPutURL</replaceable>. HTTP PUT
requests are used to do this. However, before a file requests are used to do this. However, before a file
<varname>x</varname> is uploaded to <varname>x</varname> is uploaded to
<literal><replaceable>archives-put-url</replaceable>/<varname>x</varname></literal>, <literal><replaceable>archivesPutURL</replaceable>/<varname>x</varname></literal>,
<command>nix-push</command> first determines whether this upload is <command>nix-push</command> first determines whether this upload is
unnecessary by issuing a HTTP HEAD request on unnecessary by issuing a HTTP HEAD request on
<literal><replaceable>archives-get-url</replaceable>/<varname>x</varname></literal>. <literal><replaceable>archivesGetURL</replaceable>/<varname>x</varname></literal>.
This allows a cache to be shared between many partially overlapping This allows a cache to be shared between many partially overlapping
<command>nix-push</command> invocations. (We use two URLs because <command>nix-push</command> invocations. (We use two URLs because
the upload URL typically refers to a CGI script, while the download the upload URL typically refers to a CGI script, while the download
URL just refers to a file system directory on the server.)</para></listitem> URL just refers to a file system directory on the server.)</para></listitem>
<listitem><para>The manifest is uploaded using an HTTP PUT request <listitem><para>The manifest is uploaded using an HTTP PUT request
to <replaceable>manifest-put-url</replaceable>. The corresponding to <replaceable>manifestPutURL</replaceable>. The corresponding
URL to download the manifest can then be used by URL to download the manifest can then be used by
<command>nix-pull</command>.</para></listitem> <command>nix-pull</command>.</para></listitem>

View file

@ -168,7 +168,8 @@ produced by <link
linkend="sec-nix-instantiate"><command>nix-instantiate</command></link>: linkend="sec-nix-instantiate"><command>nix-instantiate</command></link>:
<screen> <screen>
$ nix-store -r $(nix-instantiate ./foo.nix)</screen> $ nix-store -r $(nix-instantiate ./test.nix)
/nix/store/31axcgrlbfsxzmfff1gyj1bf62hvkby2-aterm-2.3.1</screen>
This is essentially what <link This is essentially what <link
linkend="sec-nix-build"><command>nix-build</command></link> does.</para> linkend="sec-nix-build"><command>nix-build</command></link> does.</para>
@ -213,7 +214,9 @@ the Nix store not reachable via file system references from a set of
<varlistentry><term><option>--print-roots</option></term> <varlistentry><term><option>--print-roots</option></term>
<listitem><para>This operation prints on standard output the set <listitem><para>This operation prints on standard output the set
of roots used by the garbage collector.</para></listitem> of roots used by the garbage collector. What constitutes a root
is described in <xref linkend="ssec-gc-roots"
/>.</para></listitem>
</varlistentry> </varlistentry>
@ -247,35 +250,11 @@ the Nix store not reachable via file system references from a set of
</variablelist> </variablelist>
</refsection> <para>The behaviour of the collector is influenced by the <link
linkend="conf-gc-keep-outputs"><literal>gc-keep-outputs</literal></link>
and <link
<refsection><title>Roots</title> linkend="conf-gc-keep-derivations"><literal>gc-keep-derivations</literal></link>
variables in the Nix configuration file.</para>
<para>The roots of the garbage collector are all store paths to which
there are symlinks in the directory
<filename><replaceable>prefix</replaceable>/nix/var/nix/gcroots</filename>.
For instance, the following command makes the path
<filename>/nix/store/d718ef...-foo</filename> a root of the collector:
<screen>
$ ln -s /nix/store/d718ef...-foo /nix/var/nix/gcroots/bar</screen>
That is, after this command, the garbage collector will not remove
<filename>/nix/store/d718ef...-foo</filename> or any of its
dependencies.</para>
<para>Subdirectories of
<filename><replaceable>prefix</replaceable>/nix/var/nix/gcroots</filename>
are also searched for symlinks. Symlinks to non-store paths are
followed and searched for roots, but TODO.</para>
</refsection>
<refsection><title>Configuration file</title>
<para>TODO</para>
</refsection> </refsection>
@ -309,18 +288,24 @@ $ nix-store --gc</screen>
<arg choice='plain'><option>-q</option></arg> <arg choice='plain'><option>-q</option></arg>
</group> </group>
<group choice='req'> <group choice='req'>
<arg choice='plain'><option>--list</option></arg> <arg choice='plain'><option>--outputs</option></arg>
<arg choice='plain'><option>-l</option></arg>
<arg choice='plain'><option>--requisites</option></arg> <arg choice='plain'><option>--requisites</option></arg>
<arg choice='plain'><option>-R</option></arg> <arg choice='plain'><option>-R</option></arg>
<arg choice='plain'><option>--predecessors</option></arg> <arg choice='plain'><option>--references</option></arg>
<arg choice='plain'><option>--referers</option></arg>
<arg choice='plain'><option>--referers-closure</option></arg>
<arg choice='plain'><option>--deriver</option></arg>
<arg choice='plain'><option>--deriver</option></arg>
<arg choice='plain'><option>--graph</option></arg> <arg choice='plain'><option>--graph</option></arg>
<arg choice='plain'><option>--tree</option></arg>
<arg choice='plain'><option>--binding</option> <replaceable>name</replaceable></arg>
<arg choice='plain'><option>--hash</option></arg>
</group> </group>
<arg><option>--normalise</option></arg> <arg><option>--use-output</option></arg>
<arg><option>-n</option></arg> <arg><option>-u</option></arg>
<arg><option>--force-realise</option></arg> <arg><option>--force-realise</option></arg>
<arg><option>-f</option></arg> <arg><option>-f</option></arg>
<arg choice='plain' rep='repeat'><replaceable>args</replaceable></arg> <arg choice='plain' rep='repeat'><replaceable>paths</replaceable></arg>
</cmdsynopsis> </cmdsynopsis>
</refsection> </refsection>
@ -329,9 +314,14 @@ $ nix-store --gc</screen>
<refsection><title>Description</title> <refsection><title>Description</title>
<para>The operation <option>--query</option> displays various bits of <para>The operation <option>--query</option> displays various bits of
information about store paths. The queries are described below. At information about the store paths . The queries are described below. At
most one query can be specified. The default query is most one query can be specified. The default query is
<option>--list</option>.</para> <option>--outputs</option>.</para>
<para>The paths <replaceable>paths</replaceable> may also be symlinks
from outside of the Nix store, to the Nix store. In that case, the
query is applied to the target of the symlink.</para>
</refsection> </refsection>
@ -365,47 +355,21 @@ most one query can be specified. The default query is
<variablelist> <variablelist>
<varlistentry><term><option>--list</option> / <option>-l</option></term> <varlistentry><term><option>--outputs</option></term>
<listitem><para>Prints out the <emphasis>output paths</emphasis> <listitem><para>Prints out the <link
of the store expressions indicated by the identifiers linkend="gloss-output-path">output paths</link> of the store
<replaceable>args</replaceable>. In the case of a derivation derivations <replaceable>paths</replaceable>. These are the paths
expression, these are the paths that will be produced when the that will be produced when the derivation is
derivation is realised. In the case of a closure expression, built.</para></listitem>
these are the paths that were produced the derivation expression
of which the closure expression is a successor.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry><term><option>--requisites</option> / <option>-R</option></term> <varlistentry><term><option>--requisites</option> / <option>-R</option></term>
<listitem><para>Prints out the requisite paths of the store <listitem><para>Prints out the <link
expressions indicated by the identifiers linkend="gloss-closure">closure</link> of the store path
<replaceable>args</replaceable>. The requisite paths of a Nix <replaceable>paths</replaceable>.</para>
expression are the paths that need to be present in the system to
be able to realise the expression. That is, they form the
<emphasis>closure</emphasis> of the expression in the file system
(i.e., no path in the set of requisite paths points to anything
outside the set of requisite paths).</para>
<para>The notion of requisite paths is very useful when one wants
to distribute store expressions. Since they form a closure, they
are the only paths one needs to distribute to another system to be
able to realise the expression on the other system.</para>
<para>This query is generally used to implement various kinds of
deployment. A <emphasis>source deployment</emphasis> is obtained
by distributing the requisite paths of a derivation expression. A
<emphasis>binary deployment</emphasis> is obtained by distributing
the requisite paths of a closure expression. A <emphasis>cache
deployment</emphasis> is obtained by distributing the requisite
paths of a derivation expression and specifying the option
<option>--include-successors</option>. This will include not just
the paths of a source and binary deployment, but also all
expressions and paths of subterms of the source. This is useful
if one wants to realise on the target system a Nix expression that
is similar but not quite the same as the one being distributed,
since any common subterms will be reused.</para>
<para>This query has one option:</para> <para>This query has one option:</para>
@ -420,17 +384,104 @@ most one query can be specified. The default query is
</variablelist> </variablelist>
<para>This query can be used to implement various kinds of
deployment. A <emphasis>source deployment</emphasis> is obtained
by distributing the closure of a store derivation. A
<emphasis>binary deployment</emphasis> is obtained by distributing
the closure of an output path. A <emphasis>cache
deployment</emphasis> (combined source/binary deployment,
including binaries of build-time-only dependencies) is obtained by
distributing the closure of a store derivation and specifying the
option <option>--include-outputs</option>.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry><term><option>--references</option></term>
<listitem><para>Prints the set of <link
linkend="gloss-reference">references</link> of the store paths
<replaceable>paths</replaceable>, that is, their immediate
dependencies. (For <emphasis>all</emphasis> dependencies, use
<option>--requisites</option>.)</para></listitem>
</varlistentry>
<varlistentry><term><option>--referers</option></term>
<listitem><para>Prints the set of <emphasis>referers</emphasis> of
the store paths <replaceable>paths</replaceable>, that is, the
store paths currently existing in the Nix store that refer to one
of <replaceable>paths</replaceable>. Note that contrary to the
references, the set of referers is not constant; it can change as
store paths are added or removed.</para></listitem>
</varlistentry>
<varlistentry><term><option>--referers-closure</option></term>
<listitem><para>Prints the closure of the set of store paths
<replaceable>paths</replaceable> under the referers relation; that
is, all store paths that directly or indirectly refer to one of
<replaceable>paths</replaceable>. These are all the path currently
in the Nix store that are dependent on
<replaceable>paths</replaceable>.</para></listitem>
</varlistentry>
<varlistentry><term><option>--deriver</option></term>
<listitem><para>Prints the <link
linkend="gloss-deriver">deriver</link> of the store paths
<replaceable>paths</replaceable>. If the path has no deriver
(e.g., if it is a source file), or if the deriver is not known
(e.g., in the case of a binary-only deployment), the string
<literal>unknown-deriver</literal> is printed.</para></listitem>
</varlistentry>
<varlistentry><term><option>--graph</option></term> <varlistentry><term><option>--graph</option></term>
<listitem><para>Prints a graph of the closure of the store <listitem><para>Prints the references graph of the store paths
expressions identified by <replaceable>args</replaceable> in the <replaceable>paths</replaceable> in the format of the
format of the <command>dot</command> tool of AT&amp;T's GraphViz <command>dot</command> tool of AT&amp;T's <ulink
package.</para></listitem> url="http://www.graphviz.org/">Graphviz package</ulink>. This can
be used to visualise dependency graphs. To obtain a build-time
dependency graph, apply this to a store derivation. To obtain a
runtime dependency graph, apply it to an output
path.</para></listitem>
</varlistentry>
<varlistentry><term><option>--tree</option></term>
<listitem><para>Prints the references graph of the store paths
<replaceable>paths</replaceable> as a nested ASCII tree.
References are ordered by descending closure size; this tends to
flatten the tree, making it more readable. The query only
recurses into a store path when it is first encountered; this
prevents a blowup of the tree representation of the
graph.</para></listitem>
</varlistentry>
<varlistentry><term><option>--binding</option> <replaceable>name</replaceable></term>
<listitem><para>Prints the value of the attribute
<replaceable>name</replaceable> (i.e., environment variable) of
the store derivations <replaceable>paths</replaceable>. It is an
error for a derivation to not have the specified
attribute.</para></listitem>
</varlistentry>
<varlistentry><term><option>--hash</option></term>
<listitem><para>Prints the SHA-256 hash of the contents of the
store path <replaceable>paths</replaceable>. Since the hash is
stored in the Nix database, this is a fast
operation.</para></listitem>
</varlistentry> </varlistentry>
@ -439,6 +490,81 @@ most one query can be specified. The default query is
</refsection> </refsection>
<refsection><title>Examples</title>
<para>Print the closure (runtime dependencies) of the
<command>svn</command> program in the current user environment:
<screen>
$ nix-store -qR $(which svn)
/nix/store/4mbglq5ldqld8sj57273aljwkfvj22mc-subversion-1.1.4
/nix/store/8lz9yc6zgmc0vlqmn2ipcpkjlmbi51vv-glibc-2.3.4
<replaceable>...</replaceable></screen>
</para>
<para>Print the build-time dependencies of <command>svn</command>:
<screen>
$ nix-store -qR $(nix-store -qd $(which svn))
/nix/store/02iizgn86m42q905rddvg4ja975bk2i4-grep-2.5.1.tar.bz2.drv
/nix/store/07a2bzxmzwz5hp58nf03pahrv2ygwgs3-gcc-wrapper.sh
/nix/store/0ma7c9wsbaxahwwl04gbw3fcd806ski4-glibc-2.3.4.drv
<replaceable>... lots of other paths ...</replaceable></screen>
The difference with the previous example is that we ask the closure of
the derivation (<option>-qd</option>), not the closure of the output
path that contains <command>svn</command>.</para>
<para>Show the build-time dependencies as a tree:
<screen>
$ nix-store -q --tree $(nix-store -qd $(which svn))
/nix/store/7i5082kfb6yjbqdbiwdhhza0am2xvh6c-subversion-1.1.4.drv
+---/nix/store/d8afh10z72n8l1cr5w42366abiblgn54-builder.sh
+---/nix/store/fmzxmpjx2lh849ph0l36snfj9zdibw67-bash-3.0.drv
| +---/nix/store/570hmhmx3v57605cqg9yfvvyh0nnb8k8-bash
| +---/nix/store/p3srsbd8dx44v2pg6nbnszab5mcwx03v-builder.sh
<replaceable>...</replaceable></screen>
</para>
<para>Show all paths that depend on the same OpenSSL library as
<command>svn</command>:
<screen>
$ nix-store -q --referers $(nix-store -q --binding openssl $(nix-store -qd $(which svn)))
/nix/store/23ny9l9wixx21632y2wi4p585qhva1q8-sylpheed-1.0.0
/nix/store/4mbglq5ldqld8sj57273aljwkfvj22mc-subversion-1.1.4
/nix/store/dpmvp969yhdqs7lm2r1a3gng7pyq6vy4-subversion-1.1.3
/nix/store/l51240xqsgg8a7yrbqdx1rfzyv6l26fx-lynx-2.8.5</screen>
</para>
<para>Show all paths that directly or indirectly depend on the Glibc
(C library) used by <command>svn</command>:
<screen>
$ nix-store -q --referers-closure $(ldd $(which svn) | grep /libc.so | awk '{print $3}')
/nix/store/034a6h4vpz9kds5r6kzb9lhh81mscw43-libgnomeprintui-2.8.2
/nix/store/05l3yi0d45prm7a82pcrknxdh6nzmxza-gawk-3.1.4
<replaceable>...</replaceable></screen>
Note that <command>ldd</command> is a command that prints out the
dynamic libraries used by an ELF executable.</para>
<para>Make a picture of the runtime dependency graph of the current
user environment:
<screen>
$ nix-store -q --graph ~/.nix-profile | dot -Tps > graph.ps
$ gv graph.ps</screen>
</para>
</refsection>
</refsection> </refsection>

View file

@ -35,33 +35,33 @@
<variablelist> <variablelist>
<varlistentry><term>0</term> <varlistentry><term>0</term>
<listitem><para><quote>Errors only</quote>: only print messages <listitem><para>“Errors only”: only print messages
explaining why the Nix invocation failed.</para></listitem> explaining why the Nix invocation failed.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry><term>1</term> <varlistentry><term>1</term>
<listitem><para><quote>Informational</quote>: print <listitem><para>“Informational”: print
<emphasis>useful</emphasis> messages about what Nix is doing. <emphasis>useful</emphasis> messages about what Nix is doing.
This is the default.</para></listitem> This is the default.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry><term>2</term> <varlistentry><term>2</term>
<listitem><para><quote>Talkative</quote>: print more informational <listitem><para>“Talkative”: print more informational
messages.</para></listitem> messages.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry><term>3</term> <varlistentry><term>3</term>
<listitem><para><quote>Chatty</quote>: print even more <listitem><para>“Chatty”: print even more
informational messages.</para></listitem> informational messages.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry><term>4</term> <varlistentry><term>4</term>
<listitem><para><quote>Debug</quote>: print debug <listitem><para>“Debug”: print debug
information.</para></listitem> information.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry><term>5</term> <varlistentry><term>5</term>
<listitem><para><quote>Vomit</quote>: print vast amounts of debug <listitem><para>“Vomit”: print vast amounts of debug
information.</para></listitem> information.</para></listitem>
</varlistentry> </varlistentry>
@ -120,19 +120,21 @@
<listitem> <listitem>
<para>Whenever Nix attempts to realise a derivation for which a <para>Whenever Nix attempts to build a derivation for which
closure is already known, but this closure cannot be realised, fall substitutes are known for each output path, but realising the output
back on normalising the derivation.</para> paths through the substitutes fails, fall back on building the
derivation.</para>
<para>The most common scenario in which this is useful is when we <para>The most common scenario in which this is useful is when we
have registered substitutes in order to perform binary distribution have registered substitutes in order to perform binary distribution
from, say, a network repository. If the repository is down, the from, say, a network repository. If the repository is down, the
realisation of the derivation will fail. When this option is realisation of the derivation will fail. When this option is
specified, Nix will build the derivation instead. Thus, binary specified, Nix will build the derivation instead. Thus,
installation falls back on a source installation. This option is installation from binaries falls back on nstallation from source.
not the default since it is generally not desirable for a transient This option is not the default since it is generally not desirable
failure in obtaining the substitutes to lead to a full build from for a transient failure in obtaining the substitutes to lead to a
source (with the related consumption of resources).</para> full build from source (with the related consumption of
resources).</para>
</listitem> </listitem>

View file

@ -369,30 +369,39 @@ $ nix-env --delete-generations 10 11 14</screen>
garbage collector as follows: garbage collector as follows:
<screen> <screen>
$ nix-collect-garbage</screen> $ nix-store --gc</screen>
You can alo first view what files would be deleted: If you are feeling uncertain, you can also first view what files would
be deleted:
<screen> <screen>
$ nix-collect-garbage --print-dead</screen> $ nix-store --gc --print-dead</screen>
Likewise, the option <option>--print-live</option> will show the paths Likewise, the option <option>--print-live</option> will show the paths
that <emphasis>wont</emphasis> be deleted.</para> that <emphasis>wont</emphasis> be deleted.</para>
<sect2 id="ssec-gc-roots"><title>Garbage collector roots</title> <sect2 id="ssec-gc-roots"><title>Garbage collector roots</title>
<para>TODO</para> <para>The roots of the garbage collector are all store paths to which
there are symlinks in the directory
<filename><replaceable>prefix</replaceable>/nix/var/nix/gcroots</filename>.
For instance, the following command makes the path
<filename>/nix/store/d718ef...-foo</filename> a root of the collector:
<para>The garbage collector uses as roots all store expressions <screen>
mentioned in all files with extension <filename>.gcroot</filename> in $ ln -s /nix/store/d718ef...-foo /nix/var/nix/gcroots/bar</screen>
the directory
<filename><replaceable>prefix</replaceable>/var/nix/gcroots/</filename>, That is, after this command, the garbage collector will not remove
or in any file or directory symlinked to from that directory. E.g., <filename>/nix/store/d718ef...-foo</filename> or any of its
by default, dependencies.</para>
<filename><replaceable>prefix</replaceable>/var/nix/gcroots/</filename>
contains a symlink to <para>Subdirectories of
<filename><replaceable>prefix</replaceable>/var/nix/profiles/</filename>, <filename><replaceable>prefix</replaceable>/nix/var/nix/gcroots</filename>
so all generations of all profiles are also roots of the collector.</para> are also searched for symlinks. Symlinks to non-store paths are
followed and searched for roots, but symlinks to non-store paths
<emphasis>inside</emphasis> the paths reached in that way are not
followed to prevent infinite recursion.</para>
</sect2> </sect2>

View file

@ -88,8 +88,8 @@ $ 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 component for which
there is a <quote>newer</quote> version (as determined by comparing there is a “newer” version (as determined by comparing the version
the version numbers).</para></listitem> numbers).</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 component turned
@ -106,12 +106,12 @@ actually delete them:
<screen> <screen>
$ nix-env --delete-generations old $ nix-env --delete-generations old
$ nix-collect-garbage</screen> $ nix-store --gc</screen>
The first command deletes old <quote>generations</quote> of your The first command deletes old “generations” of your profile (making
profile (making rollbacks impossible, but also making the components rollbacks impossible, but also making the components in those old
in those old generations available for garbage collection), while the generations available for garbage collection), while the second
second command actually deletes them.</para></listitem> command actually deletes them.</para></listitem>
</orderedlist> </orderedlist>

View file

@ -1,31 +1,71 @@
<appendix> <appendix><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.</para>
<sect1><title>Berkeley DB: <quote>Cannot allocate memory</quote></title>
<para>Symptom: Nix operations (in particular the <sect1><title>Berkeley DB: <quote>Cannot allocate memory</quote></title>
<command>nix-store</command> operations <option>--gc</option>,
<option>--verify</option>, and <option>--clear-substitutes</option> <para>Symptom: Nix operations (in particular the
— the latter being called by <command>nix-channel <command>nix-store</command> operations <option>--gc</option>,
--update</command>) failing: <option>--verify</option>, and <option>--clear-substitutes</option>
the latter being called by <command>nix-channel --update</command>)
failing:
<screen> <screen>
$ nix-store --verify $ nix-store --verify
error: Db::del: Cannot allocate memory</screen> error: Db::del: Cannot allocate memory</screen>
Possible solution: make sure that no Nix processes are running, </para>
then do:
<para>Possible solution: make sure that no Nix processes are running,
then do:
<screen> <screen>
$ cd /nix/var/nix/db $ cd /nix/var/nix/db
$ rm __db.00*</screen> $ rm __db.00*</screen>
</para> </para>
</sect1>
</sect1> <sect1><title>Collisions in <command>nix-env</command></title>
<para>Symptom: when installing or upgrading, you get an error message such as
<screen>
$ nix-env -i docbook-xml
...
adding /nix/store/s5hyxgm62gk2...-docbook-xml-4.2
collission between `/nix/store/s5hyxgm62gk2...-docbook-xml-4.2/xml/dtd/docbook/calstblx.dtd'
and `/nix/store/06h377hr4b33...-docbook-xml-4.3/xml/dtd/docbook/calstblx.dtd'
at /nix/store/...-builder.pl line 62.</screen>
</para>
<para>The cause is that two installed packages in the user environment
have overlapping filenames (e.g.,
<filename>xml/dtd/docbook/calstblx.dtd</filename>. This usually
happens when you accidentally try to install two versions of the same
package. For instance, in the example above, the Nix Packages
collection contains two versions of <literal>docbook-xml</literal>, so
<command>nix-env -i</command> will try to install both. The default
user environment builder has no way to way to resolve such conflicts,
so it just gives up.</para>
<para>Solution: remove one of the offending packages from the user
environment (if already installed) using <command>nix-env
-u</command>, or specify exactly which version should be installed
(e.g., <literal>nix-env -i docbook-xml-4.2</literal>).</para>
<para>Alternatively, you can modify the user environment builder
script (in
<filename><replaceable>prefix</replaceable>/share/nix/corepkgs/buildenv/builder.pl</filename>)
to implement some conflict resolution policy. E.g., the script could
be modified to rename conflicting file names, or to pick one over the
other.</para>
</sect1>
</appendix> </appendix>