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:
parent
2a740527d6
commit
e14de22618
3 changed files with 30 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue