From 52b0ad17e3727fe0c3ca028787128ede5fb86352 Mon Sep 17 00:00:00 2001 From: pennae Date: Thu, 28 Jul 2022 16:33:10 +0200 Subject: [PATCH] nixos/docs: cache mergeJSON md conversion on baseOptionsJSON with ever more options being markdown rather than docbook the conversion time is starting to become a significant factor of doc build time. luckily we can pre-convert all nixos option docs to MD and cache the result of this conversion, then merge the already-converted json file with user option docs. we leave options.json unconverted to keep it as close to the actual nix code as possible. --- nixos/lib/make-options-doc/default.nix | 31 +++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/nixos/lib/make-options-doc/default.nix b/nixos/lib/make-options-doc/default.nix index 6649fc41d41..e039bc4a9b7 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 '' }