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.