1{
2 config,
3 pkgs,
4 lib,
5 ...
6}:
7
8let
9 cfg = config.documentation.man.man-db;
10in
11
12{
13 options = {
14 documentation.man.man-db = {
15 enable = lib.mkEnableOption "man-db as the default man page viewer" // {
16 default = config.documentation.man.enable;
17 defaultText = lib.literalExpression "config.documentation.man.enable";
18 example = false;
19 };
20
21 skipPackages = lib.mkOption {
22 type = lib.types.listOf lib.types.package;
23 default = [ ];
24 internal = true;
25 description = ''
26 Packages to *not* include in the man-db.
27 This can be useful to avoid unnecessary rebuilds due to packages that change frequently, like nixos-version.
28 '';
29 };
30
31 manualPages = lib.mkOption {
32 type = lib.types.path;
33 default = pkgs.buildEnv {
34 name = "man-paths";
35 paths = lib.subtractLists cfg.skipPackages config.environment.systemPackages;
36 pathsToLink = [ "/share/man" ];
37 extraOutputsToInstall = [ "man" ] ++ lib.optionals config.documentation.dev.enable [ "devman" ];
38 ignoreCollisions = true;
39 };
40 defaultText = lib.literalMD "all man pages in {option}`config.environment.systemPackages`";
41 description = ''
42 The manual pages to generate caches for if {option}`documentation.man.generateCaches`
43 is enabled. Must be a path to a directory with man pages under
44 `/share/man`; see the source for an example.
45 Advanced users can make this a content-addressed derivation to save a few rebuilds.
46 '';
47 };
48
49 package = lib.mkOption {
50 type = lib.types.package;
51 default = pkgs.man-db;
52 defaultText = lib.literalExpression "pkgs.man-db";
53 description = ''
54 The `man-db` derivation to use. Useful to override
55 configuration options used for the package.
56 '';
57 };
58 };
59 };
60
61 imports = [
62 (lib.mkRenamedOptionModule
63 [ "documentation" "man" "manualPages" ]
64 [ "documentation" "man" "man-db" "manualPages" ]
65 )
66 ];
67
68 config = lib.mkIf cfg.enable {
69 environment.systemPackages = [ cfg.package ];
70 environment.etc."man_db.conf".text =
71 let
72 manualCache =
73 pkgs.runCommand "man-cache"
74 {
75 nativeBuildInputs = [ cfg.package ];
76 }
77 ''
78 echo "MANDB_MAP ${cfg.manualPages}/share/man $out" > man.conf
79 mandb -C man.conf -psc >/dev/null 2>&1
80 '';
81 in
82 ''
83 # Manual pages paths for NixOS
84 MANPATH_MAP /run/current-system/sw/bin /run/current-system/sw/share/man
85 MANPATH_MAP /run/wrappers/bin /run/current-system/sw/share/man
86
87 ${lib.optionalString config.documentation.man.generateCaches ''
88 # Generated manual pages cache for NixOS (immutable)
89 MANDB_MAP /run/current-system/sw/share/man ${manualCache}
90 ''}
91 # Manual pages caches for NixOS
92 MANDB_MAP /run/current-system/sw/share/man /var/cache/man/nixos
93 '';
94 };
95}