doc: Prevent evaluation warnings

Problem: `nix-build doc` gives a bunch of warnings because it inspects
`lib` to figure out where all the symbols are.

Solution: Move the step of figuring out where the symbols are to
a Nix evaluation inside a derivation instead.
This commit is contained in:
Silvan Mosberger 2024-07-18 23:33:29 +02:00
parent a0812b380b
commit f01573b6ee
2 changed files with 23 additions and 17 deletions

View File

@ -4,24 +4,31 @@
with pkgs; with pkgs;
let
locationsJSON = import ./lib-function-locations.nix { inherit pkgs nixpkgs libsets; };
in
stdenv.mkDerivation { stdenv.mkDerivation {
name = "nixpkgs-lib-docs"; name = "nixpkgs-lib-docs";
src = ../../lib; src = pkgs.lib.fileset.toSource {
root = ../..;
fileset = ../../lib;
};
buildInputs = [ nixdoc ]; buildInputs = [ nixdoc nix ];
installPhase = '' installPhase = ''
export NIX_STATE_DIR=$(mktemp -d)
nix-instantiate --eval --strict --json ${./lib-function-locations.nix} \
--arg nixpkgsPath "./." \
--argstr revision ${nixpkgs.rev or "master"} \
--argstr libsetsJSON ${pkgs.lib.escapeShellArg (builtins.toJSON libsets)} \
> locations.json
function docgen { function docgen {
name=$1 name=$1
baseName=$2 baseName=$2
description=$3 description=$3
# TODO: wrap lib.$name in <literal>, make nixdoc not escape it # TODO: wrap lib.$name in <literal>, make nixdoc not escape it
if [[ -e "../lib/$baseName.nix" ]]; then if [[ -e "lib/$baseName.nix" ]]; then
nixdoc -c "$name" -d "lib.$name: $description" -l ${locationsJSON} -f "$baseName.nix" > "$out/$name.md" nixdoc -c "$name" -d "lib.$name: $description" -l locations.json -f "lib/$baseName.nix" > "$out/$name.md"
else else
nixdoc -c "$name" -d "lib.$name: $description" -l ${locationsJSON} -f "$baseName/default.nix" > "$out/$name.md" nixdoc -c "$name" -d "lib.$name: $description" -l locations.json -f "lib/$baseName/default.nix" > "$out/$name.md"
fi fi
echo "$out/$name.md" >> "$out/index.md" echo "$out/$name.md" >> "$out/index.md"
} }

View File

@ -1,13 +1,14 @@
{ pkgs, nixpkgs ? { }, libsets }: { nixpkgsPath, revision, libsetsJSON }:
let let
revision = pkgs.lib.trivial.revisionWithDefault (nixpkgs.rev or "master"); lib = import (nixpkgsPath + "/lib");
libsets = builtins.fromJSON libsetsJSON;
libDefPos = prefix: set: libDefPos = prefix: set:
builtins.concatMap builtins.concatMap
(name: [{ (name: [{
name = builtins.concatStringsSep "." (prefix ++ [name]); name = builtins.concatStringsSep "." (prefix ++ [name]);
location = builtins.unsafeGetAttrPos name set; location = builtins.unsafeGetAttrPos name set;
}] ++ nixpkgsLib.optionals }] ++ lib.optionals
(builtins.length prefix == 0 && builtins.isAttrs set.${name}) (builtins.length prefix == 0 && builtins.isAttrs set.${name})
(libDefPos (prefix ++ [name]) set.${name}) (libDefPos (prefix ++ [name]) set.${name})
) (builtins.attrNames set); ) (builtins.attrNames set);
@ -20,8 +21,6 @@ let
}) })
(builtins.map (x: x.name) libsets); (builtins.map (x: x.name) libsets);
nixpkgsLib = pkgs.lib;
flattenedLibSubset = { subsetname, functions }: flattenedLibSubset = { subsetname, functions }:
builtins.map builtins.map
(fn: { (fn: {
@ -38,13 +37,13 @@ let
substr = builtins.substring prefixLen filenameLen filename; substr = builtins.substring prefixLen filenameLen filename;
in substr; in substr;
removeNixpkgs = removeFilenamePrefix (builtins.toString pkgs.path); removeNixpkgs = removeFilenamePrefix (builtins.toString nixpkgsPath);
liblocations = liblocations =
builtins.filter builtins.filter
(elem: elem.value != null) (elem: elem.value != null)
(nixpkgsLib.lists.flatten (lib.lists.flatten
(locatedlibsets nixpkgsLib)); (locatedlibsets lib));
fnLocationRelative = { name, value }: fnLocationRelative = { name, value }:
{ {
@ -72,4 +71,4 @@ let
relativeLocs); relativeLocs);
in in
pkgs.writeText "locations.json" (builtins.toJSON jsonLocs) jsonLocs