From f4f723886002f3959d8ef94f556aaaf9c261cc9e Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Sun, 19 Sep 2021 19:51:03 +0200 Subject: [PATCH] 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/ --- nixos/modules/misc/documentation.nix | 13 ++++++- nixos/modules/misc/mandoc.nix | 51 ++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 nixos/modules/misc/mandoc.nix diff --git a/nixos/modules/misc/documentation.nix b/nixos/modules/misc/documentation.nix index 8f09568ee09..bb294addccd 100644 --- a/nixos/modules/misc/documentation.nix +++ b/nixos/modules/misc/documentation.nix @@ -207,8 +207,19 @@ in }; config = mkIf cfg.enable (mkMerge [ + { + assertions = [ + { + assertion = !(cfg.man.man-db.enable && cfg.man.mandoc.enable); + message = '' + man-db and mandoc can't be used as the default man page viewer at the same time! + ''; + } + ]; + } - # The actual implementation for this lives in man-db.nix + # The actual implementation for this lives in man-db.nix or mandoc.nix, + # depending on which backend is active. (mkIf cfg.man.enable { environment.pathsToLink = [ "/share/man" ]; environment.extraOutputsToInstall = [ "man" ] ++ optional cfg.dev.enable "devman"; diff --git a/nixos/modules/misc/mandoc.nix b/nixos/modules/misc/mandoc.nix new file mode 100644 index 00000000000..939f87a3178 --- /dev/null +++ b/nixos/modules/misc/mandoc.nix @@ -0,0 +1,51 @@ +{ 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 + man1 + 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 + } + ''; + }; + }; +}