196 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
<chapter xmlns="http://docbook.org/ns/docbook"
 | 
						|
         xmlns:xlink="http://www.w3.org/1999/xlink"
 | 
						|
         xml:id="chap-overlays">
 | 
						|
 <title>Overlays</title>
 | 
						|
 <para>
 | 
						|
  This chapter describes how to extend and change Nixpkgs using overlays.
 | 
						|
  Overlays are used to add layers in the fixed-point used by Nixpkgs to compose
 | 
						|
  the set of all packages.
 | 
						|
 </para>
 | 
						|
 <para>
 | 
						|
  Nixpkgs can be configured with a list of overlays, which are applied in
 | 
						|
  order. This means that the order of the overlays can be significant if
 | 
						|
  multiple layers override the same package.
 | 
						|
 </para>
 | 
						|
<!--============================================================-->
 | 
						|
 <section xml:id="sec-overlays-install">
 | 
						|
  <title>Installing overlays</title>
 | 
						|
 | 
						|
  <para>
 | 
						|
   The list of overlays can be set either explicitly in a Nix expression, or
 | 
						|
   through <literal><nixpkgs-overlays></literal> or user configuration
 | 
						|
   files.
 | 
						|
  </para>
 | 
						|
 | 
						|
  <section xml:id="sec-overlays-argument">
 | 
						|
   <title>Set overlays in NixOS or Nix expressions</title>
 | 
						|
 | 
						|
   <para>
 | 
						|
    On a NixOS system the value of the <literal>nixpkgs.overlays</literal>
 | 
						|
    option, if present, is passed to the system Nixpkgs directly as an
 | 
						|
    argument. Note that this does not affect the overlays for non-NixOS
 | 
						|
    operations (e.g. <literal>nix-env</literal>), which are
 | 
						|
    <link xlink:href="#sec-overlays-lookup">looked</link> up independently.
 | 
						|
   </para>
 | 
						|
 | 
						|
   <para>
 | 
						|
    The list of overlays can be passed explicitly when importing nixpkgs, for
 | 
						|
    example <literal>import <nixpkgs> { overlays = [ overlay1 overlay2 ];
 | 
						|
    }</literal>.
 | 
						|
   </para>
 | 
						|
 | 
						|
   <para>
 | 
						|
    Further overlays can be added by calling the <literal>pkgs.extend</literal>
 | 
						|
    or <literal>pkgs.appendOverlays</literal>, although it is often preferable
 | 
						|
    to avoid these functions, because they recompute the Nixpkgs fixpoint,
 | 
						|
    which is somewhat expensive to do.
 | 
						|
   </para>
 | 
						|
  </section>
 | 
						|
 | 
						|
  <section xml:id="sec-overlays-lookup">
 | 
						|
   <title>Install overlays via configuration lookup</title>
 | 
						|
 | 
						|
   <para>
 | 
						|
    The list of overlays is determined as follows.
 | 
						|
   </para>
 | 
						|
 | 
						|
   <para>
 | 
						|
    <orderedlist>
 | 
						|
     <listitem>
 | 
						|
      <para>
 | 
						|
       First, if an
 | 
						|
       <link xlink:href="#sec-overlays-argument"><varname>overlays</varname>
 | 
						|
       argument</link> to the Nixpkgs function itself is given, then that is
 | 
						|
       used and no path lookup will be performed.
 | 
						|
      </para>
 | 
						|
     </listitem>
 | 
						|
     <listitem>
 | 
						|
      <para>
 | 
						|
       Otherwise, if the Nix path entry
 | 
						|
       <literal><nixpkgs-overlays></literal> exists, we look for overlays at
 | 
						|
       that path, as described below.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
       See the section on <literal>NIX_PATH</literal> in the Nix manual for
 | 
						|
       more details on how to set a value for
 | 
						|
       <literal><nixpkgs-overlays>.</literal>
 | 
						|
      </para>
 | 
						|
     </listitem>
 | 
						|
     <listitem>
 | 
						|
      <para>
 | 
						|
       If one of <filename>~/.config/nixpkgs/overlays.nix</filename> and
 | 
						|
       <filename>~/.config/nixpkgs/overlays/</filename> exists, then we look
 | 
						|
       for overlays at that path, as described below. It is an error if both
 | 
						|
       exist.
 | 
						|
      </para>
 | 
						|
     </listitem>
 | 
						|
    </orderedlist>
 | 
						|
   </para>
 | 
						|
 | 
						|
   <para>
 | 
						|
    If we are looking for overlays at a path, then there are two cases:
 | 
						|
    <itemizedlist>
 | 
						|
     <listitem>
 | 
						|
      <para>
 | 
						|
       If the path is a file, then the file is imported as a Nix expression and
 | 
						|
       used as the list of overlays.
 | 
						|
      </para>
 | 
						|
     </listitem>
 | 
						|
     <listitem>
 | 
						|
      <para>
 | 
						|
       If the path is a directory, then we take the content of the directory,
 | 
						|
       order it lexicographically, and attempt to interpret each as an overlay
 | 
						|
       by:
 | 
						|
       <itemizedlist>
 | 
						|
        <listitem>
 | 
						|
         <para>
 | 
						|
          Importing the file, if it is a <literal>.nix</literal> file.
 | 
						|
         </para>
 | 
						|
        </listitem>
 | 
						|
        <listitem>
 | 
						|
         <para>
 | 
						|
          Importing a top-level <filename>default.nix</filename> file, if it is
 | 
						|
          a directory.
 | 
						|
         </para>
 | 
						|
        </listitem>
 | 
						|
       </itemizedlist>
 | 
						|
      </para>
 | 
						|
     </listitem>
 | 
						|
    </itemizedlist>
 | 
						|
   </para>
 | 
						|
 | 
						|
   <para>
 | 
						|
    Because overlays that are set in NixOS configuration do not affect
 | 
						|
    non-NixOS operations such as <literal>nix-env</literal>, the
 | 
						|
    <filename>overlays.nix</filename> option provides a convenient way to use
 | 
						|
    the same overlays for a NixOS system configuration and user configuration:
 | 
						|
    the same file can be used as <filename>overlays.nix</filename> and imported
 | 
						|
    as the value of <literal>nixpkgs.overlays</literal>.
 | 
						|
   </para>
 | 
						|
 | 
						|
