about summary refs log tree commit diff
path: root/nix/buildManPages/default.nix
blob: 746ed25182b47665436804c0d4b8760644cc6f70 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
{ depot, pkgs, lib, ... }:

let
  inherit (pkgs)
    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;
}