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
+