280 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			280 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
| <section xmlns="http://docbook.org/ns/docbook"
 | ||
|          xmlns:xlink="http://www.w3.org/1999/xlink"
 | ||
|          xml:id="sec-common-env">
 | ||
| 
 | ||
| <title>Common environment variables</title>
 | ||
| 
 | ||
| 
 | ||
| <para>Most Nix commands interpret the following environment variables:</para>
 | ||
| 
 | ||
| <variablelist>
 | ||
| 
 | ||
|   
 | ||
| <varlistentry><term><envar>NIX_ROOT</envar></term>
 | ||
| 
 | ||
|   <listitem><para>If <envar>NIX_ROOT</envar> is set, the Nix command
 | ||
|   will on startup perform a <function>chroot()</function> to the
 | ||
|   specified directory.  This is useful in certain bootstrapping
 | ||
|   situations (e.g., when installing a Nix installation onto a hard
 | ||
|   disk from CD-ROM).</para></listitem>
 | ||
| 
 | ||
| </varlistentry>
 | ||
| 
 | ||
|   
 | ||
| <varlistentry><term><envar>NIX_IGNORE_SYMLINK_STORE</envar></term>
 | ||
| 
 | ||
|   <listitem>
 | ||
| 
 | ||
|   <para>Normally, the Nix store directory (typically
 | ||
|   <filename>/nix/store</filename>) is not allowed to contain any
 | ||
|   symlink components.  This is to prevent “impure” builds.  Builders
 | ||
|   sometimes “canonicalise” paths by resolving all symlink components.
 | ||
|   Thus, builds on different machines (with
 | ||
|   <filename>/nix/store</filename> resolving to different locations)
 | ||
|   could yield different results.  This is generally not a problem,
 | ||
|   except when builds are deployed to machines where
 | ||
|   <filename>/nix/store</filename> resolves differently.  If you are
 | ||
|   sure that you’re not going to do that, you can set
 | ||
|   <envar>NIX_IGNORE_SYMLINK_STORE</envar> to <envar>1</envar>.</para>
 | ||
| 
 | ||
|   <para>Note that if you’re symlinking the Nix store so that you can
 | ||
|   put it on another file system than the root file system, on Linux
 | ||
|   you’re better off using <literal>bind</literal> mount points, e.g.,
 | ||
| 
 | ||
|   <screen>
 | ||
| $ mkdir /nix   
 | ||
| $ mount -o bind /mnt/otherdisk/nix /nix</screen>
 | ||
| 
 | ||
|   Consult the <citerefentry><refentrytitle>mount</refentrytitle>
 | ||
|   <manvolnum>8</manvolnum></citerefentry> manual page for details.</para>
 | ||
| 
 | ||
|   </listitem>
 | ||
| 
 | ||
| </varlistentry>
 | ||
| 
 | ||
| 
 | ||
| <varlistentry><term><envar>NIX_STORE_DIR</envar></term>
 | ||
| 
 | ||
|   <listitem><para>Overrides the location of the Nix store (default
 | ||
|   <filename><replaceable>prefix</replaceable>/store</filename>).</para></listitem>
 | ||
|   
 | ||
| </varlistentry>
 | ||
| 
 | ||
| 
 | ||
| <varlistentry><term><envar>NIX_DATA_DIR</envar></term>
 | ||
| 
 | ||
|   <listitem><para>Overrides the location of the Nix static data
 | ||
|   directory (default
 | ||
|   <filename><replaceable>prefix</replaceable>/share</filename>).</para></listitem>
 | ||
|   
 | ||
| </varlistentry>
 | ||
| 
 | ||
| 
 | ||
| <varlistentry><term><envar>NIX_LOG_DIR</envar></term>
 | ||
| 
 | ||
|   <listitem><para>Overrides the location of the Nix log directory
 | ||
|   (default <filename><replaceable>prefix</replaceable>/log/nix</filename>).</para></listitem>
 | ||
|   
 | ||
| </varlistentry>
 | ||
| 
 | ||
| 
 | ||
| <varlistentry><term><envar>NIX_STATE_DIR</envar></term>
 | ||
| 
 | ||
|   <listitem><para>Overrides the location of the Nix state directory
 | ||
|   (default <filename><replaceable>prefix</replaceable>/var/nix</filename>).</para></listitem>
 | ||
|   
 | ||
| </varlistentry>
 | ||
