nixpkgs/nixos/modules/misc/mandoc.nix
sternenseemann f4f7238860 nixos/mandoc: init
Adds a NixOS module which allows using mandoc as the main manual
viewer. It can be used as a drop-in replacement for documentation.man
which relies on GNU's man-db and provides more or less the same
features.

The generateCaches option requires a different implementation for
mandoc, so it is hard to share code between the two modules -- hence it
has been implemented separately. Using both at the same time makes
little sense and wouldn't quite work, so there's an assertion to
prevent it.

To make makewhatis(8) index manual pages which are symlinks to the nix
store, we need to set READ_ALLOWED_PATH to include
`builtins.storeDir`. For background and discussion see:
https://inbox.vuxu.org/mandoc-tech/c9932669-e9d4-1454-8708-7c8e36967e8e@systemli.org/T/
2021-12-31 11:17:34 +01:00

52 lines
1.8 KiB
Nix

{ config, lib, pkgs, ... }:
let
makewhatis = "${lib.getBin pkgs.mandoc}/bin/makewhatis";
cfg = config.documentation.man.mandoc;
in {
meta.maintainers = [ lib.maintainers.sternenseemann ];
options = {
documentation.man.mandoc = {
enable = lib.mkEnableOption "mandoc as the default man page viewer";
manPath = lib.mkOption {
type = with lib.types; listOf str;
default = [ "share/man" ];
example = lib.literalExpression "[ \"share/man\" \"share/man/fr\" ]";
description = ''
Change the manpath, i. e. the directories where
<citerefentry><refentrytitle>man</refentrytitle><manvolnum>1</manvolnum></citerefentry>
looks for section-specific directories of man pages.
You only need to change this setting if you want extra man pages
(e. g. in non-english languages). All values must be strings that
are a valid path from the target prefix (without including it).
The first value given takes priority.
'';
};
};
};
config = lib.mkIf cfg.enable {
environment = {
systemPackages = [ pkgs.mandoc ];
# tell mandoc about man pages
etc."man.conf".text = lib.concatMapStrings (path: ''
manpath /run/current-system/sw/${path}
'') cfg.manPath;
# create mandoc.db for whatis(1), apropos(1) and man(1) -k
# TODO(@sternenseemman): fix symlinked directories not getting indexed,
# see: https://inbox.vuxu.org/mandoc-tech/20210906171231.GF83680@athene.usta.de/T/#e85f773c1781e3fef85562b2794f9cad7b2909a3c
extraSetup = lib.mkIf config.documentation.man.generateCaches ''
${makewhatis} -T utf8 ${
lib.concatMapStringsSep " " (path: "\"$out/${path}\"") cfg.manPath
}
'';
};
};
}