diff --git a/nixos/lib/make-options-doc/default.nix b/nixos/lib/make-options-doc/default.nix index 6649fc41d41a..e039bc4a9b73 100644 --- a/nixos/lib/make-options-doc/default.nix +++ b/nixos/lib/make-options-doc/default.nix @@ -99,6 +99,14 @@ let optionsNix = builtins.listToAttrs (map (o: { name = o.name; value = removeAttrs o ["name" "visible" "internal"]; }) optionsList); + pythonMD = + let + self = (pkgs.python3Minimal.override { + inherit self; + includeSiteCustomize = true; + }); + in self.withPackages (p: [ p.mistune_2_0 ]); + in rec { inherit optionsNix; @@ -116,17 +124,20 @@ in rec { optionsJSON = pkgs.runCommand "options.json" { meta.description = "List of NixOS options in JSON format"; - buildInputs = [ - pkgs.brotli - (let - self = (pkgs.python3Minimal.override { - inherit self; - includeSiteCustomize = true; - }); - in self.withPackages (p: [ p.mistune_2_0 ])) - ]; + buildInputs = [ pkgs.brotli pythonMD ]; options = builtins.toFile "options.json" (builtins.unsafeDiscardStringContext (builtins.toJSON optionsNix)); + # convert markdown to docbook in its own derivation to cache the + # conversion results. the conversion is surprisingly expensive. + baseJSON = + if baseOptionsJSON != null + then + pkgs.runCommand "base-json-md-converted" { + buildInputs = [ pythonMD ]; + } '' + python ${./mergeJSON.py} ${baseOptionsJSON} <(echo '{}') > $out + '' + else null; } '' # Export list of options in different format. @@ -143,7 +154,7 @@ in rec { else '' python ${./mergeJSON.py} \ ${lib.optionalString warningsAreErrors "--warnings-are-errors"} \ - ${baseOptionsJSON} $options \ + $baseJSON $options \ > $dst/options.json '' }