| 
 | ||
| 
 | ||
| <varlistentry><term><envar>NIX_DB_DIR</envar></term>
 | ||
| 
 | ||
|   <listitem><para>Overrides the location of the Nix database (default
 | ||
|   <filename><replaceable>$NIX_STATE_DIR</replaceable>/db</filename>, i.e.,
 | ||
|   <filename><replaceable>prefix</replaceable>/var/nix/db</filename>).</para></listitem>
 | ||
|   
 | ||
| </varlistentry>
 | ||
| 
 | ||
| 
 | ||
| <varlistentry><term><envar>NIX_CONF_DIR</envar></term>
 | ||
| 
 | ||
|   <listitem><para>Overrides the location of the Nix configuration
 | ||
|   directory (default
 | ||
|   <filename><replaceable>prefix</replaceable>/etc/nix</filename>).</para></listitem>
 | ||
|   
 | ||
| </varlistentry>
 | ||
| 
 | ||
| 
 | ||
| <varlistentry><term><envar>NIX_LOG_TYPE</envar></term>
 | ||
| 
 | ||
|   <listitem><para>Equivalent to the <link
 | ||
|   linkend="opt-log-type"><option>--log-type</option>
 | ||
|   option</link>.</para></listitem>
 | ||
| 
 | ||
| </varlistentry>
 | ||
|   
 | ||
| 
 | ||
| <varlistentry><term><envar>TMPDIR</envar></term>
 | ||
| 
 | ||
|   <listitem><para>Use the specified directory to store temporary
 | ||
|   files.  In particular, this includes temporary build directories;
 | ||
|   these can take up substantial amounts of disk space.  The default is
 | ||
|   <filename>/tmp</filename>.</para></listitem>
 | ||
|   
 | ||
| </varlistentry>
 | ||
| 
 | ||
| 
 | ||
| <varlistentry xml:id="envar-build-hook"><term><envar>NIX_BUILD_HOOK</envar></term>
 | ||
| 
 | ||
|   <listitem>
 | ||
| 
 | ||
|   <para>Specifies the location of the <emphasis>build hook</emphasis>,
 | ||
|   which is a program (typically some script) that Nix will call
 | ||
|   whenever it wants to build a derivation.  This is used to implement
 | ||
|   distributed builds (see <xref linkend="sec-distributed-builds"
 | ||
|   />).  The protocol by which the calling Nix process and the build
 | ||
|   hook communicate is as follows.</para>
 | ||
| 
 | ||
|   <para>The build hook is called with the following command-line
 | ||
|   arguments:
 | ||
| 
 | ||
|   <orderedlist>
 | ||
| 
 | ||
|     <listitem><para>A boolean value <literal>0</literal> or
 | ||
|     <literal>1</literal> specifying whether Nix can locally execute
 | ||
|     more builds, as per the <link
 | ||
|     linkend="opt-max-jobs"><option>--max-jobs</option> option</link>.
 | ||
|     The purpose of this argument is to allow the hook to not have to
 | ||
|     maintain bookkeeping for the local machine.</para></listitem>
 | ||
| 
 | ||
|     <listitem><para>The Nix platform identifier for the local machine
 | ||
|     (e.g., <literal>i686-linux</literal>).</para></listitem>
 | ||
| 
 | ||
|     <listitem><para>The Nix platform identifier for the derivation,
 | ||
|     i.e., its <link linkend="attr-system"><varname>system</varname>
 | ||
|     attribute</link>.</para></listitem>
 | ||
| 
 | ||
|     <listitem><para>The store path of the derivation.</para></listitem>
 | ||
| 
 | ||
|   </orderedlist>
 | ||
| 
 | ||
|   </para>
 | ||
| 
 | ||
|   <para>On the basis of this information, and whatever persistent
 | ||
|   state the build hook keeps about other machines and their current
 | ||
|   load, it has to decide what to do with the build.  It should print
 | ||
|   out on file descriptor 3 one of the following responses (terminated
 | ||
|   by a newline, <literal>"\n"</literal>):
 | ||
| 
 | ||
|   <variablelist>
 | ||
| 
 | ||
|     <varlistentry><term><literal>decline</literal></term>
 | ||
| 
 | ||
|       <listitem><para>The build hook is not willing or able to perform
 | ||
|       the build; the calling Nix process should do the build itself,
 | ||
|       if possible.</para></listitem>
 | ||
