aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/lib/meta.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/lib/meta.nix')
-rw-r--r--nixpkgs/lib/meta.nix90
1 files changed, 90 insertions, 0 deletions
diff --git a/nixpkgs/lib/meta.nix b/nixpkgs/lib/meta.nix
new file mode 100644
index 00000000000..2e83c4247dd
--- /dev/null
+++ b/nixpkgs/lib/meta.nix
@@ -0,0 +1,90 @@
+/* Some functions for manipulating meta attributes, as well as the
+ name attribute. */
+
+{ lib }:
+
+rec {
+
+
+ /* Add to or override the meta attributes of the given
+ derivation.
+
+ Example:
+ addMetaAttrs {description = "Bla blah";} somePkg
+ */
+ addMetaAttrs = newAttrs: drv:
+ drv // { meta = (drv.meta or {}) // newAttrs; };
+
+
+ /* Disable Hydra builds of given derivation.
+ */
+ dontDistribute = drv: addMetaAttrs { hydraPlatforms = []; } drv;
+
+
+ /* Change the symbolic name of a package for presentation purposes
+ (i.e., so that nix-env users can tell them apart).
+ */
+ setName = name: drv: drv // {inherit name;};
+
+
+ /* Like `setName', but takes the previous name as an argument.
+
+ Example:
+ updateName (oldName: oldName + "-experimental") somePkg
+ */
+ updateName = updater: drv: drv // {name = updater (drv.name);};
+
+
+ /* Append a suffix to the name of a package (before the version
+ part). */
+ appendToName = suffix: updateName (name:
+ let x = builtins.parseDrvName name; in "${x.name}-${suffix}-${x.version}");
+
+
+ /* Apply a function to each derivation and only to derivations in an attrset.
+ */
+ mapDerivationAttrset = f: set: lib.mapAttrs (name: pkg: if lib.isDerivation pkg then (f pkg) else pkg) set;
+
+ /* Set the nix-env priority of the package.
+ */
+ setPrio = priority: addMetaAttrs { inherit priority; };
+
+ /* Decrease the nix-env priority of the package, i.e., other
+ versions/variants of the package will be preferred.
+ */
+ lowPrio = setPrio 10;
+
+ /* Apply lowPrio to an attrset with derivations
+ */
+ lowPrioSet = set: mapDerivationAttrset lowPrio set;
+
+
+ /* Increase the nix-env priority of the package, i.e., this
+ version/variant of the package will be preferred.
+ */
+ hiPrio = setPrio (-10);
+
+ /* Apply hiPrio to an attrset with derivations
+ */
+ hiPrioSet = set: mapDerivationAttrset hiPrio set;
+
+
+ /* Check to see if a platform is matched by the given `meta.platforms`
+ element.
+
+ A `meta.platform` pattern is either
+
+ 1. (legacy) a system string.
+
+ 2. (modern) a pattern for the platform `parsed` field.
+
+ We can inject these into a patten for the whole of a structured platform,
+ and then match that.
+ */
+ platformMatch = platform: elem: let
+ pattern =
+ if builtins.isString elem
+ then { system = elem; }
+ else { parsed = elem; };
+ in lib.matchAttrs pattern platform;
+}