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:
parent
9b97a2ea88
commit
027f7e1b7f
3 changed files with 33 additions and 14 deletions
|
@ -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}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
6
nixos/lib/make-options-doc/optionsJSONtoXML.nix
Normal file
6
nixos/lib/make-options-doc/optionsJSONtoXML.nix
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{ file }:
|
||||||
|
|
||||||
|
builtins.attrValues
|
||||||
|
(builtins.mapAttrs
|
||||||
|
(name: def: def // { inherit name; })
|
||||||
|
(builtins.fromJSON (builtins.readFile file)))
|
Loading…
Add table
Reference in a new issue