{ pkgs , options , config , version , revision , extraSources ? [] , baseOptionsJSON ? null , warningsAreErrors ? true , prefix ? ../../.. }: let inherit (pkgs) buildPackages runCommand docbook_xsl_ns; inherit (pkgs.lib) hasPrefix removePrefix flip foldr types mkOption escapeShellArg concatMapStringsSep sourceFilesBySuffices ; common = import ./common.nix; manpageUrls = pkgs.path + "/doc/manpage-urls.json"; # 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. # # E.g. if some `options` came from modules in ${pkgs.customModules}/nix, # you'd need to include `extraSources = [ pkgs.customModules ]` prefixesToStrip = map (p: "${toString p}/") ([ prefix ] ++ extraSources); stripAnyPrefixes = flip (foldr removePrefix) prefixesToStrip; optionsDoc = buildPackages.nixosOptionsDoc { inherit options revision baseOptionsJSON warningsAreErrors; transformOptions = opt: opt // { # Clean up declaration sites to not refer to the NixOS source tree. declarations = map stripAnyPrefixes opt.declarations; }; }; nixos-lib = import ../../lib { }; testOptionsDoc = let eval = nixos-lib.evalTest { # Avoid evaluating a NixOS config prototype. config.node.type = types.deferredModule; options._module.args = mkOption { internal = true; }; }; in buildPackages.nixosOptionsDoc { inherit (eval) options; inherit revision; transformOptions = opt: opt // { # Clean up declaration sites to not refer to the NixOS source tree. declarations = map (decl: if hasPrefix (toString ../../..) (toString decl) then let subpath = removePrefix "/" (removePrefix (toString ../../..) (toString decl)); in { url = "https://github.com/NixOS/nixpkgs/blob/master/${subpath}"; name = subpath; } else decl) opt.declarations; }; documentType = "none"; variablelistId = "test-options-list"; optionIdPrefix = "test-opt-"; }; testDriverMachineDocstrings = pkgs.callPackage ../../../nixos/lib/test-driver/nixos-test-driver-docstrings.nix {}; prepareManualFromMD = '' cp -r --no-preserve=all $inputs/* . substituteInPlace ./manual.md \ --replace-fail '@NIXOS_VERSION@' "${version}" substituteInPlace ./configuration/configuration.md \ --replace-fail \ '@MODULE_CHAPTERS@' \ ${escapeShellArg (concatMapStringsSep "\n" (p: "${p.value}") config.meta.doc)} substituteInPlace ./nixos-options.md \ --replace-fail \ '@NIXOS_OPTIONS_JSON@' \ ${optionsDoc.optionsJSON}/${common.outputPath}/options.json substituteInPlace ./development/writing-nixos-tests.section.md \ --replace-fail \ '@NIXOS_TEST_OPTIONS_JSON@' \ ${testOptionsDoc.optionsJSON}/${common.outputPath}/options.json sed -e '/@PYTHON_MACHINE_METHODS@/ {' -e 'r ${testDriverMachineDocstrings}/machine-methods.md' -e 'd' -e '}' \ -i ./development/writing-nixos-tests.section.md ''; in rec { inherit (optionsDoc) optionsJSON optionsNix optionsDocBook; # Generate the NixOS manual. manualHTML = runCommand "nixos-manual-html" { nativeBuildInputs = [ buildPackages.nixos-render-docs ]; inputs = sourceFilesBySuffices ./. [ ".md" ]; meta.description = "The NixOS manual in HTML format"; allowedReferences = ["out"]; } '' # Generate the HTML manual. dst=$out/${common.outputPath} mkdir -p $dst cp ${../../../doc/style.css} $dst/style.css cp ${../../../doc/anchor.min.js} $dst/anchor.min.js cp ${../../../doc/anchor-use.js} $dst/anchor-use.js cp -r ${pkgs.documentation-highlighter} $dst/highlightjs ${prepareManualFromMD} nixos-render-docs -j $NIX_BUILD_CORES manual html \ --manpage-urls ${manpageUrls} \ --redirects ${./redirects.json} \ --revision ${escapeShellArg revision} \ --generator "nixos-render-docs ${pkgs.lib.version}" \ --stylesheet style.css \ --stylesheet highlightjs/mono-blue.css \ --script ./highlightjs/highlight.pack.js \ --script ./highlightjs/loader.js \ --script ./anchor.min.js \ --script ./anchor-use.js \ --toc-depth 1 \ --chunk-toc-depth 1 \ ./manual.md \ $dst/${common.indexPath} mkdir -p $out/nix-support echo "nix-build out $out" >> $out/nix-support/hydra-build-products echo "doc manual $dst" >> $out/nix-support/hydra-build-products ''; # */ # Alias for backward compatibility. TODO(@oxij): remove eventually. manual = manualHTML; # Index page of the NixOS manual. manualHTMLIndex = "${manualHTML}/${common.outputPath}/${common.indexPath}"; manualEpub = runCommand "nixos-manual-epub" { nativeBuildInputs = [ buildPackages.libxml2.bin buildPackages.libxslt.bin buildPackages.zip ]; doc = '' NixOS Manual Version ${pkgs.lib.version} Temporarily unavailable The NixOS manual is currently not available in EPUB format, please use the HTML manual instead. If you've used the EPUB manual in the past and it has been useful to you, please let us know. ''; passAsFile = [ "doc" ]; } '' # Generate the epub manual. dst=$out/${common.outputPath} xsltproc \ --param chapter.autolabel 0 \ --nonet --xinclude --output $dst/epub/ \ ${docbook_xsl_ns}/xml/xsl/docbook/epub/docbook.xsl \ $docPath echo "application/epub+zip" > mimetype manual="$dst/nixos-manual.epub" zip -0Xq "$manual" mimetype cd $dst/epub && zip -Xr9D "$manual" * rm -rf $dst/epub mkdir -p $out/nix-support echo "doc-epub manual $manual" >> $out/nix-support/hydra-build-products ''; # Generate the `man configuration.nix` package nixos-configuration-reference-manpage = runCommand "nixos-configuration-reference-manpage" { nativeBuildInputs = [ buildPackages.installShellFiles buildPackages.nixos-render-docs ]; allowedReferences = ["out"]; } '' # Generate manpages. mkdir -p $out/share/man/man5 nixos-render-docs -j $NIX_BUILD_CORES options manpage \ --revision ${escapeShellArg revision} \ ${optionsJSON}/${common.outputPath}/options.json \ $out/share/man/man5/configuration.nix.5 ''; }