mirror of
https://github.com/rbenv/ruby-build.git
synced 2025-01-01 14:44:48 +01:00
31e53468b6
If a system OpenSSL version was not found or is at version that is incompatible with a Ruby being installed, ruby-build would typically download and compile a new OpenSSL version scoped to that Ruby installation. Now the `needs_openssl` condition will also check for Homebrew-installed OpenSSL and automatically link to the first one found that satisfies the version requirement. This primarily helps speed up Ruby installation on macOS where the system OpenSSL is never compatible and where Homebrew is a de-facto standard package manager.
127 lines
3.1 KiB
Bash
Executable file
127 lines
3.1 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
set -e
|
|
|
|
status=127
|
|
program="${0##*/}"
|
|
PROGRAM="$(echo "$program" | tr a-z- A-Z_)"
|
|
[ -n "$TMPDIR" ] || TMPDIR="/tmp"
|
|
|
|
_STUB_PLAN="${PROGRAM}_STUB_PLAN"
|
|
_STUB_RUN="${PROGRAM}_STUB_RUN"
|
|
_STUB_INDEX="${PROGRAM}_STUB_INDEX"
|
|
_STUB_NOINDEX="${PROGRAM}_STUB_NOINDEX"
|
|
_STUB_RESULT="${PROGRAM}_STUB_RESULT"
|
|
_STUB_END="${PROGRAM}_STUB_END"
|
|
_STUB_DEBUG="${PROGRAM}_STUB_DEBUG"
|
|
|
|
if [ -n "${!_STUB_DEBUG}" ]; then
|
|
echo "$program" "$@" >&${!_STUB_DEBUG}
|
|
fi
|
|
|
|
[ -e "${!_STUB_PLAN}" ] || exit 1
|
|
[ -n "${!_STUB_RUN}" ] || eval "${_STUB_RUN}"="${TMPDIR}/${program}-stub-run"
|
|
|
|
|
|
# Initialize or load the stub run information.
|
|
eval "${_STUB_INDEX}"=1
|
|
eval "${_STUB_RESULT}"=0
|
|
[ ! -e "${!_STUB_RUN}" ] || source "${!_STUB_RUN}"
|
|
|
|
# Expose this for stub scripts.
|
|
inspect_args() {
|
|
local arg
|
|
local sep=''
|
|
for arg; do
|
|
if [[ $arg == *' '* ]]; then
|
|
printf '%s"%s"' "$sep" "${arg//\"/\\\"}"
|
|
elif [[ $arg == *'"'* ]]; then
|
|
printf "%s'%s'" "$sep" "$arg"
|
|
else
|
|
printf '%s%s' "$sep" "$arg"
|
|
fi
|
|
sep=" "
|
|
done
|
|
}
|
|
|
|
# Loop over each line in the plan.
|
|
IFS=$'\n' read -d '' -r -a lines < "${!_STUB_PLAN}" || true
|
|
index=0
|
|
for line in "${lines[@]}"; do
|
|
index=$(($index + 1))
|
|
|
|
if [[ -z "${!_STUB_END}" && -n "${!_STUB_NOINDEX}" || $index -eq "${!_STUB_INDEX}" ]]; then
|
|
# We found the plan line we're interested in.
|
|
# Start off by assuming success.
|
|
result=0
|
|
|
|
# Split the line into an array of arguments to
|
|
# match and a command to run to produce output.
|
|
command=" $line"
|
|
if [ "$command" != "${command/ : }" ]; then
|
|
patterns="${command%% : *}"
|
|
command="${command#* : }"
|
|
fi
|
|
|
|
# Naively split patterns by whitespace for now.
|
|
# In the future, use a sed script to split while
|
|
# respecting quoting.
|
|
set -f
|
|
patterns=($patterns)
|
|
set +f
|
|
arguments=("$@")
|
|
|
|
# Match the expected argument patterns to actual
|
|
# arguments.
|
|
for (( i=0; i<${#patterns[@]}; i++ )); do
|
|
pattern="${patterns[$i]}"
|
|
argument="${arguments[$i]}"
|
|
|
|
case "$argument" in
|
|
$pattern ) ;;
|
|
* ) result=1 ;;
|
|
esac
|
|
done
|
|
|
|
# If the arguments matched, evaluate the command
|
|
# in a subshell. Otherwise, log the failure.
|
|
if [ $result -eq 0 ] ; then
|
|
set +e
|
|
( eval "$command" )
|
|
status="$?"
|
|
set -e
|
|
[ -z "${!_STUB_NOINDEX}" ] || break
|
|
elif [ -z "${!_STUB_NOINDEX}" ]; then
|
|
eval "${_STUB_RESULT}"=1
|
|
fi
|
|
fi
|
|
done
|
|
|
|
|
|
if [ -n "${!_STUB_END}" ]; then
|
|
# Clean up the run file.
|
|
rm -f "${!_STUB_RUN}"
|
|
|
|
# If the number of lines in the plan is larger than
|
|
# the requested index, we failed.
|
|
if [ $index -ge "${!_STUB_INDEX}" ]; then
|
|
eval "${_STUB_RESULT}"=1
|
|
fi
|
|
|
|
# Return the result.
|
|
exit "${!_STUB_RESULT}"
|
|
|
|
else
|
|
# If the requested index is larger than the number
|
|
# of lines in the plan file, we failed.
|
|
if [[ -z "${!_STUB_NOINDEX}" && "${!_STUB_INDEX}" -gt $index ]]; then
|
|
eval "${_STUB_RESULT}"=1
|
|
fi
|
|
|
|
# Write out the run information.
|
|
{ echo "${_STUB_INDEX}=$((${!_STUB_INDEX} + 1))"
|
|
echo "${_STUB_RESULT}=${!_STUB_RESULT}"
|
|
} > "${!_STUB_RUN}"
|
|
|
|
exit "$status"
|
|
|
|
fi
|