summary refs log tree commit diff
path: root/pkgs/lib/composable-derivation.nix
blob: f597dc07bd6a8c439aba59e9c4d85d197b6802e1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{lib, pkgs} :
let inherit (lib) nv nvs; in
{
  # see for example:
  # - development/interpreters/php_configurable/default.nix
  # - .. search composableDerivation in all-packages.nix ..
  #
  # You should be able to override anything you like easily
  # grep the mailinglist by title "python proposal" (dec 08)
  # -> http://mail.cs.uu.nl/pipermail/nix-dev/2008-December/001571.html
  # to see why this got complicated when using all its features
  composableDerivation = {
          # modify args before applying stdenv.mkDerivation, this should remove at least attrs removeAttrsBy
        f ? lib.prepareDerivationArgs,
        stdenv ? pkgs.stdenv,
          # initial set of arguments to be passed to stdenv.mkDerivation passing prepareDerivationArgs by default
        initial ? {},
          # example func :  (x: x // { x.buildInputs ++ ["foo"] }), but see mergeAttrByFunc which does this for you
        merge ? (lib.mergeOrApply lib.mergeAttrByFunc)
      }: lib.applyAndFun
            (args: stdenv.mkDerivation (f args))
            merge
            (merge { inherit (lib) mergeAttrBy; } initial);

  # some utility functions
  # use this function to generate flag attrs for prepareDerivationArgs
  # E nable  D isable F eature
  edf = {name, feat ? name, enable ? {}, disable ? {} , value ? ""}:
    nvs name {
    set = {
      configureFlags = ["--enable-${feat}${if value == "" then "" else "="}${value}"];
    } // enable;
    unset = {
      configureFlags = ["--disable-${feat}"];
    } // disable;
  };

  # same for --with and --without-
  # W ith or W ithout F eature
  wwf = {name, feat ? name, enable ? {}, disable ? {}, value ? ""}:
    nvs name {
    set = {
      configureFlags = ["--with-${feat}${if value == "" then "" else "="}${value}"];
    } // enable;
    unset = {
      configureFlags = ["--without-${feat}"];
    } // disable;
  };
}