diff --git a/modules/documentation/default.nix b/modules/documentation/default.nix new file mode 100644 index 00000000..a78cc04a --- /dev/null +++ b/modules/documentation/default.nix @@ -0,0 +1,99 @@ +{ config, lib, pkgs, baseModules, modules, ... }: + +with lib; + +let + cfg = config.documentation; + + /* For the purpose of generating docs, evaluate options with each derivation + in `pkgs` (recursively) replaced by a fake with path "\${pkgs.attribute.path}". + It isn't perfect, but it seems to cover a vast majority of use cases. + Caveat: even if the package is reached by a different means, + the path above will be shown and not e.g. `${config.services.foo.package}`. */ + manual = import ../../doc/manual rec { + inherit pkgs config; + version = "0.0.1"; + revision = "release-${version}"; + options = + let + scrubbedEval = evalModules { + modules = [ { nixpkgs.localSystem = config.nixpkgs.localSystem; } ] ++ baseModules; + args = (config._module.args) // { modules = [ ]; }; + specialArgs = { pkgs = scrubDerivations "pkgs" pkgs; }; + }; + scrubDerivations = namePrefix: pkgSet: mapAttrs + (name: value: + let wholeName = "${namePrefix}.${name}"; in + if isAttrs value then + scrubDerivations wholeName value + // (optionalAttrs (isDerivation value) { outPath = "\${${wholeName}}"; }) + else value + ) + pkgSet; + in scrubbedEval.options; + }; + + helpScript = pkgs.writeScriptBin "darwin-help" + '' + #! ${pkgs.stdenv.shell} -e + open ${manual.manualHTMLIndex} + ''; +in + +{ + options = { + documentation.enable = mkOption { + type = types.bool; + default = true; + description = '' + Whether to install documentation of packages from + into the generated system path. + + See "Multiple-output packages" chapter in the nixpkgs manual for more info. + ''; + # which is at ../../../doc/multiple-output.xml + }; + + documentation.man.enable = mkOption { + type = types.bool; + default = true; + description = '' + Whether to install manual pages and the man command. + This also includes "man" outputs. + ''; + }; + + documentation.info.enable = mkOption { + type = types.bool; + default = true; + description = '' + Whether to install info pages and the info command. + This also includes "info" outputs. + ''; + }; + + documentation.doc.enable = mkOption { + type = types.bool; + default = true; + description = '' + Whether to install documentation distributed in packages' /share/doc. + Usually plain text and/or HTML. + This also includes "doc" outputs. + ''; + }; + }; + + config = mkIf cfg.enable { + + programs.man.enable = cfg.man.enable; + programs.info.enable = cfg.info.enable; + + environment.systemPackages = mkMerge [ + (mkIf cfg.man.enable [ manual.manpages ]) + (mkIf cfg.doc.enable [ manual.manualHTML helpScript ]) + ]; + + system.build.manual = manual; + + }; +} diff --git a/modules/system/default.nix b/modules/system/default.nix index f5077502..d272a187 100644 --- a/modules/system/default.nix +++ b/modules/system/default.nix @@ -20,7 +20,7 @@ in system.build = mkOption { internal = true; - type = types.attrsOf types.package; + type = types.attrsOf types.unspecified; default = {}; description = '' Attribute set of derivation used to setup the system.