nvf/docs/default.nix

173 lines
5.2 KiB
Nix
Raw Normal View History

{
2024-04-09 07:02:58 +00:00
inputs,
pkgs,
lib,
2024-04-18 18:07:19 +00:00
manpageUrls ? pkgs.path + "/doc/manpage-urls.json",
2023-12-09 19:03:58 +00:00
...
}: let
inherit (lib.modules) mkForce evalModules;
inherit (lib.strings) hasPrefix removePrefix;
inherit (lib.attrsets) isAttrs mapAttrs optionalAttrs recursiveUpdate isDerivation;
2024-04-18 18:07:19 +00:00
inherit (builtins) fromJSON readFile;
# release data
release-config = fromJSON (readFile ../release.json);
revision = release-config.release;
# From home-manager:
#
# Recursively replace each derivation in the given attribute set
# with the same derivation but with the `outPath` attribute set to
# the string `"\${pkgs.attribute.path}"`. This allows the
# documentation to refer to derivations through their values without
# establishing an actual dependency on the derivation output.
#
# This is not perfect, but it seems to cover a vast majority of use
# cases.
#
# Caveat: even if the package is reached by a different means, the
# path above will be shown and not e.g.
# `${config.services.foo.package}`.
scrubDerivations = prefixPath: attrs: let
scrubDerivation = name: value: let
pkgAttrName = prefixPath + "." + name;
in
if isAttrs value
then
scrubDerivations pkgAttrName value
// optionalAttrs (isDerivation value) {
outPath = "\${${pkgAttrName}}";
}
else value;
in
mapAttrs scrubDerivation attrs;
# Make sure the used package is scrubbed to avoid actually
# instantiating derivations.
scrubbedPkgsModule = {
imports = [
{
_module.args = {
pkgs = mkForce (scrubDerivations "pkgs" pkgs);
pkgs_i686 = mkForce {};
};
}
];
};
# Specify the path to the module entrypoint
2023-12-09 19:21:36 +00:00
nvimPath = toString ./..;
buildOptionsDocs = args @ {
modules,
2023-12-09 19:03:58 +00:00
includeModuleSystemOptions ? true,
2024-04-18 18:07:19 +00:00
warningsAreErrors ? true,
...
}: let
inherit ((evalModules {inherit modules;})) options;
# Declaration of the Github site URL.
2024-04-18 18:07:19 +00:00
# Takes a user, repo, and subpath, and returns a declaration site
# as a string.
githubDeclaration = user: repo: subpath: let
urlRef = "github.com";
branch = "main";
in {
url = "https://${urlRef}/${user}/${repo}/blob/${branch}/${subpath}";
name = "<${repo}/${subpath}>";
};
in
2023-12-09 19:03:58 +00:00
pkgs.buildPackages.nixosOptionsDoc ({
2024-04-18 18:07:19 +00:00
inherit warningsAreErrors;
options =
2023-12-09 19:03:58 +00:00
if includeModuleSystemOptions
then options
2023-12-09 19:03:58 +00:00
else builtins.removeAttrs options ["_module"];
2024-04-18 18:07:19 +00:00
transformOptions = opt:
recursiveUpdate opt {
# Clean up declaration sites to not refer to the nvf
2023-12-09 19:03:58 +00:00
# source tree.
declarations = map (decl:
if hasPrefix nvimPath (toString decl)
2023-12-09 19:03:58 +00:00
then
githubDeclaration "notashelf" "nvf"
(removePrefix "/" (removePrefix nvimPath (toString decl)))
2023-12-09 19:03:58 +00:00
else if decl == "lib/modules.nix"
then
# TODO: handle this in a better way (may require upstream
# changes to nixpkgs)
githubDeclaration "NixOS" "nixpkgs" decl
else decl)
opt.declarations;
};
}
2023-12-09 19:03:58 +00:00
// builtins.removeAttrs args ["modules" "includeModuleSystemOptions"]);
nvimModuleDocs = buildOptionsDocs {
variablelistId = "nvf-options";
2024-04-18 18:07:19 +00:00
modules =
2023-12-09 19:03:58 +00:00
import ../modules/modules.nix {
inherit lib pkgs;
check = false;
}
++ [scrubbedPkgsModule];
};
2023-12-09 19:03:58 +00:00
# Generate the `man home-configuration.nix` package
nvf-configuration-manual =
pkgs.runCommand "nvf-reference-manpage" {
2023-12-09 19:03:58 +00:00
nativeBuildInputs = [pkgs.buildPackages.installShellFiles pkgs.nixos-render-docs];
allowedReferences = ["out"];
} ''
# Generate manpages.
mkdir -p $out/share/man/man5
mkdir -p $out/share/man/man1
2023-12-09 19:03:58 +00:00
nixos-render-docs -j $NIX_BUILD_CORES options manpage \
--revision ${revision} \
--header ${./man/header.5} \
--footer ${./man/footer.5} \
2023-12-09 19:03:58 +00:00
${nvimModuleDocs.optionsJSON}/share/doc/nixos/options.json \
$out/share/man/man5/nvf.5
cp ${./man/nvf.1} $out/share/man/man1/nvf.1
'';
2023-12-09 19:03:58 +00:00
# Generate the HTML manual pages
nvf-manual = pkgs.callPackage ./manual.nix {
2024-04-18 18:07:19 +00:00
inherit revision manpageUrls;
outputPath = "share/doc/nvf";
2023-12-09 19:03:58 +00:00
options = {
nvf = nvimModuleDocs.optionsJSON;
2023-12-09 19:03:58 +00:00
};
};
html = nvf-manual;
2023-12-09 19:03:58 +00:00
htmlOpenTool = pkgs.callPackage ./html-open-tool.nix {} {inherit html;};
in {
2024-04-09 07:02:58 +00:00
inherit (inputs) nmd;
2023-12-09 19:03:58 +00:00
options = {
# TODO: Use `hmOptionsDocs.optionsJSON` directly once upstream
# `nixosOptionsDoc` is more customizable.
json =
pkgs.runCommand "options.json" {
meta.description = "List of nvf options in JSON format";
2023-12-09 19:03:58 +00:00
} ''
mkdir -p $out/{share/doc,nix-support}
cp -a ${nvimModuleDocs.optionsJSON}/share/doc/nixos $out/share/doc/nvf
2023-12-09 19:03:58 +00:00
substitute \
${nvimModuleDocs.optionsJSON}/nix-support/hydra-build-products \
$out/nix-support/hydra-build-products \
--replace \
'${nvimModuleDocs.optionsJSON}/share/doc/nixos' \
"$out/share/doc/nvf"
2023-12-09 19:03:58 +00:00
'';
};
manPages = nvf-configuration-manual;
2023-12-09 19:03:58 +00:00
manual = {inherit html htmlOpenTool;};
}