Merge pull request #86489 from rnhmjoj/mandb

nixos/documentation: add option to generate caches
This commit is contained in:
Michele Guerini Rocco 2020-06-18 10:47:32 +02:00 committed by GitHub
commit 7e57c524a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 90 additions and 7 deletions

View File

@ -469,6 +469,7 @@ rec {
getBin = getOutput "bin"; getBin = getOutput "bin";
getLib = getOutput "lib"; getLib = getOutput "lib";
getDev = getOutput "dev"; getDev = getOutput "dev";
getMan = getOutput "man";
/* Pick the outputs of packages to place in buildInputs */ /* Pick the outputs of packages to place in buildInputs */
chooseDevOutputs = drvs: builtins.map getDev drvs; chooseDevOutputs = drvs: builtins.map getDev drvs;

View File

@ -77,7 +77,7 @@ let
genAttrs isDerivation toDerivation optionalAttrs genAttrs isDerivation toDerivation optionalAttrs
zipAttrsWithNames zipAttrsWith zipAttrs recursiveUpdateUntil zipAttrsWithNames zipAttrsWith zipAttrs recursiveUpdateUntil
recursiveUpdate matchAttrs overrideExisting getOutput getBin recursiveUpdate matchAttrs overrideExisting getOutput getBin
getLib getDev chooseDevOutputs zipWithNames zip getLib getDev getMan chooseDevOutputs zipWithNames zip
recurseIntoAttrs dontRecurseIntoAttrs; recurseIntoAttrs dontRecurseIntoAttrs;
inherit (lists) singleton forEach foldr fold foldl foldl' imap0 imap1 inherit (lists) singleton forEach foldr fold foldl foldl' imap0 imap1
concatMap flatten remove findSingle findFirst any all count concatMap flatten remove findSingle findFirst any all count

View File

@ -110,6 +110,15 @@ systemd.services.mysql.serviceConfig.ReadWritePaths = [ "/var/data" ];
</programlisting> </programlisting>
</para> </para>
</listitem> </listitem>
<listitem>
<para>
Two new option <link linkend="opt-documentation.man.generateCaches">documentation.man.generateCaches</link>
has been added to automatically generate the <literal>man-db</literal> caches, which are needed by utilities
like <command>whatis</command> and <command>apropos</command>. The caches are generated during the build of
the NixOS configuration: since this can be expensive when a large number of packages are installed, the
feature is disabled by default.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>

View File

@ -102,6 +102,16 @@ in
''; '';
}; };
man.generateCaches = mkOption {
type = types.bool;
default = false;
description = ''
Whether to generate the manual page index caches using
<literal>mandb(8)</literal>. This allows searching for a page or
keyword using utilities like <literal>apropos(1)</literal>.
'';
};
info.enable = mkOption { info.enable = mkOption {
type = types.bool; type = types.bool;
default = true; default = true;
@ -187,7 +197,33 @@ in
environment.systemPackages = [ pkgs.man-db ]; environment.systemPackages = [ pkgs.man-db ];
environment.pathsToLink = [ "/share/man" ]; environment.pathsToLink = [ "/share/man" ];
environment.extraOutputsToInstall = [ "man" ] ++ optional cfg.dev.enable "devman"; environment.extraOutputsToInstall = [ "man" ] ++ optional cfg.dev.enable "devman";
environment.etc."man.conf".source = "${pkgs.man-db}/etc/man_db.conf"; environment.etc."man_db.conf".text =
let
manualPages = pkgs.buildEnv {
name = "man-paths";
paths = config.environment.systemPackages;
pathsToLink = [ "/share/man" ];
extraOutputsToInstall = ["man"];
ignoreCollisions = true;
};
manualCache = pkgs.runCommandLocal "man-cache" { }
''
echo "MANDB_MAP ${manualPages}/share/man $out" > man.conf
${pkgs.man-db}/bin/mandb -C man.conf -psc
'';
in
''
# Manual pages paths for NixOS
MANPATH_MAP /run/current-system/sw/bin /run/current-system/sw/share/man
MANPATH_MAP /run/wrappers/bin /run/current-system/sw/share/man
${optionalString cfg.man.generateCaches ''
# Generated manual pages cache for NixOS (immutable)
MANDB_MAP /run/current-system/sw/share/man ${manualCache}
''}
# Manual pages caches for NixOS
MANDB_MAP /run/current-system/sw/share/man /var/cache/man/nixos
'';
}) })
(mkIf cfg.info.enable { (mkIf cfg.info.enable {

View File

@ -15,18 +15,17 @@ stdenv.mkDerivation rec {
buildInputs = [ libpipeline db groff ]; # (Yes, 'groff' is both native and build input) buildInputs = [ libpipeline db groff ]; # (Yes, 'groff' is both native and build input)
checkInputs = [ libiconv /* for 'iconv' binary */ ]; checkInputs = [ libiconv /* for 'iconv' binary */ ];
patches = [ ./systemwide-man-db-conf.patch ];
postPatch = '' postPatch = ''
# Remove all mandatory manpaths. Nixpkgs makes no requirements on # Remove all mandatory manpaths. Nixpkgs makes no requirements on
# these directories existing. # these directories existing.
sed -i 's/^MANDATORY_MANPATH/# &/' src/man_db.conf.in sed -i 's/^MANDATORY_MANPATH/# &/' src/man_db.conf.in
# Add Nixpkgs and NixOS-related manpaths # Add Nix-related manpaths
echo "MANPATH_MAP /run/current-system/sw/bin /run/current-system/sw/share/man" >> src/man_db.conf.in
echo "MANPATH_MAP /run/wrappers/bin /run/current-system/sw/share/man" >> src/man_db.conf.in
echo "MANPATH_MAP /nix/var/nix/profiles/default/bin /nix/var/nix/profiles/default/share/man" >> src/man_db.conf.in echo "MANPATH_MAP /nix/var/nix/profiles/default/bin /nix/var/nix/profiles/default/share/man" >> src/man_db.conf.in
# Add mandb locations for the above # Add mandb locations for the above
echo "MANDB_MAP /run/current-system/sw/share/man /var/cache/man/nixos" >> src/man_db.conf.in
echo "MANDB_MAP /nix/var/nix/profiles/default/share/man /var/cache/man/nixpkgs" >> src/man_db.conf.in echo "MANDB_MAP /nix/var/nix/profiles/default/share/man /var/cache/man/nixpkgs" >> src/man_db.conf.in
''; '';
@ -34,7 +33,6 @@ stdenv.mkDerivation rec {
"--disable-setuid" "--disable-setuid"
"--disable-cache-owner" "--disable-cache-owner"
"--localstatedir=/var" "--localstatedir=/var"
# Don't try /etc/man_db.conf by default, so we avoid error messages.
"--with-config-file=${placeholder "out"}/etc/man_db.conf" "--with-config-file=${placeholder "out"}/etc/man_db.conf"
"--with-systemdtmpfilesdir=${placeholder "out"}/lib/tmpfiles.d" "--with-systemdtmpfilesdir=${placeholder "out"}/lib/tmpfiles.d"
"--with-systemdsystemunitdir=${placeholder "out"}/lib/systemd/system" "--with-systemdsystemunitdir=${placeholder "out"}/lib/systemd/system"

View File

@ -0,0 +1,39 @@
commit 9089291006a4258c39c75a920ad536b61504251a
Author: rnhmjoj <rnhmjoj@inventati.org>
Date: Fri May 1 19:32:15 2020 +0200
check for systemwide man_db.conf before the bundled one
diff --git a/src/manp.c b/src/manp.c
index 5441339..0bbf566 100644
--- a/src/manp.c
+++ b/src/manp.c
@@ -841,18 +841,24 @@ void read_config_file (bool optional)
}
if (getenv ("MAN_TEST_DISABLE_SYSTEM_CONFIG") == NULL) {
- config_file = fopen (CONFIG_FILE, "r");
+ const char *config_filepath;
+ if (access ("/etc/man_db.conf", F_OK) != -1) {
+ config_filepath = "/etc/man_db.conf";
+ } else {
+ config_filepath = CONFIG_FILE;
+ }
+ config_file = fopen (config_filepath, "r");
if (config_file == NULL) {
if (optional)
debug ("can't open %s; continuing anyway\n",
- CONFIG_FILE);
+ config_filepath);
else
error (FAIL, 0,
_("can't open the manpath "
"configuration file %s"),
- CONFIG_FILE);
+ config_filepath);
} else {
- debug ("From the config file %s:\n", CONFIG_FILE);
+ debug ("From the config file %s:\n", config_filepath);
add_to_dirlist (config_file, 0);
fclose (config_file);