diff options
author | Robert Hensing <robert@roberthensing.nl> | 2024-03-12 18:16:56 +0100 |
---|---|---|
committer | Robert Hensing <robert@roberthensing.nl> | 2024-03-12 18:16:56 +0100 |
commit | 8dad51a2e27d49db65d51277e57af595792e6613 (patch) | |
tree | 4fe20c197fad2ab0bf96436ef70bd01fb24fec84 /pkgs/stdenv/generic | |
parent | de516f6f130ff744c14dc1c58fbb428fa4bb3794 (diff) | |
download | nixlib-8dad51a2e27d49db65d51277e57af595792e6613.tar nixlib-8dad51a2e27d49db65d51277e57af595792e6613.tar.gz nixlib-8dad51a2e27d49db65d51277e57af595792e6613.tar.bz2 nixlib-8dad51a2e27d49db65d51277e57af595792e6613.tar.lz nixlib-8dad51a2e27d49db65d51277e57af595792e6613.tar.xz nixlib-8dad51a2e27d49db65d51277e57af595792e6613.tar.zst nixlib-8dad51a2e27d49db65d51277e57af595792e6613.zip |
make-derivation.nix: Split makeDerivationArgument, mkDerivation with duplicate functionality
Diffstat (limited to 'pkgs/stdenv/generic')
-rw-r--r-- | pkgs/stdenv/generic/make-derivation.nix | 89 |
1 files changed, 88 insertions, 1 deletions
diff --git a/pkgs/stdenv/generic/make-derivation.nix b/pkgs/stdenv/generic/make-derivation.nix index 8d1dc6bdeab7..7a3521c5153c 100644 --- a/pkgs/stdenv/generic/make-derivation.nix +++ b/pkgs/stdenv/generic/make-derivation.nix @@ -40,6 +40,9 @@ let unique ; + inherit (import ../../build-support/lib/cmake.nix { inherit lib stdenv; }) makeCMakeFlags; + inherit (import ../../build-support/lib/meson.nix { inherit lib stdenv; }) makeMesonFlags; + mkDerivation = fnOrAttrs: if builtins.isFunction fnOrAttrs @@ -108,7 +111,7 @@ let makeDerivationExtensible (self: attrs // (if builtins.isFunction f0 || f0?__functor then f self attrs else f0))) attrs; - mkDerivationSimple = overrideAttrs: + makeDerivationArgument = # `mkDerivation` wraps the builtin `derivation` function to @@ -556,6 +559,90 @@ else let env; in + derivationArg; + +mkDerivationSimple = overrideAttrs: + +# `mkDerivation` wraps the builtin `derivation` function to +# produce derivations that use this stdenv and its shell. +# +# See also: +# +# * https://nixos.org/nixpkgs/manual/#sec-using-stdenv +# Details on how to use this mkDerivation function +# +# * https://nixos.org/manual/nix/stable/expressions/derivations.html#derivations +# Explanation about derivations in general +{ + +# Configure Phase + cmakeFlags ? [] +, mesonFlags ? [] + +, meta ? {} +, passthru ? {} +, pos ? # position used in error messages and for meta.position + (if attrs.meta.description or null != null + then builtins.unsafeGetAttrPos "description" attrs.meta + else if attrs.version or null != null + then builtins.unsafeGetAttrPos "version" attrs + else builtins.unsafeGetAttrPos "name" attrs) + +# Experimental. For simple packages mostly just works, +# but for anything complex, be prepared to debug if enabling. +, __structuredAttrs ? config.structuredAttrsByDefault or false + +, env ? { } + +, ... } @ attrs: + +# Policy on acceptable hash types in nixpkgs +assert attrs ? outputHash -> ( + let algo = + attrs.outputHashAlgo or (head (splitString "-" attrs.outputHash)); + in + if algo == "md5" then + throw "Rejected insecure ${algo} hash '${attrs.outputHash}'" + else + true +); + +let + envIsExportable = isAttrs env && !isDerivation env; + + derivationArg = makeDerivationArgument + (removeAttrs + attrs + (["meta" "passthru" "pos"] + ++ optional (__structuredAttrs || envIsExportable) "env" + ) + // optionalAttrs __structuredAttrs { env = checkedEnv; } + // { + cmakeFlags = makeCMakeFlags attrs; + mesonFlags = makeMesonFlags attrs; + }); + + meta = checkMeta.commonMeta { + inherit validity attrs pos; + references = attrs.nativeBuildInputs ++ attrs.buildInputs + ++ attrs.propagatedNativeBuildInputs ++ attrs.propagatedBuildInputs; + }; + validity = checkMeta.assertValidity { inherit meta attrs; }; + + checkedEnv = + let + overlappingNames = attrNames (builtins.intersectAttrs env derivationArg); + in + assert assertMsg envIsExportable + "When using structured attributes, `env` must be an attribute set of environment variables."; + assert assertMsg (overlappingNames == [ ]) + "The ‘env’ attribute set cannot contain any attributes passed to derivation. The following attributes are overlapping: ${concatStringsSep ", " overlappingNames}"; + mapAttrs + (n: v: assert assertMsg (isString v || isBool v || isInt v || isDerivation v) + "The ‘env’ attribute set can only contain derivation, string, boolean or integer attributes. The ‘${n}’ attribute is of type ${builtins.typeOf v}."; v) + env; + +in extendDerivation validity.handled |