From 5cfd034af0afe55e4d25748ec986c71b3bfbe3dd Mon Sep 17 00:00:00 2001 From: Domen Kožar Date: Thu, 8 Aug 2019 12:59:25 +0200 Subject: Extract NixOS options documentation generation to a function Motivation is to support other repositories containing nixos modules that would like to generate options documentation: - nix-darwin - private repos - arion - ?? --- nixos/doc/manual/default.nix | 106 +-------- nixos/doc/manual/options-to-docbook.xsl | 236 --------------------- .../doc/manual/postprocess-option-descriptions.xsl | 115 ---------- 3 files changed, 9 insertions(+), 448 deletions(-) delete mode 100644 nixos/doc/manual/options-to-docbook.xsl delete mode 100644 nixos/doc/manual/postprocess-option-descriptions.xsl (limited to 'nixos/doc') diff --git a/nixos/doc/manual/default.nix b/nixos/doc/manual/default.nix index 7fc0ad702f8..f9de2db1a08 100644 --- a/nixos/doc/manual/default.nix +++ b/nixos/doc/manual/default.nix @@ -5,55 +5,6 @@ with pkgs; let lib = pkgs.lib; - # Remove invisible and internal options. - optionsListVisible = lib.filter (opt: opt.visible && !opt.internal) (lib.optionAttrSetToDocList options); - - # Replace functions by the string - substFunction = x: - if builtins.isAttrs x then lib.mapAttrs (name: substFunction) x - else if builtins.isList x then map substFunction x - else if lib.isFunction x then "" - else x; - - # Generate DocBook documentation for a list of packages. This is - # what `relatedPackages` option of `mkOption` from - # ../../../lib/options.nix influences. - # - # Each element of `relatedPackages` can be either - # - a string: that will be interpreted as an attribute name from `pkgs`, - # - a list: that will be interpreted as an attribute path from `pkgs`, - # - an attrset: that can specify `name`, `path`, `package`, `comment` - # (either of `name`, `path` is required, the rest are optional). - genRelatedPackages = packages: - let - unpack = p: if lib.isString p then { name = p; } - else if lib.isList p then { path = p; } - else p; - describe = args: - let - title = args.title or null; - name = args.name or (lib.concatStringsSep "." args.path); - path = args.path or [ args.name ]; - package = args.package or (lib.attrByPath path (throw "Invalid package attribute path `${toString path}'") pkgs); - in "" - + "${lib.optionalString (title != null) "${title} aka "}pkgs.${name} (${package.meta.name})" - + lib.optionalString (!package.meta.available) " [UNAVAILABLE]" - + ": ${package.meta.description or "???"}." - + lib.optionalString (args ? comment) "\n${args.comment}" - # Lots of `longDescription's break DocBook, so we just wrap them into - + lib.optionalString (package.meta ? longDescription) "\n${package.meta.longDescription}" - + ""; - in "${lib.concatStringsSep "\n" (map (p: describe (unpack p)) packages)}"; - - optionsListDesc = lib.flip map optionsListVisible (opt: opt // { - # Clean up declaration sites to not refer to the NixOS source tree. - declarations = map stripAnyPrefixes opt.declarations; - } - // lib.optionalAttrs (opt ? example) { example = substFunction opt.example; } - // lib.optionalAttrs (opt ? default) { default = substFunction opt.default; } - // lib.optionalAttrs (opt ? type) { type = substFunction opt.type; } - // lib.optionalAttrs (opt ? relatedPackages && opt.relatedPackages != []) { relatedPackages = genRelatedPackages opt.relatedPackages; }); - # We need to strip references to /nix/store/* from options, # including any `extraSources` if some modules came from elsewhere, # or else the build will fail. @@ -63,37 +14,13 @@ let prefixesToStrip = map (p: "${toString p}/") ([ ../../.. ] ++ extraSources); stripAnyPrefixes = lib.flip (lib.fold lib.removePrefix) prefixesToStrip; - # Custom "less" that pushes up all the things ending in ".enable*" - # and ".package*" - optionLess = a: b: - let - ise = lib.hasPrefix "enable"; - isp = lib.hasPrefix "package"; - cmp = lib.splitByAndCompare ise lib.compare - (lib.splitByAndCompare isp lib.compare lib.compare); - in lib.compareLists cmp a.loc b.loc < 0; - - # Customly sort option list for the man page. - optionsList = lib.sort optionLess optionsListDesc; - - # Convert the list of options into an XML file. - optionsXML = builtins.toFile "options.xml" (builtins.toXML optionsList); - - optionsDocBook = runCommand "options-db.xml" {} '' - optionsXML=${optionsXML} - if grep /nixpkgs/nixos/modules $optionsXML; then - echo "The manual appears to depend on the location of Nixpkgs, which is bad" - echo "since this prevents sharing via the NixOS channel. This is typically" - echo "caused by an option default that refers to a relative path (see above" - echo "for hints about the offending path)." - exit 1 - fi - ${buildPackages.libxslt.bin}/bin/xsltproc \ - --stringparam revision '${revision}' \ - -o intermediate.xml ${./options-to-docbook.xsl} $optionsXML - ${buildPackages.libxslt.bin}/bin/xsltproc \ - -o "$out" ${./postprocess-option-descriptions.xsl} intermediate.xml - ''; + optionsDoc = buildPackages.nixosOptionsDoc { + inherit options revision; + transformOptions = opt: opt // { + # Clean up declaration sites to not refer to the NixOS source tree. + declarations = map stripAnyPrefixes opt.declarations; + }; + }; sources = lib.sourceFilesBySuffices ./. [".xml"]; @@ -108,7 +35,7 @@ let generatedSources = runCommand "generated-docbook" {} '' mkdir $out ln -s ${modulesDoc} $out/modules.xml - ln -s ${optionsDocBook} $out/options-db.xml + ln -s ${optionsDoc.optionsDocBook} $out/options-db.xml printf "%s" "${version}" > $out/version ''; @@ -234,22 +161,7 @@ let in rec { inherit generatedSources; - # The NixOS options in JSON format. - optionsJSON = runCommand "options-json" - { meta.description = "List of NixOS options in JSON format"; - } - '' - # Export list of options in different format. - dst=$out/share/doc/nixos - mkdir -p $dst - - cp ${builtins.toFile "options.json" (builtins.unsafeDiscardStringContext (builtins.toJSON - (builtins.listToAttrs (map (o: { name = o.name; value = removeAttrs o ["name" "visible" "internal"]; }) optionsList)))) - } $dst/options.json - - mkdir -p $out/nix-support - echo "file json $dst/options.json" >> $out/nix-support/hydra-build-products - ''; # */ + inherit (optionsDoc) optionsJSON optionsXML optionsDocBook; # Generate the NixOS manual. manualHTML = runCommand "nixos-manual-html" diff --git a/nixos/doc/manual/options-to-docbook.xsl b/nixos/doc/manual/options-to-docbook.xsl deleted file mode 100644 index 72ac89d4ff6..00000000000 --- a/nixos/doc/manual/options-to-docbook.xsl +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - - - - - - - - Configuration Options - - - - - - - - - - - - - - - - - - - - Type: - - - - - (read only) - - - - - - - Default: - - - - - - - - Example: - - - - - - - - - - - - - - - Related packages: - - - - - - - - Declared by: - - - - - - - Defined by: - - - - - - - - - - - - - - - - - - - -'' -'' - - - - - - - - - - null - - - - - - - '''' - - - "" - - - - - - - - - - - - true - - - - - false - - - - - [ - - - - - ] - - - - - - - - - - { - - - = - ; - - } - - - - - (build of ) - - - - - - - - - - - - https://github.com/NixOS/nixpkgs/blob/master/ - - - https://github.com/NixOS/nixpkgs/blob// - - - - - https://github.com/NixOS/nixops/blob//nix/ - - - file:// - - - - - - <nixpkgs/> - - - <nixops/> - - - - - - - - - - - - - λ - - - - diff --git a/nixos/doc/manual/postprocess-option-descriptions.xsl b/nixos/doc/manual/postprocess-option-descriptions.xsl deleted file mode 100644 index 1201c7612c2..00000000000 --- a/nixos/doc/manual/postprocess-option-descriptions.xsl +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- cgit 1.4.1