stdenv for windows: auto-link dependency DLLs
For every *.{exe,dll} in $output/bin/ we try to find all (potential) transitive dependencies and symlink those DLLs into $output/bin so they are found on invocation. (DLLs are first searched in the directory of the running exe file.) The links are relative, so relocating whole /nix/store won't break them. The hook is activated on cygwin and when cross-compiling to mingw.
This commit is contained in:
parent
13df963c7e
commit
6e7787e666
45
pkgs/build-support/setup-hooks/win-dll-link.sh
Normal file
45
pkgs/build-support/setup-hooks/win-dll-link.sh
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
|
||||||
|
fixupOutputHooks+=(_linkDLLs)
|
||||||
|
|
||||||
|
# For every *.{exe,dll} in $output/bin/ we try to find all (potential)
|
||||||
|
# transitive dependencies and symlink those DLLs into $output/bin
|
||||||
|
# so they are found on invocation.
|
||||||
|
# (DLLs are first searched in the directory of the running exe file.)
|
||||||
|
# The links are relative, so relocating whole /nix/store won't break them.
|
||||||
|
_linkDLLs() {
|
||||||
|
(
|
||||||
|
if [ ! -d "$prefix/bin" ]; then exit; fi
|
||||||
|
cd "$prefix/bin"
|
||||||
|
|
||||||
|
# Compose path list where DLLs should be located:
|
||||||
|
# prefix $PATH by currently-built outputs
|
||||||
|
local DLLPATH=""
|
||||||
|
local outName
|
||||||
|
for outName in $outputs; do
|
||||||
|
addToSearchPath DLLPATH "${!outName}/bin"
|
||||||
|
done
|
||||||
|
DLLPATH="$DLLPATH:$PATH"
|
||||||
|
|
||||||
|
echo DLLPATH="'$DLLPATH'"
|
||||||
|
|
||||||
|
linkCount=0
|
||||||
|
# Iterate over any DLL that we depend on.
|
||||||
|
local dll
|
||||||
|
for dll in $(objdump -p *.{exe,dll} | sed -n 's/.*DLL Name: \(.*\)/\1/p' | sort -u); do
|
||||||
|
if [ -e "./$dll" ]; then continue; fi
|
||||||
|
# Locate the DLL - it should be an *executable* file on $DLLPATH.
|
||||||
|
local dllPath="$(PATH="$DLLPATH" type -P "$dll")"
|
||||||
|
if [ -z "$dllPath" ]; then continue; fi
|
||||||
|
# That DLL might have its own (transitive) dependencies,
|
||||||
|
# so add also all DLLs from its directory to be sure.
|
||||||
|
local dllPath2
|
||||||
|
for dllPath2 in "$dllPath" "$(dirname "$dllPath")"/*.dll; do
|
||||||
|
if [ -e ./"$(basename "$dllPath2")" ]; then continue; fi
|
||||||
|
ln -sr "$dllPath2" .
|
||||||
|
linkCount=$(($linkCount+1))
|
||||||
|
done
|
||||||
|
done
|
||||||
|
echo "Created $linkCount DLL link(s) in $prefix/bin"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
|
@ -196,7 +196,13 @@ let
|
||||||
buildInputs = if crossConfig != null then buildInputs' else [];
|
buildInputs = if crossConfig != null then buildInputs' else [];
|
||||||
propagatedBuildInputs = if crossConfig != null then propagatedBuildInputs else [];
|
propagatedBuildInputs = if crossConfig != null then propagatedBuildInputs else [];
|
||||||
# Inputs built by the usual native compiler.
|
# Inputs built by the usual native compiler.
|
||||||
nativeBuildInputs = nativeBuildInputs ++ (if crossConfig == null then buildInputs' else []);
|
nativeBuildInputs = nativeBuildInputs
|
||||||
|
++ lib.optionals (crossConfig == null) buildInputs'
|
||||||
|
++ lib.optional
|
||||||
|
(result.isCygwin
|
||||||
|
|| (crossConfig != null && lib.hasSuffix "mingw32" crossConfig))
|
||||||
|
../../build-support/setup-hooks/win-dll-link.sh
|
||||||
|
;
|
||||||
propagatedNativeBuildInputs = propagatedNativeBuildInputs ++
|
propagatedNativeBuildInputs = propagatedNativeBuildInputs ++
|
||||||
(if crossConfig == null then propagatedBuildInputs else []);
|
(if crossConfig == null then propagatedBuildInputs else []);
|
||||||
} // ifDarwin {
|
} // ifDarwin {
|
||||||
|
|
Loading…
Reference in a new issue