diff --git a/flake.nix b/flake.nix index 187086e..e95449b 100644 --- a/flake.nix +++ b/flake.nix @@ -5,6 +5,8 @@ { self, nixpkgs }: let forAllSystems = f: nixpkgs.lib.genAttrs nixpkgs.lib.platforms.all (system: f system); + # non-exhaustive list of systems nixpkgs has support for + defaultSystems = f: nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ] (system: f system); in { lib = import ./lib { lib = nixpkgs.lib; }; @@ -58,5 +60,45 @@ in checksFromDir // checksFromModules ); + # mdbook documentation for all modules + packages = defaultSystems ( + system: + let + pkgs = nixpkgs.legacyPackages.${system}; + lib = nixpkgs.lib; + in + { + mdbook = ( + pkgs.stdenvNoCC.mkDerivation { + name = "wrappers-mdbook"; + nativeBuildInputs = with pkgs; [ + mdbook + ]; + srcs = lib.mapAttrsToList (_: v: ((v.apply { inherit pkgs; }).docs.commonMark)) self.wrapperModules; + names = lib.mapAttrsToList (name: _: name) self.wrapperModules; + dontUnpack = true; + dontPatch = true; + buildPhase = '' + # echo "[book]" >> book.toml + # echo "title = \"wrappers\"" >> book.toml + mdbook init wrappers + cd wrappers/src + echo "# Summary" > SUMMARY.md + names=($names) + srcs=($srcs) + for i in "''${!names[@]}"; do + cp ''${srcs[$i]} ''${names[$i]}.md + + echo "- ["''${names[$i]}"](''${names[$i]}.md)" >> SUMMARY.md + done + cat SUMMARY.md + mkdir -p $out + cd .. + mdbook build --dest-dir $out + ''; + } + ); + } + ); }; } diff --git a/lib/default.nix b/lib/default.nix index 52ecc71..2a80dbf 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -218,7 +218,7 @@ let inherit modules class specialArgs; }; - modules = lib.genAttrs [ "package" "wrapper" "meta" ] (name: import ./modules/${name}.nix); + modules = lib.genAttrs [ "doc" "package" "wrapper" "meta" ] (name: import ./modules/${name}.nix); /** Create a wrapper configuration using the NixOS module system. @@ -332,6 +332,7 @@ let }; } ) + modules.doc modules.wrapper modules.meta wrapperModule diff --git a/lib/modules/doc.nix b/lib/modules/doc.nix new file mode 100644 index 0000000..7e6442d --- /dev/null +++ b/lib/modules/doc.nix @@ -0,0 +1,65 @@ +{ + options, + config, + lib, + wlib, + ... +}: +let + internalOptions = lib.flatten ( + builtins.attrValues ( + builtins.mapAttrs ( + _: mod: + builtins.attrNames + (mod { + lib = null; + wlib = null; + config = null; + options = null; + }).options + ) wlib.modules + ) + ); + optionsToRender = removeAttrs options config.docs.ignoreOptions; + nixosOptionsDoc = config.pkgs.nixosOptionsDoc { + options = optionsToRender; + warningsAreErrors = config.docs.warningsAreErrors; + }; +in +{ + options.docs = { + ignoreOptions = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = internalOptions; + }; + warningsAreErrors = lib.mkOption { + type = lib.types.bool; + default = false; # TODO make this true + description = "Whether warnings during documentation generation should be treated as errors."; + }; + asciiDoc = lib.mkOption { + type = lib.types.package; + default = nixosOptionsDoc.optionsAsciiDoc; + }; + commonMark = lib.mkOption { + type = lib.types.package; + default = nixosOptionsDoc.optionsCommonMark; + }; + json = lib.mkOption { + type = lib.types.package; + default = nixosOptionsDoc.optionsJSON; + }; + html = lib.mkOption { + type = lib.types.package; + default = config.pkgs.stdenvNoCC.mkDerivation { + name = "docs-${config.package.name}.html"; + src = config.docs.commonMark; + dontUnpack = true; + nativeBuildInputs = [ config.pkgs.pandoc ]; + buildPhase = '' + pandoc -f markdown -t html $src > $out + ''; + }; + }; + }; +}