diff options
Diffstat (limited to 'pkgs/stdenv')
-rw-r--r-- | pkgs/stdenv/generic/make-derivation.nix | 15 | ||||
-rw-r--r-- | pkgs/stdenv/generic/setup.sh | 21 |
2 files changed, 28 insertions, 8 deletions
diff --git a/pkgs/stdenv/generic/make-derivation.nix b/pkgs/stdenv/generic/make-derivation.nix index 67c7c5eae53..ec51b5415c1 100644 --- a/pkgs/stdenv/generic/make-derivation.nix +++ b/pkgs/stdenv/generic/make-derivation.nix @@ -65,6 +65,8 @@ rec { , 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) , separateDebugInfo ? false , outputs ? [ "out" ] @@ -79,6 +81,15 @@ rec { , ... } @ attrs: let + # Check that the name is consistent with pname and version: + selfConsistent = (with attrs; attrs ? "name" -> + (lib.assertMsg (attrs ? "version" -> lib.strings.hasInfix version name) + "version ${version} does not appear in name ${name}" && + lib.assertMsg (attrs ? "pname" -> lib.strings.hasInfix pname name) + "pname ${pname} does not appear in name ${name}")); + + computedName = if name != "" then name else "${attrs.pname}-${attrs.version}"; + # TODO(@oxij, @Ericson2314): This is here to keep the old semantics, remove when # no package has `doCheck = true`. doCheck' = doCheck && stdenv.hostPlatform == stdenv.buildPlatform; @@ -177,7 +188,7 @@ rec { // { # A hack to make `nix-env -qa` and `nix search` ignore broken packages. # TODO(@oxij): remove this assert when something like NixOS/nix#1771 gets merged into nix. - name = assert validity.handled && (separateDebugInfo -> stdenv.hostPlatform.isLinux); name + lib.optionalString + name = assert selfConsistent && validity.handled && (separateDebugInfo -> stdenv.hostPlatform.isLinux); computedName + lib.optionalString # Fixed-output derivations like source tarballs shouldn't get a host # suffix. But we have some weird ones with run-time deps that are # just used for their side-affects. Those might as well since the @@ -273,7 +284,7 @@ rec { meta = { # `name` above includes cross-compilation cruft (and is under assert), # lets have a clean always accessible version here. - inherit name; + name = computedName; # If the packager hasn't specified `outputsToInstall`, choose a default, # which is the name of `p.bin or p.out or p`; diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh index 8af369b1d17..be96d018612 100644 --- a/pkgs/stdenv/generic/setup.sh +++ b/pkgs/stdenv/generic/setup.sh @@ -653,7 +653,8 @@ fi substituteStream() { local var=$1 - shift + local description=$2 + shift 2 while (( "$#" )); do case "$1" in @@ -661,6 +662,14 @@ substituteStream() { pattern="$2" replacement="$3" shift 3 + local savedvar + savedvar="${!var}" + eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}' + if [ "$pattern" != "$replacement" ]; then + if [ "${!var}" == "$savedvar" ]; then + echo "substituteStream(): WARNING: pattern '$pattern' doesn't match anything in $description" >&2 + fi + fi ;; --subst-var) @@ -677,11 +686,13 @@ substituteStream() { fi pattern="@$varName@" replacement="${!varName}" + eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}' ;; --subst-var-by) pattern="@$2@" replacement="$3" + eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}' shift 3 ;; @@ -690,8 +701,6 @@ substituteStream() { return 1 ;; esac - - eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}' done printf "%s" "${!var}" @@ -719,7 +728,7 @@ substitute() { consumeEntire content < "$input" if [ -e "$output" ]; then chmod +w "$output"; fi - substituteStream content "$@" > "$output" + substituteStream content "file '$input'" "$@" > "$output" } substituteInPlace() { @@ -741,7 +750,7 @@ substituteAllStream() { local -a args=() _allFlags - substituteStream "$1" "${args[@]}" + substituteStream "$1" "$2" "${args[@]}" } # Substitute all environment variables that start with a lowercase character and @@ -1152,7 +1161,7 @@ fixupPhase() { for hook in $setupHooks; do local content consumeEntire content < "$hook" - substituteAllStream content >> "${!outputDev}/nix-support/setup-hook" + substituteAllStream content "file '$hook'" >> "${!outputDev}/nix-support/setup-hook" unset -v content done unset -v hook |