summary refs log tree commit diff
path: root/pkgs/build-support/setup-hooks/win-dll-link.sh
blob: 6130f32bef86c2e9002787c8ac3698d332359588 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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 $(readlink "$dllPath" || echo "$dllPath"))"/*.dll; do
            if [ -e ./"$(basename "$dllPath2")" ]; then continue; fi
            CYGWIN+=\ winsymlinks:nativestrict ln -sr "$dllPath2" .
            linkCount=$(($linkCount+1))
        done
    done
    echo "Created $linkCount DLL link(s) in $prefix/bin"
)
}