diff options
-rw-r--r-- | nix/buildManPages/OWNERS | 3 | ||||
-rw-r--r-- | nix/buildManPages/default.nix | 77 |
2 files changed, 80 insertions, 0 deletions
diff --git a/nix/buildManPages/OWNERS b/nix/buildManPages/OWNERS new file mode 100644 index 000000000000..f16dd105d761 --- /dev/null +++ b/nix/buildManPages/OWNERS @@ -0,0 +1,3 @@ +inherited: true +owners: + - sterni diff --git a/nix/buildManPages/default.nix b/nix/buildManPages/default.nix new file mode 100644 index 000000000000..83cf548c77bc --- /dev/null +++ b/nix/buildManPages/default.nix @@ -0,0 +1,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; +} |