| 
 | ||
|     </varlistentry>
 | ||
| 
 | ||
|     <varlistentry><term><literal>postpone</literal></term>
 | ||
| 
 | ||
|       <listitem><para>The build hook cannot perform the build now, but
 | ||
|       can do so in the future (e.g., because all available build slots
 | ||
|       on remote machines are in use).  The calling Nix process should
 | ||
|       postpone this build until at least one currently running build
 | ||
|       has terminated.</para></listitem>
 | ||
| 
 | ||
|     </varlistentry>
 | ||
| 
 | ||
|     <varlistentry><term><literal>accept</literal></term>
 | ||
| 
 | ||
|       <listitem><para>The build hook has accepted the
 | ||
|       build.</para></listitem>
 | ||
| 
 | ||
|     </varlistentry>
 | ||
| 
 | ||
|   </variablelist>
 | ||
| 
 | ||
|   </para>
 | ||
| 
 | ||
|   <para>If the build hook accepts the build, it is possible that it is
 | ||
|   no longer necessary to do the build because some other process has
 | ||
|   performed the build in the meantime.  To prevent races, the hook
 | ||
|   must read from file descriptor 4 a single line that tells it whether
 | ||
|   to continue:
 | ||
| 
 | ||
|   <variablelist>
 | ||
| 
 | ||
|     <varlistentry><term><literal>cancel</literal></term>
 | ||
| 
 | ||
|       <listitem><para>The build has already been done, so the hook
 | ||
|       should exit.</para></listitem>
 | ||
| 
 | ||
|     </varlistentry>
 | ||
|   
 | ||
|     <varlistentry><term><literal>okay</literal></term>
 | ||
| 
 | ||
|       <listitem><para>The hook should proceed with the build.  At this
 | ||
|       point, the calling Nix process has acquired locks on the output
 | ||
|       path, so no other Nix process will perform the
 | ||
|       build.</para></listitem>
 | ||
| 
 | ||
|     </varlistentry>
 | ||
| 
 | ||
|   </variablelist>
 | ||
| 
 | ||
|   </para>
 | ||
| 
 | ||
|   <para>If the hook has been told to proceed, Nix will store in the
 | ||
|   hook’s current directory a number of text files that contain
 | ||
|   information about the derivation:
 | ||
| 
 | ||
|   <variablelist>
 | ||
| 
 | ||
|     <varlistentry><term><filename>inputs</filename></term>
 | ||
| 
 | ||
|       <listitem><para>The set of store paths that are inputs to the
 | ||
|       build process (one per line).  These have to be copied
 | ||
|       <emphasis>to</emphasis> the remote machine (in addition to the
 | ||
|       store derivation itself).</para></listitem>
 | ||
| 
 | ||
|     </varlistentry>
 | ||
|   
 | ||
|     <varlistentry><term><filename>outputs</filename></term>
 | ||
| 
 | ||
|       <listitem><para>The set of store paths that are outputs of the
 | ||
|       derivation (one per line).  These have to be copied
 | ||
|       <emphasis>from</emphasis> the remote machine if the build
 | ||
|       succeeds.</para></listitem>
 | ||
| 
 | ||
|     </varlistentry>
 | ||
| 
 | ||
|     <varlistentry><term><filename>references</filename></term>
 | ||
| 
 | ||
|       <listitem><para>The reference graph of the inputs, in the format
 | ||
|       accepted by the command <command>nix-store
 | ||
|       --register-validity</command>.  It is necessary to run this
 | ||
|       command on the remote machine after copying the inputs to inform
 | ||
|       Nix on the remote machine that the inputs are valid
 | ||
|       paths.</para></listitem>
 | ||
| 
 | ||
|     </varlistentry>
 | ||
| 
 | ||
|   </variablelist>
 | ||
| 
 | ||
|   </para>
 | ||
| 
 | ||
|   <para>The hook should copy the inputs to the remote machine,
 | ||
|   register the validity of the inputs, perform the remote build, and
 | ||
|   copy the outputs back to the local machine.  An exit code other than
 | ||
|   <literal>0</literal> indicates that the hook has failed.</para>
 | ||
| 
 | ||
|   </listitem>
 | ||
| 
 | ||
| 
 | ||
| </varlistentry>
 | ||
| 
 | ||
| 
 | ||
| </variablelist>
 | ||
| 
 | ||
| 
 | ||
| </section>
 |