278 lines
		
	
	
	
		
			9.2 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			278 lines
		
	
	
	
		
			9.2 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_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 standard error 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>After sending <literal># accept</literal>, the hook should
 | 
						||
  read one line from standard input, which will be the string
 | 
						||
  <literal>okay</literal>.  It can then proceed with the build.
 | 
						||
  Before sending <literal>okay</literal>, 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.  An exit
 | 
						||
  code equal to 100 means that the remote build failed (as opposed to,
 | 
						||
  e.g., a network error).</para>
 | 
						||
 | 
						||
  </listitem>
 | 
						||
 | 
						||
 | 
						||
</varlistentry>
 | 
						||
 | 
						||
 | 
						||
<varlistentry xml:id="envar-remote"><term><envar>NIX_REMOTE</envar></term>
 | 
						||
 | 
						||
  <listitem><para>This variable should be set to
 | 
						||
  <literal>daemon</literal> if you want to use the Nix daemon to
 | 
						||
  executed Nix operations, which is necessary in <link
 | 
						||
  linkend="ssec-multi-user">multi-user Nix installations</link>.
 | 
						||
  Otherwise, it should be left unset.</para></listitem>
 | 
						||
 | 
						||
</varlistentry>
 | 
						||
 | 
						||
    
 | 
						||
<varlistentry xml:id="envar-other-stores"><term><envar>NIX_OTHER_STORES</envar></term>
 | 
						||
 | 
						||
  <listitem><para>This variable contains the paths of remote Nix
 | 
						||
  installations from whichs paths can be copied, separated by colons.
 | 
						||
  See <xref linkend="sec-sharing-packages" /> for details.  Each path
 | 
						||
  should be the <filename>/nix</filename> directory of a remote Nix
 | 
						||
  installation (i.e., not the <filename>/nix/store</filename>
 | 
						||
  directory).  The paths are subject to globbing, so you can set it so
 | 
						||
  something like <literal>/var/run/nix/remote-stores/*/nix</literal>
 | 
						||
  and mount multiple remote filesystems in
 | 
						||
  <literal>/var/run/nix/remote-stores</literal>.</para>
 | 
						||
 | 
						||
  <para>Note that if you’re building through the <link
 | 
						||
  linkend="sec-nix-worker">Nix daemon</link>, the only setting for
 | 
						||
  this variable that matters is the one that the
 | 
						||
  <command>nix-worker</command> process uses.  So if you want to
 | 
						||
  change it, you have to restart the daemon.</para></listitem>
 | 
						||
 | 
						||
</varlistentry>
 | 
						||
 | 
						||
    
 | 
						||
</variablelist>
 | 
						||
 | 
						||
 | 
						||
</section>
 |