<!-- TODO: Example of sharing overlays between NixOS configuration
 | 
						|
     and configuration lookup. Also reference the example
 | 
						|
     from the sec-overlays-argument paragraph about NixOS.
 | 
						|
 -->
 | 
						|
  </section>
 | 
						|
 </section>
 | 
						|
<!--============================================================-->
 | 
						|
 <section xml:id="sec-overlays-definition">
 | 
						|
  <title>Defining overlays</title>
 | 
						|
 | 
						|
  <para>
 | 
						|
   Overlays are Nix functions which accept two arguments, conventionally called
 | 
						|
   <varname>self</varname> and <varname>super</varname>, and return a set of
 | 
						|
   packages. For example, the following is a valid overlay.
 | 
						|
  </para>
 | 
						|
 | 
						|
<programlisting>
 | 
						|
self: super:
 | 
						|
 | 
						|
{
 | 
						|
  boost = super.boost.override {
 | 
						|
    python = self.python3;
 | 
						|
  };
 | 
						|
  rr = super.callPackage ./pkgs/rr {
 | 
						|
    stdenv = self.stdenv_32bit;
 | 
						|
  };
 | 
						|
}
 | 
						|
</programlisting>
 | 
						|
 | 
						|
  <para>
 | 
						|
   The first argument (<varname>self</varname>) corresponds to the final
 | 
						|
   package set. You should use this set for the dependencies of all packages
 | 
						|
   specified in your overlay. For example, all the dependencies of
 | 
						|
   <varname>rr</varname> in the example above come from
 | 
						|
   <varname>self</varname>, as well as the overridden dependencies used in the
 | 
						|
   <varname>boost</varname> override.
 | 
						|
  </para>
 | 
						|
 | 
						|
  <para>
 | 
						|
   The second argument (<varname>super</varname>) corresponds to the result of
 | 
						|
   the evaluation of the previous stages of Nixpkgs. It does not contain any of
 | 
						|
   the packages added by the current overlay, nor any of the following
 | 
						|
   overlays. This set should be used either to refer to packages you wish to
 | 
						|
   override, or to access functions defined in Nixpkgs. For example, the
 | 
						|
   original recipe of <varname>boost</varname> in the above example, comes from
 | 
						|
   <varname>super</varname>, as well as the <varname>callPackage</varname>
 | 
						|
   function.
 | 
						|
  </para>
 | 
						|
 | 
						|
  <para>
 | 
						|
   The value returned by this function should be a set similar to
 | 
						|
   <filename>pkgs/top-level/all-packages.nix</filename>, containing overridden
 | 
						|
   and/or new packages.
 | 
						|
  </para>
 | 
						|
 | 
						|
  <para>
 | 
						|
   Overlays are similar to other methods for customizing Nixpkgs, in particular
 | 
						|
   the <literal>packageOverrides</literal> attribute described in
 | 
						|
   <xref linkend="sec-modify-via-packageOverrides"/>. Indeed,
 | 
						|
   <literal>packageOverrides</literal> acts as an overlay with only the
 | 
						|
   <varname>super</varname> argument. It is therefore appropriate for basic
 | 
						|
   use, but overlays are more powerful and easier to distribute.
 | 
						|
  </para>
 | 
						|
 </section>
 | 
						|
</chapter>
 |