module(documentation): Add documentation configuration to avoid to build manCache

This commit is contained in:
ulic-youthlic 2025-07-06 08:58:26 +08:00
parent 73b25d9798
commit c8f57642db
Signed by: youthlic
GPG key ID: 63E86C3C14A0D721
2 changed files with 125 additions and 0 deletions

View file

@ -10,5 +10,6 @@
./programs
./hardware.nix
./virtualisation
./documentation.nix
];
}

View file

@ -0,0 +1,124 @@
{
pkgs,
config,
lib,
...
}:
lib.mkMerge [
{
environment.systemPackages = with pkgs; [man-pages man-pages-posix];
documentation = {
info.enable = false;
nixos.enable = false;
dev.enable = true;
};
}
(let
inherit (pkgs.writers) writeFish;
cfg = config.documentation.man.man-db;
cachePath = "/var/cache/man/nixos";
in {
documentation.man.generateCaches = false;
systemd.services."man-db" = {
requires = ["sysinit-reactivation.target"];
after = ["sysinit-reactivation.target"];
partOf = ["sysinit-reactivation.target"];
wantedBy = ["default.target"];
path = [
cfg.package
pkgs.gawk
];
serviceConfig = {
Nice = 19;
IOSchedulingClass = "idle";
IOSchedulingPrioriry = 7;
ExecStart =
writeFish "mandbsvc" # fish
''
set -l SystemManLoc "/run/current-system/sw/share/man"
set -l ContentRecord "${cachePath}/man-db-state"
if [ ! -d "${cachePath}" ]
mkdir -pv "${cachePath}" || exit 1
end
if [ ! -f "$ContentRecord" ]
touch "$ContentRecord" || exit 1
end
# 1) Collect list of all manpage files and calculate hashes
# of them
#
# man1/ls.1.gz
# man3/func.3.gz
#
# hash ->
#
# bbbbbbbbbbbb (man1/ls.1.gz)
# aaaaaaaaaaaa (man3/func.3.gz)
set -l hashes "$(
find -L "$SystemManLoc" -type f -iname "*.gz" \
-exec sha256sum "{}" "+" \
| awk '{ print $1 }'
or exit 1
)"
# 2) Sort the hashes to make them "stable",
# and then join them toghther into a big long string,
# and then hash this big string to get the hash of the directory
#
# bbbbbbbbbbbb
# aaaaaaaaaaaa
#
# sort ->
#
# aaaaaaaaaaaa
# bbbbbbbbbbbb
#
# join ->
#
# aaaaaaaaaaaabbbbbbbbbbbb
#
# hash ->
#
# cccccccccccc
set -l ultimate_hash (
echo $hashes \
| sort \
| string join "" \
| sha256sum - \
| awk '{ print $1 }'
or exit 1
)
set -l old_hash "$( string collect < "$ContentRecord" )"
echo "Old hash: $old_hash"
echo "New hash: $ultimate_hash"
if [ "$old_hash" != "$ultimate_hash" ]
echo "Hash changed, do a full man-db rebuild"
mandb -psc || exit 1
echo "Write new hash"
echo "$ultimate_hash" > "$ContentRecord"
else
echo "Hash not changed, skip"
end
'';
};
};
environment.extraSetup =
# bash
''
find "$out/share/man" \
-mindepth 1 -maxdepth 1 \
-not -name "man[1-8]" \
-exec rm -r "{}" ";"
rm -r "$out/share/man/man3"
'';
})
]