74 lines
2.0 KiB
Bash
74 lines
2.0 KiB
Bash
|
|
addLinkDLLPaths() {
|
||
|
|
addToSearchPath "LINK_DLL_FOLDERS" "$1/lib"
|
||
|
|
addToSearchPath "LINK_DLL_FOLDERS" "$1/bin"
|
||
|
|
}
|
||
|
|
|
||
|
|
addEnvHooks "$targetOffset" addLinkDLLPaths
|
||
|
|
|
||
|
|
addOutputDLLPaths() {
|
||
|
|
for output in $(getAllOutputNames); do
|
||
|
|
addToSearchPath "LINK_DLL_FOLDERS" "${!output}/lib"
|
||
|
|
addToSearchPath "LINK_DLL_FOLDERS" "${!output}/bin"
|
||
|
|
done
|
||
|
|
}
|
||
|
|
|
||
|
|
postInstallHooks+=(addOutputDLLPaths)
|
||
|
|
|
||
|
|
_dllDeps() {
|
||
|
|
"$OBJDUMP" -p "$1" \
|
||
|
|
| sed -n 's/.*DLL Name: \(.*\)/\1/p' \
|
||
|
|
| sort -u
|
||
|
|
}
|
||
|
|
|
||
|
|
_linkDeps() {
|
||
|
|
local target="$1" dir="$2" check="$3"
|
||
|
|
echo 'target:' "$target"
|
||
|
|
local dll
|
||
|
|
_dllDeps "$target" | while read dll; do
|
||
|
|
echo ' dll:' "$dll"
|
||
|
|
if [[ -e "$dir/$dll" ]]; then continue; fi
|
||
|
|
# Locate the DLL - it should be an *executable* file on $LINK_DLL_FOLDERS.
|
||
|
|
local dllPath="$(PATH="$(dirname "$target"):$LINK_DLL_FOLDERS" type -P "$dll")"
|
||
|
|
if [[ -z "$dllPath" ]]; then
|
||
|
|
if [[ -z "$check" || -n "${allowedImpureDLLsMap[$dll]}" ]]; then
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
echo unable to find $dll in $LINK_DLL_FOLDERS >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
echo ' linking to:' "$dllPath"
|
||
|
|
CYGWIN+=\ winsymlinks:nativestrict ln -sr "$dllPath" "$dir"
|
||
|
|
# That DLL might have its own (transitive) dependencies,
|
||
|
|
# so add also all DLLs from its directory to be sure.
|
||
|
|
_linkDeps "$dllPath" "$dir" ""
|
||
|
|
done
|
||
|
|
}
|
||
|
|
|
||
|
|
linkDLLs() {
|
||
|
|
if [ ! -d "$prefix" ]; then return; fi
|
||
|
|
(
|
||
|
|
set -e
|
||
|
|
shopt -s globstar nullglob
|
||
|
|
|
||
|
|
local -a allowedImpureDLLsArray
|
||
|
|
concatTo allowedImpureDLLsArray allowedImpureDLLs
|
||
|
|
|
||
|
|
local -A allowedImpureDLLsMap;
|
||
|
|
|
||
|
|
for dll in "${allowedImpureDLLsArray[@]}"; do
|
||
|
|
allowedImpureDLLsMap[$dll]=1
|
||
|
|
done
|
||
|
|
|
||
|
|
cd "$prefix"
|
||
|
|
|
||
|
|
# Iterate over any DLL that we depend on.
|
||
|
|
local target
|
||
|
|
for target in {bin,libexec}/**/*.{exe,dll}; do
|
||
|
|
[[ ! -f "$target" || ! -x "$target" ]] ||
|
||
|
|
_linkDeps "$target" "$(dirname "$target")" "1"
|
||
|
|
done
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
fixupOutputHooks+=(linkDLLs)
|