86 lines
3.1 KiB
Bash

_handleCmdOutput(){
local command=("$1" "$2")
local versionOutput
local envArgs=()
if [[ "$3" != "*" ]]; then
envArgs+=("--ignore-environment")
for var in $3; do
envArgs+=("$var=${!var}")
done
fi
versionOutput="$(env \
--chdir=/ \
--argv0="$(basename "${command[0]}")" \
"${envArgs[@]}" \
"${command[@]}" 2>&1 \
| sed -e 's|@storeDir@/[^/ ]*/|{{storeDir}}/|g' \
|| true)"
if [[ "$versionOutput" =~ "$version" ]]; then
echoPrefix="Successfully managed to"
else
echoPrefix="Did not"
fi
# The return value of this function is this variable:
echo "$echoPrefix"
# And in anycase we want these to be printed in the build log, useful for
# debugging, so we print these to stderr.
echo "$echoPrefix" find version "$version" in the output of the command \
"${command[@]}" >&2
echo "$versionOutput" >&2
}
versionCheckHook(){
runHook preVersionCheck
echo Executing versionCheckPhase
# Don't keep any environment variables by default
: "${versionCheckKeepEnvironment:=}"
local cmdProgram cmdArg echoPrefix
if [[ ! -z "${versionCheckProgram-}" ]]; then
cmdProgram="$versionCheckProgram"
elif [[ ! -z "${NIX_MAIN_PROGRAM-}" ]]; then
cmdProgram="${!outputBin}/bin/${NIX_MAIN_PROGRAM}"
elif [[ ! -z "${pname-}" ]]; then
echo "versionCheckHook: Package \`${pname}\` does not have the \`meta.mainProgram\` attribute." \
"We'll assume that the main program has the same name for now, but this behavior is deprecated," \
"because it leads to surprising errors when the assumption does not hold." \
"If the package has a main program, please set \`meta.mainProgram\` in its definition to make this warning go away." \
"Should the binary that outputs the intended version differ from \`meta.mainProgram\`, consider setting \`versionCheckProgram\` instead." >&2
cmdProgram="${!outputBin}/bin/${pname}"
else
echo "versionCheckHook: \$NIX_MAIN_PROGRAM, \$versionCheckProgram and \$pname are all empty, so" \
"we don't know how to run the versionCheckPhase." \
"To fix this, set one of \`meta.mainProgram\` or \`versionCheckProgram\`." >&2
exit 2
fi
if [[ ! -x "$cmdProgram" ]]; then
echo "versionCheckHook: $cmdProgram was not found, or is not an executable" >&2
exit 2
fi
if [[ -z "${versionCheckProgramArg}" ]]; then
for cmdArg in "--help" "--version"; do
echoPrefix="$(_handleCmdOutput "$cmdProgram" "$cmdArg" "$versionCheckKeepEnvironment")"
if [[ "$echoPrefix" == "Successfully managed to" ]]; then
break
fi
done
else
cmdArg="$versionCheckProgramArg"
echoPrefix="$(_handleCmdOutput "$cmdProgram" "$cmdArg" "$versionCheckKeepEnvironment")"
fi
if [[ "$echoPrefix" == "Did not" ]]; then
exit 2
fi
runHook postVersionCheck
echo Finished versionCheckPhase
}
if [[ -z "${dontVersionCheck-}" ]]; then
echo "Using versionCheckHook"
preInstallCheckHooks+=(versionCheckHook)
fi