stdenv: handle env gracefully

Derivations not using `__structuredAttrs` should not attempt to set
environment variables from `env`.

Derivations using `__structuredAttrs` should fail if `env` is not
exportable.
This commit is contained in:
Naïm Favier 2022-12-13 18:12:04 +01:00
parent 2a740527d6
commit e14de22618
No known key found for this signature in database
GPG key ID: 95AFCE8211908325
3 changed files with 30 additions and 6 deletions

View file

@ -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

View file

@ -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

View file

@ -95,6 +95,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;