about summary refs log tree commit diff
path: root/nix/buildManPages/default.nix
blob: 83cf548c77bca07e6120dbb8a164171248ea45b2 (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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
{ depot, ... }:

let
  inherit (depot.third_party)
    lib
    gzip
    mandoc
    coreutils
    ;

  inherit (depot.nix)
    runExecline
    getBins
    ;

  bins = getBins mandoc [ "mandoc" ]
      // getBins gzip   [ "gzip" ]
      // getBins coreutils [ "mkdir" "ln" "cp" ]
      ;

  defaultGzip = true;

  basename = gzip: { name, section, ... }:
    "${name}.${toString section}${lib.optionalString gzip ".gz"}";

  manDir = { section, ... }:
    "\${out}/share/man/man${toString section}";

  target = gzip: args:
    "${manDir args}/${basename gzip args}";

  buildManPage =
    { requireLint ? false
    , gzip ? defaultGzip
    , ...
    }:
    { content
    , ...
    }@page: let
      source = builtins.toFile (basename false page) content;
    in runExecline (basename gzip page) {} ([
      (if requireLint then "if" else "foreground") [
        bins.mandoc "-mdoc" "-T" "lint" source
      ]
      "importas" "out" "out"
    ] ++ (if gzip then [
      "redirfd" "-w" "1" "$out"
      bins.gzip "-c" source
    ] else [
      bins.cp "--reflink=auto" source "$out"
    ]));

  buildManPages =
    name:
    { derivationArgs ? {}
    , gzip ? defaultGzip
    , ...
    }@args:
    pages:
    runExecline "${name}-man-pages" {
      inherit derivationArgs;
    } ([
      "importas" "out" "out"
    ] ++ lib.concatMap ({ name, section, content }@page: [
      "if" [ bins.mkdir "-p" (manDir page) ]
      "if" [
        bins.ln "-s"
        (buildManPage args page)
        (target gzip page)
      ]
    ]) pages);

in {
  __functor = _: buildManPages;

  single = buildManPage;
}