diff options
author | Naïm Favier <n@monade.li> | 2022-12-15 13:27:54 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-15 13:27:54 +0100 |
commit | 84eebc0fe42522b4958d026ce9a50c17cad234b7 (patch) | |
tree | 9d8ffe8252e7635d05836a141af05f9f50db26ba | |
parent | d6038881b8977fd6dd0a789385749ec3b5add361 (diff) | |
parent | 9b1e8d7267ad7999677ea1900a5613ee1f23d0fc (diff) |
Merge pull request #205944 from ncfavier/structured-attrs-env
-rw-r--r-- | pkgs/stdenv/generic/make-derivation.nix | 6 | ||||
-rw-r--r-- | pkgs/stdenv/generic/setup.sh | 11 | ||||
-rw-r--r-- | pkgs/test/stdenv/default.nix | 20 |
3 files changed, 31 insertions, 6 deletions
diff --git a/pkgs/stdenv/generic/make-derivation.nix b/pkgs/stdenv/generic/make-derivation.nix index 12aa25ac307c1..db6d7e83f5957 100644 --- a/pkgs/stdenv/generic/make-derivation.nix +++ b/pkgs/stdenv/generic/make-derivation.nix @@ -274,7 +274,7 @@ else let "__darwinAllowLocalNetworking" "__impureHostDeps" "__propagatedImpureHostDeps" "sandboxProfile" "propagatedSandboxProfile"] - ++ lib.optionals envIsExportable [ "env" ])) + ++ lib.optional (__structuredAttrs || envIsExportable) "env")) // (lib.optionalAttrs (attrs ? name || (attrs ? pname && attrs ? version)) { name = let @@ -298,7 +298,7 @@ else let then attrs.name + hostSuffix else "${attrs.pname}${staticMarker}${hostSuffix}-${attrs.version}" ); - }) // lib.optionalAttrs (envIsExportable && __structuredAttrs) { env = checkedEnv; } // { + }) // lib.optionalAttrs __structuredAttrs { env = checkedEnv; } // { builder = attrs.realBuilder or stdenv.shell; args = attrs.args or ["-e" (attrs.builder or ./default-builder.sh)]; inherit stdenv; @@ -485,6 +485,8 @@ else let let overlappingNames = lib.intersectLists (lib.attrNames env) (lib.attrNames derivationArg); in + assert lib.assertMsg envIsExportable + "When using structured attributes, `env` must be an attribute set of environment variables."; assert lib.assertMsg (overlappingNames == [ ]) "The ‘env’ attribute set cannot contain any attributes passed to derivation. The following attributes are overlapping: ${lib.concatStringsSep ", " overlappingNames}"; lib.mapAttrs diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh index 5a64625e10d1e..b07420bb4185c 100644 --- a/pkgs/stdenv/generic/setup.sh +++ b/pkgs/stdenv/generic/setup.sh @@ -383,10 +383,13 @@ printWords() { ###################################################################### # Initialisation. -# export all vars that should be in the ENV -for envVar in "${!env[@]}"; do - declare -x "${envVar}=${env[${envVar}]}" -done +# If using structured attributes, export variables from `env` to the environment. +# When not using structured attributes, those variables are already exported. +if [[ -n $__structuredAttrs ]]; then + for envVar in "${!env[@]}"; do + declare -x "${envVar}=${env[${envVar}]}" + done +fi # Set a fallback default value for SOURCE_DATE_EPOCH, used by some build tools diff --git a/pkgs/test/stdenv/default.nix b/pkgs/test/stdenv/default.nix index b27fc25356a52..5ff18298f217a 100644 --- a/pkgs/test/stdenv/default.nix +++ b/pkgs/test/stdenv/default.nix @@ -49,6 +49,7 @@ let declare -p string echo "env.string = $string" [[ $string == "testing-string" ]] || (echo "'\$string' was not 'testing-string'" && false) + [[ "$(declare -p string)" == 'declare -x string="testing-string"' ]] || (echo "'\$string' was not exported" && false) touch $out ''; } // extraAttrs); @@ -100,6 +101,25 @@ in test-env-attrset = testEnvAttrset { name = "test-env-attrset"; stdenv' = bootStdenv; }; + # Test compatibility with derivations using `env` as a regular variable. + test-env-derivation = bootStdenv.mkDerivation rec { + name = "test-env-derivation"; + env = bootStdenv.mkDerivation { + name = "foo"; + buildCommand = '' + mkdir "$out" + touch "$out/bar" + ''; + }; + + passAsFile = [ "buildCommand" ]; + buildCommand = '' + declare -p env + [[ $env == "${env}" ]] + touch "$out" + ''; + }; + test-prepend-append-to-var = testPrependAndAppendToVar { name = "test-prepend-append-to-var"; stdenv' = bootStdenv; |