forked from lix-project/lix
* component -> package.
This commit is contained in:
parent
6d6c68c0d2
commit
d4950f207f
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,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
|
||||||
|
@ -750,35 +750,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>
|
||||||
|
|
|
@ -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.-->
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
@ -1191,7 +1190,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 +1578,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 +1644,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 +1667,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>
|
||||||
|
|
Loading…
Reference in a new issue