summary refs log tree commit diff
path: root/doc/package-notes.xml
diff options
context:
space:
mode:
Diffstat (limited to 'doc/package-notes.xml')
-rw-r--r--doc/package-notes.xml590
1 files changed, 0 insertions, 590 deletions
diff --git a/doc/package-notes.xml b/doc/package-notes.xml
deleted file mode 100644
index d2c660e22a9b0..0000000000000
--- a/doc/package-notes.xml
+++ /dev/null
@@ -1,590 +0,0 @@
-<chapter xmlns="http://docbook.org/ns/docbook"
-         xmlns:xlink="http://www.w3.org/1999/xlink"
-         xml:id="chap-package-notes">
- <title>Package Notes</title>
- <para>
-  This chapter contains information about how to use and maintain the Nix
-  expressions for a number of specific packages, such as the Linux kernel or
-  X.org.
- </para>
-<!--============================================================-->
- <section xml:id="sec-linux-kernel">
-  <title>Linux kernel</title>
-
-  <para>
-   The Nix expressions to build the Linux kernel are in
-   <link
-xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/os-specific/linux/kernel"><filename>pkgs/os-specific/linux/kernel</filename></link>.
-  </para>
-
-  <para>
-   The function that builds the kernel has an argument
-   <varname>kernelPatches</varname> which should be a list of <literal>{name,
-   patch, extraConfig}</literal> attribute sets, where <varname>name</varname>
-   is the name of the patch (which is included in the kernel’s
-   <varname>meta.description</varname> attribute), <varname>patch</varname> is
-   the patch itself (possibly compressed), and <varname>extraConfig</varname>
-   (optional) is a string specifying extra options to be concatenated to the
-   kernel configuration file (<filename>.config</filename>).
-  </para>
-
-  <para>
-   The kernel derivation exports an attribute <varname>features</varname>
-   specifying whether optional functionality is or isn’t enabled. This is
-   used in NixOS to implement kernel-specific behaviour. For instance, if the
-   kernel has the <varname>iwlwifi</varname> feature (i.e. has built-in support
-   for Intel wireless chipsets), then NixOS doesn’t have to build the
-   external <varname>iwlwifi</varname> package:
-<programlisting>
-modulesTree = [kernel]
-  ++ pkgs.lib.optional (!kernel.features ? iwlwifi) kernelPackages.iwlwifi
-  ++ ...;
-</programlisting>
-  </para>
-
-  <para>
-   How to add a new (major) version of the Linux kernel to Nixpkgs:
-   <orderedlist>
-    <listitem>
-     <para>
-      Copy the old Nix expression (e.g. <filename>linux-2.6.21.nix</filename>)
-      to the new one (e.g. <filename>linux-2.6.22.nix</filename>) and update
-      it.
-     </para>
-    </listitem>
-    <listitem>
-     <para>
-      Add the new kernel to <filename>all-packages.nix</filename> (e.g., create
-      an attribute <varname>kernel_2_6_22</varname>).
-     </para>
-    </listitem>
-    <listitem>
-     <para>
-      Now we’re going to update the kernel configuration. First unpack the
-      kernel. Then for each supported platform (<literal>i686</literal>,
-      <literal>x86_64</literal>, <literal>uml</literal>) do the following:
-      <orderedlist>
-       <listitem>
-        <para>
-         Make an copy from the old config (e.g.
-         <filename>config-2.6.21-i686-smp</filename>) to the new one (e.g.
-         <filename>config-2.6.22-i686-smp</filename>).
-        </para>
-       </listitem>
-       <listitem>
-        <para>
-         Copy the config file for this platform (e.g.
-         <filename>config-2.6.22-i686-smp</filename>) to
-         <filename>.config</filename> in the kernel source tree.
-        </para>
-       </listitem>
-       <listitem>
-        <para>
-         Run <literal>make oldconfig
-         ARCH=<replaceable>{i386,x86_64,um}</replaceable></literal> and answer
-         all questions. (For the uml configuration, also add
-         <literal>SHELL=bash</literal>.) Make sure to keep the configuration
-         consistent between platforms (i.e. don’t enable some feature on
-         <literal>i686</literal> and disable it on <literal>x86_64</literal>).
-        </para>
-       </listitem>
-       <listitem>
-        <para>
-         If needed you can also run <literal>make menuconfig</literal>:
-<screen>
-<prompt>$ </prompt>nix-env -i ncurses
-<prompt>$ </prompt>export NIX_CFLAGS_LINK=-lncurses
-<prompt>$ </prompt>make menuconfig ARCH=<replaceable>arch</replaceable></screen>
-        </para>
-       </listitem>
-       <listitem>
-        <para>
-         Copy <filename>.config</filename> over the new config file (e.g.
-         <filename>config-2.6.22-i686-smp</filename>).
-        </para>
-       </listitem>
-      </orderedlist>
-     </para>
-    </listitem>
-    <listitem>
-     <para>
-      Test building the kernel: <literal>nix-build -A kernel_2_6_22</literal>.
-      If it compiles, ship it! For extra credit, try booting NixOS with it.
-     </para>
-    </listitem>
-    <listitem>
-     <para>
-      It may be that the new kernel requires updating the external kernel
-      modules and kernel-dependent packages listed in the
-      <varname>linuxPackagesFor</varname> function in
-      <filename>all-packages.nix</filename> (such as the NVIDIA drivers, AUFS,
-      etc.). If the updated packages aren’t backwards compatible with older
-      kernels, you may need to keep the older versions around.
-     </para>
-    </listitem>
-   </orderedlist>
-  </para>
- </section>
-<!--============================================================-->
- <section xml:id="sec-xorg">
-  <title>X.org</title>
-
-  <para>
-   The Nix expressions for the X.org packages reside in
-   <filename>pkgs/servers/x11/xorg/default.nix</filename>. This file is
-   automatically generated from lists of tarballs in an X.org release. As such
-   it should not be modified directly; rather, you should modify the lists, the
-   generator script or the file
-   <filename>pkgs/servers/x11/xorg/overrides.nix</filename>, in which you can
-   override or add to the derivations produced by the generator.
-  </para>
-
-  <para>
-   The generator is invoked as follows:
-<screen>
-<prompt>$ </prompt>cd pkgs/servers/x11/xorg
-<prompt>$ </prompt>cat tarballs-7.5.list extra.list old.list \
-  | perl ./generate-expr-from-tarballs.pl
-</screen>
-   For each of the tarballs in the <filename>.list</filename> files, the script
-   downloads it, unpacks it, and searches its <filename>configure.ac</filename>
-   and <filename>*.pc.in</filename> files for dependencies. This information is
-   used to generate <filename>default.nix</filename>. The generator caches
-   downloaded tarballs between runs. Pay close attention to the <literal>NOT
-   FOUND: <replaceable>name</replaceable></literal> messages at the end of the
-   run, since they may indicate missing dependencies. (Some might be optional
-   dependencies, however.)
-  </para>
-
-  <para>
-   A file like <filename>tarballs-7.5.list</filename> contains all tarballs in
-   a X.org release. It can be generated like this:
-<screen>
-<prompt>$ </prompt>export i="mirror://xorg/X11R7.4/src/everything/"
-<prompt>$ </prompt>cat $(PRINT_PATH=1 nix-prefetch-url $i | tail -n 1) \
-  | perl -e 'while (&lt;>) { if (/(href|HREF)="([^"]*.bz2)"/) { print "$ENV{'i'}$2\n"; }; }' \
-  | sort > tarballs-7.4.list
-</screen>
-   <filename>extra.list</filename> contains libraries that aren’t part of
-   X.org proper, but are closely related to it, such as
-   <literal>libxcb</literal>. <filename>old.list</filename> contains some
-   packages that were removed from X.org, but are still needed by some people
-   or by other packages (such as <varname>imake</varname>).
-  </para>
-
-  <para>
-   If the expression for a package requires derivation attributes that the
-   generator cannot figure out automatically (say, <varname>patches</varname>
-   or a <varname>postInstall</varname> hook), you should modify
-   <filename>pkgs/servers/x11/xorg/overrides.nix</filename>.
-  </para>
- </section>
-<!--============================================================-->
-<!--
-<section xml:id="sec-package-notes-gnome">
-  <title>Gnome</title>
-  <para>* Expression is auto-generated</para>
-  <para>* How to update</para>
-</section>
--->
-<!--============================================================-->
-<!--
-<section xml:id="sec-package-notes-gcc">
-  <title>GCC</title>
-  <para>…</para>
-</section>
--->
-<!--============================================================-->
- <section xml:id="sec-eclipse">
-  <title>Eclipse</title>
-
-  <para>
-   The Nix expressions related to the Eclipse platform and IDE are in
-   <link xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/eclipse"><filename>pkgs/applications/editors/eclipse</filename></link>.
-  </para>
-
-  <para>
-   Nixpkgs provides a number of packages that will install Eclipse in its
-   various forms. These range from the bare-bones Eclipse Platform to the more
-   fully featured Eclipse SDK or Scala-IDE packages and multiple version are
-   often available. It is possible to list available Eclipse packages by
-   issuing the command:
-<screen>
-<prompt>$ </prompt>nix-env -f '&lt;nixpkgs&gt;' -qaP -A eclipses --description
-</screen>
-   Once an Eclipse variant is installed it can be run using the
-   <command>eclipse</command> command, as expected. From within Eclipse it is
-   then possible to install plugins in the usual manner by either manually
-   specifying an Eclipse update site or by installing the Marketplace Client
-   plugin and using it to discover and install other plugins. This installation
-   method provides an Eclipse installation that closely resemble a manually
-   installed Eclipse.
-  </para>
-
-  <para>
-   If you prefer to install plugins in a more declarative manner then Nixpkgs
-   also offer a number of Eclipse plugins that can be installed in an
-   <emphasis>Eclipse environment</emphasis>. This type of environment is
-   created using the function <varname>eclipseWithPlugins</varname> found
-   inside the <varname>nixpkgs.eclipses</varname> attribute set. This function
-   takes as argument <literal>{ eclipse, plugins ? [], jvmArgs ? [] }</literal>
-   where <varname>eclipse</varname> is a one of the Eclipse packages described
-   above, <varname>plugins</varname> is a list of plugin derivations, and
-   <varname>jvmArgs</varname> is a list of arguments given to the JVM running
-   the Eclipse. For example, say you wish to install the latest Eclipse
-   Platform with the popular Eclipse Color Theme plugin and also allow Eclipse
-   to use more RAM. You could then add
-<screen>
-packageOverrides = pkgs: {
-  myEclipse = with pkgs.eclipses; eclipseWithPlugins {
-    eclipse = eclipse-platform;
-    jvmArgs = [ "-Xmx2048m" ];
-    plugins = [ plugins.color-theme ];
-  };
-}
-</screen>
-   to your Nixpkgs configuration
-   (<filename>~/.config/nixpkgs/config.nix</filename>) and install it by
-   running <command>nix-env -f '&lt;nixpkgs&gt;' -iA myEclipse</command> and
-   afterward run Eclipse as usual. It is possible to find out which plugins are
-   available for installation using <varname>eclipseWithPlugins</varname> by
-   running
-<screen>
-<prompt>$ </prompt>nix-env -f '&lt;nixpkgs&gt;' -qaP -A eclipses.plugins --description
-</screen>
-  </para>
-
-  <para>
-   If there is a need to install plugins that are not available in Nixpkgs then
-   it may be possible to define these plugins outside Nixpkgs using the
-   <varname>buildEclipseUpdateSite</varname> and
-   <varname>buildEclipsePlugin</varname> functions found in the
-   <varname>nixpkgs.eclipses.plugins</varname> attribute set. Use the
-   <varname>buildEclipseUpdateSite</varname> function to install a plugin
-   distributed as an Eclipse update site. This function takes <literal>{ name,
-   src }</literal> as argument where <literal>src</literal> indicates the
-   Eclipse update site archive. All Eclipse features and plugins within the
-   downloaded update site will be installed. When an update site archive is not
-   available then the <varname>buildEclipsePlugin</varname> function can be
-   used to install a plugin that consists of a pair of feature and plugin JARs.
-   This function takes an argument <literal>{ name, srcFeature, srcPlugin
-   }</literal> where <literal>srcFeature</literal> and
-   <literal>srcPlugin</literal> are the feature and plugin JARs, respectively.
-  </para>
-
-  <para>
-   Expanding the previous example with two plugins using the above functions we
-   have
-<screen>
-packageOverrides = pkgs: {
-  myEclipse = with pkgs.eclipses; eclipseWithPlugins {
-    eclipse = eclipse-platform;
-    jvmArgs = [ "-Xmx2048m" ];
-    plugins = [
-      plugins.color-theme
-      (plugins.buildEclipsePlugin {
-        name = "myplugin1-1.0";
-        srcFeature = fetchurl {
-          url = "http://…/features/myplugin1.jar";
-          sha256 = "123…";
-        };
-        srcPlugin = fetchurl {
-          url = "http://…/plugins/myplugin1.jar";
-          sha256 = "123…";
-        };
-      });
-      (plugins.buildEclipseUpdateSite {
-        name = "myplugin2-1.0";
-        src = fetchurl {
-          stripRoot = false;
-          url = "http://…/myplugin2.zip";
-          sha256 = "123…";
-        };
-      });
-    ];
-  };
-}
-</screen>
-  </para>
- </section>
- <section xml:id="sec-elm">
-  <title>Elm</title>
-
-  <para>
-   To start a development environment do <command>nix-shell -p elmPackages.elm elmPackages.elm-format</command>
-  </para>
-
-  <para>
-   To update Elm compiler, see
-   <filename>nixpkgs/pkgs/development/compilers/elm/README.md</filename>.
-  </para>
-
-  <para>
-   To package Elm applications,
-   <link xlink:href="https://github.com/hercules-ci/elm2nix#elm2nix">read about
-   elm2nix</link>.
-  </para>
- </section>
- <section xml:id="sec-kakoune">
-  <title>Kakoune</title>
-
-  <para>
-   Kakoune can be built to autoload plugins:
-<programlisting>(kakoune.override {
-  configure = {
-    plugins = with pkgs.kakounePlugins; [ parinfer-rust ];
-  };
-})</programlisting>
-  </para>
- </section>
- <section xml:id="sec-shell-helpers">
-  <title>Interactive shell helpers</title>
-
-  <para>
-   Some packages provide the shell integration to be more useful. But unlike
-   other systems, nix doesn't have a standard share directory location. This is
-   why a bunch <command>PACKAGE-share</command> scripts are shipped that print
-   the location of the corresponding shared folder. Current list of such
-   packages is as following:
-   <itemizedlist>
-    <listitem>
-     <para>
-      <literal>autojump</literal>: <command>autojump-share</command>
-     </para>
-    </listitem>
-    <listitem>
-     <para>
-      <literal>fzf</literal>: <command>fzf-share</command>
-     </para>
-    </listitem>
-   </itemizedlist>
-   E.g. <literal>autojump</literal> can then used in the .bashrc like this:
-<screen>
-  source "$(autojump-share)/autojump.bash"
-</screen>
-  </para>
- </section>
- <section xml:id="sec-weechat">
-  <title>Weechat</title>
-
-  <para>
-   Weechat can be configured to include your choice of plugins, reducing its
-   closure size from the default configuration which includes all available
-   plugins. To make use of this functionality, install an expression that
-   overrides its configuration such as
-<programlisting>weechat.override {configure = {availablePlugins, ...}: {
-    plugins = with availablePlugins; [ python perl ];
-  }
-}</programlisting>
-   If the <literal>configure</literal> function returns an attrset without the
-   <literal>plugins</literal> attribute, <literal>availablePlugins</literal>
-   will be used automatically.
-  </para>
-
-  <para>
-   The plugins currently available are <literal>python</literal>,
-   <literal>perl</literal>, <literal>ruby</literal>, <literal>guile</literal>,
-   <literal>tcl</literal> and <literal>lua</literal>.
-  </para>
-
-  <para>
-   The python and perl plugins allows the addition of extra libraries. For
-   instance, the <literal>inotify.py</literal> script in weechat-scripts
-   requires D-Bus or libnotify, and the <literal>fish.py</literal> script
-   requires pycrypto. To use these scripts, use the plugin's
-   <literal>withPackages</literal> attribute:
-<programlisting>weechat.override { configure = {availablePlugins, ...}: {
-    plugins = with availablePlugins; [
-            (python.withPackages (ps: with ps; [ pycrypto python-dbus ]))
-        ];
-    };
-}
-</programlisting>
-  </para>
-
-  <para>
-   In order to also keep all default plugins installed, it is possible to use
-   the following method:
-<programlisting>weechat.override { configure = { availablePlugins, ... }: {
-  plugins = builtins.attrValues (availablePlugins // {
-    python = availablePlugins.python.withPackages (ps: with ps; [ pycrypto python-dbus ]);
-  });
-}; }
-</programlisting>
-  </para>
-
-  <para>
-   WeeChat allows to set defaults on startup using the
-   <literal>--run-command</literal>. The <literal>configure</literal> method
-   can be used to pass commands to the program:
-<programlisting>weechat.override {
-  configure = { availablePlugins, ... }: {
-    init = ''
-      /set foo bar
-      /server add freenode chat.freenode.org
-    '';
-  };
-}</programlisting>
-   Further values can be added to the list of commands when running
-   <literal>weechat --run-command "your-commands"</literal>.
-  </para>
-
-  <para>
-   Additionally it's possible to specify scripts to be loaded when starting
-   <literal>weechat</literal>. These will be loaded before the commands from
-   <literal>init</literal>:
-<programlisting>weechat.override {
-  configure = { availablePlugins, ... }: {
-    scripts = with pkgs.weechatScripts; [
-      weechat-xmpp weechat-matrix-bridge wee-slack
-    ];
-    init = ''
-      /set plugins.var.python.jabber.key "val"
-    '':
-  };
-}</programlisting>
-  </para>
-
-  <para>
-   In <literal>nixpkgs</literal> there's a subpackage which contains
-   derivations for WeeChat scripts. Such derivations expect a
-   <literal>passthru.scripts</literal> attribute which contains a list of all
-   scripts inside the store path. Furthermore all scripts have to live in
-   <literal>$out/share</literal>. An exemplary derivation looks like this:
-<programlisting>{ stdenv, fetchurl }:
-
-stdenv.mkDerivation {
-  name = "exemplary-weechat-script";
-  src = fetchurl {
-    url = "https://scripts.tld/your-scripts.tar.gz";
-    sha256 = "...";
-  };
-  passthru.scripts = [ "foo.py" "bar.lua" ];
-  installPhase = ''
-    mkdir $out/share
-    cp foo.py $out/share
-    cp bar.lua $out/share
-  '';
-}</programlisting>
-  </para>
- </section>
- <section xml:id="sec-ibus-typing-booster">
-  <title>ibus-engines.typing-booster</title>
-
-  <para>
-   This package is an ibus-based completion method to speed up typing.
-  </para>
-
-  <section xml:id="sec-ibus-typing-booster-activate">
-   <title>Activating the engine</title>
-
-   <para>
-    IBus needs to be configured accordingly to activate
-    <literal>typing-booster</literal>. The configuration depends on the desktop
-    manager in use. For detailed instructions, please refer to the
-    <link xlink:href="https://mike-fabian.github.io/ibus-typing-booster/documentation.html">upstream
-    docs</link>.
-   </para>
-
-   <para>
-    On NixOS you need to explicitly enable <literal>ibus</literal> with given
-    engines before customizing your desktop to use
-    <literal>typing-booster</literal>. This can be achieved using the
-    <literal>ibus</literal> module:
-<programlisting>{ pkgs, ... }: {
-  i18n.inputMethod = {
-    enabled = "ibus";
-    ibus.engines = with pkgs.ibus-engines; [ typing-booster ];
-  };
-}</programlisting>
-   </para>
-  </section>
-
-  <section xml:id="sec-ibus-typing-booster-customize-hunspell">
-   <title>Using custom hunspell dictionaries</title>
-
-   <para>
-    The IBus engine is based on <literal>hunspell</literal> to support
-    completion in many languages. By default the dictionaries
-    <literal>de-de</literal>, <literal>en-us</literal>, <literal>fr-moderne</literal>
-    <literal>es-es</literal>, <literal>it-it</literal>,
-    <literal>sv-se</literal> and <literal>sv-fi</literal> are in use. To add
-    another dictionary, the package can be overridden like this:
-<programlisting>ibus-engines.typing-booster.override {
-  langs = [ "de-at" "en-gb" ];
-}</programlisting>
-   </para>
-
-   <para>
-    <emphasis>Note: each language passed to <literal>langs</literal> must be an
-    attribute name in <literal>pkgs.hunspellDicts</literal>.</emphasis>
-   </para>
-  </section>
-
-  <section xml:id="sec-ibus-typing-booster-emoji-picker">
-   <title>Built-in emoji picker</title>
-
-   <para>
-    The <literal>ibus-engines.typing-booster</literal> package contains a
-    program named <literal>emoji-picker</literal>. To display all emojis
-    correctly, a special font such as <literal>noto-fonts-emoji</literal> is
-    needed:
-   </para>
-
-   <para>
-    On NixOS it can be installed using the following expression:
-<programlisting>{ pkgs, ... }: {
-  fonts.fonts = with pkgs; [ noto-fonts-emoji ];
-}</programlisting>
-   </para>
-  </section>
- </section>
- <section xml:id="sec-nginx">
-  <title>Nginx</title>
-
-  <para>
-    <link xlink:href="https://nginx.org/">Nginx</link> is a
-    reverse proxy and lightweight webserver.
-  </para>
-
-  <section xml:id="sec-nginx-etag">
-   <title>ETags on static files served from the Nix store</title>
-
-   <para>
-     HTTP has a couple different mechanisms for caching to prevent
-     clients from having to download the same content repeatedly
-     if a resource has not changed since the last time it was requested.
-     When nginx is used as a server for static files, it implements
-     the caching mechanism based on the
-     <link xlink:href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified"><literal>Last-Modified</literal></link>
-     response header automatically; unfortunately, it works by using
-     filesystem timestamps to determine the value of the
-     <literal>Last-Modified</literal> header. This doesn't give the
-     desired behavior when the file is in the Nix store, because all
-     file timestamps are set to 0 (for reasons related to build
-     reproducibility).
-   </para>
-
-   <para>
-     Fortunately, HTTP supports an alternative (and more effective)
-     caching mechanism: the
-    <link xlink:href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag"><literal>ETag</literal></link>
-    response header. The value of the <literal>ETag</literal> header
-    specifies some identifier for the particular content that the
-    server is sending (e.g. a hash). When a client makes a second
-    request for the same resource, it sends that value back in an
-    <literal>If-None-Match</literal> header. If the ETag value is
-    unchanged, then the server does not need to resend the content.
-   </para>
-
-   <para>
-    As of NixOS 19.09, the nginx package in Nixpkgs is patched such
-    that when nginx serves a file out of <filename>/nix/store</filename>,
-    the hash in the store path is used as the <literal>ETag</literal>
-    header in the HTTP response, thus providing proper caching functionality.
-    This happens automatically; you do not need to do modify any
-    configuration to get this behavior.
-   </para>
-  </section>
- </section>
-</chapter>