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 # We unfortunately can’t use the customized `cfg.package` when
73 # cross‐compiling. Instead we detect that situation and work
74 # around it by using the vanilla one, like the OpenSSH module.
75 buildPackage =
76 if pkgs.stdenv.buildPlatform.canExecute pkgs.stdenv.hostPlatform then
77 cfg.package
78 else
79 pkgs.buildPackages.man-db;
80
81 manualCache =
82 pkgs.runCommand "man-cache"
83 {
84 nativeBuildInputs = [ buildPackage ];
85 }
86 ''
87 echo "MANDB_MAP ${cfg.manualPages}/share/man $out" > man.conf
88 mandb -C man.conf -psc >/dev/null 2>&1
89 '';
90 in
91 ''
92 # Manual pages paths for NixOS
93 MANPATH_MAP /run/current-system/sw/bin /run/current-system/sw/share/man
94 MANPATH_MAP /run/wrappers/bin /run/current-system/sw/share/man
95
96 ${lib.optionalString config.documentation.man.generateCaches ''
97 # Generated manual pages cache for NixOS (immutable)
98 MANDB_MAP /run/current-system/sw/share/man ${manualCache}
99 ''}
100 # Manual pages caches for NixOS
101 MANDB_MAP /run/current-system/sw/share/man /var/cache/man/nixos
102 '';
103 };
104}