1
0
Fork 1
mirror of https://github.com/NixOS/nixpkgs.git synced 2025-05-04 11:57:03 +00:00

nixos/lib/make-options-doc: generate options.xml from options.json

to do this we must replace derivations with attrsets in make-options-doc, since
xml can represent derivations differently from attrset but json cannot. this
also given asciidoc and mddoc the ability to handle derivation differently,
which they previously didn't have.
This commit is contained in:
pennae 2021-11-18 23:00:03 +01:00
parent 9b97a2ea88
commit 027f7e1b7f
3 changed files with 33 additions and 14 deletions

View file

@ -24,18 +24,25 @@
}: }:
let let
# Replace functions by the string <function> # Make a value safe for JSON. Functions are replaced by the string "<function>",
substFunction = x: # derivations are replaced with an attrset
if builtins.isAttrs x then lib.mapAttrs (name: substFunction) x # { _type = "derivation"; name = <name of that derivation>; }.
else if builtins.isList x then map substFunction x # We need to handle derivations specially because consumers want to know about them,
# but we can't easily use the type,name subset of keys (since type is often used as
# a module option and might cause confusion). Use _type,name instead to the same
# effect, since _type is already used by the module system.
substSpecial = x:
if lib.isDerivation x then { _type = "derivation"; name = x.name; }
else if builtins.isAttrs x then lib.mapAttrs (name: substSpecial) x
else if builtins.isList x then map substSpecial x
else if lib.isFunction x then "<function>" else if lib.isFunction x then "<function>"
else x; else x;
optionsList = lib.flip map optionsListVisible optionsList = lib.flip map optionsListVisible
(opt: transformOptions opt (opt: transformOptions opt
// lib.optionalAttrs (opt ? example) { example = substFunction opt.example; } // lib.optionalAttrs (opt ? example) { example = substSpecial opt.example; }
// lib.optionalAttrs (opt ? default) { default = substFunction opt.default; } // lib.optionalAttrs (opt ? default) { default = substSpecial opt.default; }
// lib.optionalAttrs (opt ? type) { type = substFunction opt.type; } // lib.optionalAttrs (opt ? type) { type = substSpecial opt.type; }
// lib.optionalAttrs (opt ? relatedPackages && opt.relatedPackages != []) { relatedPackages = genRelatedPackages opt.relatedPackages opt.name; } // lib.optionalAttrs (opt ? relatedPackages && opt.relatedPackages != []) { relatedPackages = genRelatedPackages opt.relatedPackages opt.name; }
); );
@ -72,11 +79,6 @@ let
# Remove invisible and internal options. # Remove invisible and internal options.
optionsListVisible = lib.filter (opt: opt.visible && !opt.internal) (lib.optionAttrSetToDocList options); optionsListVisible = lib.filter (opt: opt.visible && !opt.internal) (lib.optionAttrSetToDocList options);
# Convert the list of options into an XML file.
# This file is *not* sorted sorted to save on eval time, since the docbook XML
# and the manpage depend on it and thus we evaluate this on every system rebuild.
optionsXML = builtins.toFile "options.xml" (builtins.toXML optionsList);
optionsNix = builtins.listToAttrs (map (o: { name = o.name; value = removeAttrs o ["name" "visible" "internal"]; }) optionsList); optionsNix = builtins.listToAttrs (map (o: { name = o.name; value = removeAttrs o ["name" "visible" "internal"]; }) optionsList);
in rec { in rec {
@ -110,7 +112,18 @@ in rec {
mkdir -p $out/nix-support mkdir -p $out/nix-support
echo "file json $dst/options.json" >> $out/nix-support/hydra-build-products echo "file json $dst/options.json" >> $out/nix-support/hydra-build-products
echo "file json-br $dst/options.json.br" >> $out/nix-support/hydra-build-products echo "file json-br $dst/options.json.br" >> $out/nix-support/hydra-build-products
''; # */ '';
# Convert options.json into an XML file.
# The actual generation of the xml file is done in nix purely for the convenience
# of not having to generate the xml some other way
optionsXML = pkgs.runCommand "options.xml" {} ''
${pkgs.nix}/bin/nix-instantiate \
--store dummy:// \
--eval --xml --strict ${./optionsJSONtoXML.nix} \
--argstr file ${optionsJSON}/share/doc/nixos/options.json \
> "$out"
'';
optionsDocBook = pkgs.runCommand "options-docbook.xml" {} '' optionsDocBook = pkgs.runCommand "options-docbook.xml" {} ''
optionsXML=${optionsXML} optionsXML=${optionsXML}

View file

@ -189,7 +189,7 @@
</xsl:template> </xsl:template>
<xsl:template match="derivation"> <xsl:template match="attrs[attr[@name = '_type' and string[@value = 'derivation']]]">
<replaceable>(build of <xsl:value-of select="attr[@name = 'name']/string/@value" />)</replaceable> <replaceable>(build of <xsl:value-of select="attr[@name = 'name']/string/@value" />)</replaceable>
</xsl:template> </xsl:template>

View file

@ -0,0 +1,6 @@
{ file }:
builtins.attrValues
(builtins.mapAttrs
(name: def: def // { inherit name; })
(builtins.fromJSON (builtins.readFile file)))