2020-12-14 06:27:58 +00:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
2018-02-01 21:54:18 +00:00
|
|
|
declare -a autoPatchelfLibs
|
2022-02-04 09:08:27 +00:00
|
|
|
declare -a extraAutoPatchelfLibs
|
2018-02-01 21:54:18 +00:00
|
|
|
|
|
|
|
gatherLibraries() {
|
|
|
|
autoPatchelfLibs+=("$1/lib")
|
|
|
|
}
|
|
|
|
|
2020-12-14 06:27:58 +00:00
|
|
|
# shellcheck disable=SC2154
|
|
|
|
# (targetOffset is referenced but not assigned.)
|
2018-02-01 21:54:18 +00:00
|
|
|
addEnvHooks "$targetOffset" gatherLibraries
|
|
|
|
|
2018-11-25 15:17:14 +00:00
|
|
|
# Can be used to manually add additional directories with shared object files
|
|
|
|
# to be included for the next autoPatchelf invocation.
|
|
|
|
addAutoPatchelfSearchPath() {
|
2018-11-19 22:23:38 +00:00
|
|
|
local -a findOpts=()
|
|
|
|
|
|
|
|
while [ $# -gt 0 ]; do
|
|
|
|
case "$1" in
|
|
|
|
--) shift; break;;
|
|
|
|
--no-recurse) shift; findOpts+=("-maxdepth" 1);;
|
2018-11-25 15:17:14 +00:00
|
|
|
--*)
|
|
|
|
echo "addAutoPatchelfSearchPath: ERROR: Invalid command line" \
|
|
|
|
"argument: $1" >&2
|
|
|
|
return 1;;
|
|
|
|
*) break;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
2022-02-04 09:08:27 +00:00
|
|
|
local dir=
|
|
|
|
while IFS= read -r -d '' dir; do
|
|
|
|
extraAutoPatchelfLibs+=("$dir")
|
2020-12-14 06:27:58 +00:00
|
|
|
done < <(find "$@" "${findOpts[@]}" \! -type d \
|
2022-02-04 09:08:27 +00:00
|
|
|
\( -name '*.so' -o -name '*.so.*' \) -print0 \
|
|
|
|
| sed -z 's#/[^/]*$##' \
|
|
|
|
| uniq -z
|
|
|
|
)
|
2018-11-25 15:17:14 +00:00
|
|
|
}
|
|
|
|
|
2022-02-04 09:08:27 +00:00
|
|
|
|
2018-11-25 15:17:14 +00:00
|
|
|
autoPatchelf() {
|
2018-11-26 00:13:59 +00:00
|
|
|
local norecurse=
|
2018-11-25 15:17:14 +00:00
|
|
|
while [ $# -gt 0 ]; do
|
|
|
|
case "$1" in
|
|
|
|
--) shift; break;;
|
|
|
|
--no-recurse) shift; norecurse=1;;
|
2018-11-19 22:23:38 +00:00
|
|
|
--*)
|
|
|
|
echo "autoPatchelf: ERROR: Invalid command line" \
|
|
|
|
"argument: $1" >&2
|
|
|
|
return 1;;
|
|
|
|
*) break;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
2022-02-04 09:08:27 +00:00
|
|
|
local runtimeDependenciesArray=($runtimeDependencies)
|
|
|
|
@pythonInterpreter@ @autoPatchelfScript@ \
|
|
|
|
${norecurse:+--no-recurse} \
|
|
|
|
${autoPatchelfIgnoreMissingDeps:+--ignore-missing} \
|
|
|
|
--paths "$@" \
|
|
|
|
--libs "${autoPatchelfLibs[@]}" \
|
|
|
|
"${extraAutoPatchelfLibs[@]}" \
|
|
|
|
--runtime-dependencies "${runtimeDependenciesArray[@]/%//lib}"
|
2018-02-01 21:54:18 +00:00
|
|
|
}
|
|
|
|
|
2018-07-16 00:06:43 +01:00
|
|
|
# XXX: This should ultimately use fixupOutputHooks but we currently don't have
|
|
|
|
# a way to enforce the order. If we have $runtimeDependencies set, the setup
|
|
|
|
# hook of patchelf is going to ruin everything and strip out those additional
|
|
|
|
# RPATHs.
|
|
|
|
#
|
|
|
|
# So what we do here is basically run in postFixup and emulate the same
|
|
|
|
# behaviour as fixupOutputHooks because the setup hook for patchelf is run in
|
|
|
|
# fixupOutput and the postFixup hook runs later.
|
2021-09-12 23:07:15 +01:00
|
|
|
#
|
|
|
|
# shellcheck disable=SC2016
|
|
|
|
# (Expressions don't expand in single quotes, use double quotes for that.)
|
2018-11-19 16:36:22 +00:00
|
|
|
postFixupHooks+=('
|
2019-10-31 16:50:15 +00:00
|
|
|
if [ -z "${dontAutoPatchelf-}" ]; then
|
2018-11-19 22:23:38 +00:00
|
|
|
autoPatchelf -- $(for output in $outputs; do
|
2018-11-19 16:36:22 +00:00
|
|
|
[ -e "${!output}" ] || continue
|
|
|
|
echo "${!output}"
|
|
|
|
done)
|
|
|
|
fi
|
|
|
|
')
|