diff --git a/lib/attrsets.nix b/lib/attrsets.nix index 20be2002402..2300ee9c000 100644 --- a/lib/attrsets.nix +++ b/lib/attrsets.nix @@ -221,6 +221,16 @@ rec { isDerivation = x: isAttrs x && x ? type && x.type == "derivation"; + /* Convert a store path to a fake derivation. */ + toDerivation = path: + let path' = builtins.storePath path; in + { type = "derivation"; + name = builtins.unsafeDiscardStringContext (builtins.substring 33 (-1) (baseNameOf path')); + outPath = path'; + outputs = [ "out" ]; + }; + + /* If the Boolean `cond' is true, return the attribute set `as', otherwise an empty attribute set. */ optionalAttrs = cond: as: if cond then as else {}; diff --git a/lib/strings.nix b/lib/strings.nix index bac03c9d7ad..e72bdc6d968 100644 --- a/lib/strings.nix +++ b/lib/strings.nix @@ -218,4 +218,9 @@ rec { # Format a number adding leading zeroes up to fixed width. fixedWidthNumber = width: n: fixedWidthString width "0" (toString n); + + + # Check whether a value is a store path. + isStorePath = x: builtins.substring 0 1 (toString x) == "/" && dirOf (builtins.toPath x) == builtins.storeDir; + } diff --git a/lib/types.nix b/lib/types.nix index 49f24b022de..a7f9bf1946e 100644 --- a/lib/types.nix +++ b/lib/types.nix @@ -94,14 +94,16 @@ rec { # derivation is a reserved keyword. package = mkOptionType { name = "derivation"; - check = isDerivation; - merge = mergeOneOption; + check = x: isDerivation x || isStorePath x; + merge = loc: defs: + let res = mergeOneOption loc defs; + in if isDerivation res then res else toDerivation res; }; path = mkOptionType { name = "path"; # Hacky: there is no ‘isPath’ primop. - check = x: builtins.unsafeDiscardStringContext (builtins.substring 0 1 (toString x)) == "/"; + check = x: builtins.substring 0 1 (toString x) == "/"; merge = mergeOneOption; }; diff --git a/nixos/doc/manual/development/option-declarations.xml b/nixos/doc/manual/development/option-declarations.xml index 6d93dc5c009..ea5d1241876 100644 --- a/nixos/doc/manual/development/option-declarations.xml +++ b/nixos/doc/manual/development/option-declarations.xml @@ -106,6 +106,15 @@ options = { + + types.package + + A derivation (such as pkgs.hello) or a + store path (such as + /nix/store/1ifi1cfbfs5iajmvwgrbmrnrw3a147h9-hello-2.10). + + + types.listOf t @@ -138,4 +147,4 @@ You can also create new types using the function mkOptionType. See lib/types.nix in Nixpkgs for details. - \ No newline at end of file +