summary refs log tree commit diff
path: root/pkgs/development/libraries/qt-5/qtbase-setup-hook.sh
blob: 4b0bad583350cf5205220f806fe0e6edf3f83336 (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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
qtPluginPrefix=@qtPluginPrefix@
qtQmlPrefix=@qtQmlPrefix@
qtDocPrefix=@qtDocPrefix@

NIX_QT5_MODULES="${NIX_QT5_MODULES}${NIX_QT5_MODULES:+:}@out@"
NIX_QT5_MODULES_DEV="${NIX_QT5_MODULES_DEV}${NIX_QT5_MODULES_DEV:+:}@dev@"

providesQtRuntime() {
    [ -d "$1/$qtPluginPrefix" ] || [ -d "$1/$qtQmlPrefix" ]
}

# Propagate any runtime dependency of the building package.
# Each dependency is propagated to the user environment and as a build
# input so that it will be re-propagated to the user environment by any
# package depending on the building package. (This is necessary in case
# the building package does not provide runtime dependencies itself and so
# would not be propagated to the user environment.)
_qtCrossEnvHook() {
    if providesQtRuntime "$1"; then
        propagatedBuildInputs+=" $1"
        propagatedUserEnvPkgs+=" $1"
    fi
}
if [ -z "$NIX_QT5_TMP" ]; then
    crossEnvHooks+=(_qtCrossEnvHook)
fi

_qtEnvHook() {
    if providesQtRuntime "$1"; then
        propagatedNativeBuildInputs+=" $1"
        if [ -z "$crossConfig" ]; then
        propagatedUserEnvPkgs+=" $1"
        fi
    fi
}
if [ -z "$NIX_QT5_TMP" ]; then
    envHooks+=(_qtEnvHook)
fi

_qtPreFixupHook() {
    moveToOutput "mkspecs" "${!outputDev}"
}
if [ -z "$NIX_QT5_TMP" ]; then
    preFixupHooks+=(_qtPreFixupHook)
fi

_qtPostInstallHook() {
    # Clean up temporary installation files created by this setup hook.
    # For building Qt modules, this is necessary to prevent including
    # dependencies in the output. For all other packages, this is necessary
    # to induce patchelf to remove the temporary paths from the RPATH of
    # dynamically-linked objects.
    if [ -z "$NIX_QT_SUBMODULE" ]; then
        rm -fr "$NIX_QT5_TMP"
    else
        cat "$NIX_QT5_TMP/nix-support/qt-inputs" | while read file; do
            if [ ! -d "$NIX_QT5_TMP/$file" ]; then
                rm -f "$NIX_QT5_TMP/$file"
            fi
        done

        cat "$NIX_QT5_TMP/nix-support/qt-inputs" | while read dir; do
            if [ -d "$NIX_QT5_TMP/$dir" ]; then
                rmdir --ignore-fail-on-non-empty -p "$NIX_QT5_TMP/$dir"
            fi
        done

        rm "$NIX_QT5_TMP/nix-support/qt-inputs"
    fi

    # Patch CMake modules
    if [ -n "$NIX_QT_SUBMODULE" ]; then
        find "${!outputLib}" -name "*.cmake" | while read file; do
            substituteInPlace "$file" \
                --subst-var-by NIX_OUT "${!outputLib}" \
                --subst-var-by NIX_DEV "${!outputDev}" \
                --subst-var-by NIX_BIN "${!outputBin}"
        done
    fi
}
if [ -z "$NIX_QT5_TMP" ]; then
    preConfigureHooks+=(_qtPreConfigureHook)
fi

_qtLinkModuleDir() {
    if [ -d "$1/$2" ]; then
        @lndir@/bin/lndir -silent "$1/$2" "$NIX_QT5_TMP/$2"
        find "$1/$2" -printf "$2/%P\n" >> "$NIX_QT5_TMP/nix-support/qt-inputs"
    fi
}

_qtPreConfigureHook() {
    # Find the temporary qmake executable first.
    # This must run after all the environment hooks!
    export PATH="$NIX_QT5_TMP/bin${PATH:+:}$PATH"

    # Link all runtime module dependencies into the temporary directory.
    IFS=: read -a modules <<< $NIX_QT5_MODULES
    for module in ${modules[@]}; do
        _qtLinkModuleDir "$module" "lib"
    done

    # Link all the build-time module dependencies into the temporary directory.
    IFS=: read -a modules <<< $NIX_QT5_MODULES_DEV
    for module in ${modules[@]}; do
        _qtLinkModuleDir "$module" "bin"
        _qtLinkModuleDir "$module" "include"
        _qtLinkModuleDir "$module" "lib"
        _qtLinkModuleDir "$module" "mkspecs"
        _qtLinkModuleDir "$module" "share"
    done
}
if [ -z "$NIX_QT5_TMP" ]; then
    postInstallHooks+=(_qtPostInstallHook)
fi

if [ -z "$NIX_QT5_TMP" ]; then
    if [ -z "$NIX_QT_SUBMODULE" ]; then
        if [ -z "$IN_NIX_SHELL" ]; then
            NIX_QT5_TMP=$(pwd)/__nix_qt5__
        else
            NIX_QT5_TMP=$(mktemp -d)
        fi
    else
        NIX_QT5_TMP=$out
    fi

    mkdir -p "$NIX_QT5_TMP/nix-support"
    for subdir in bin include lib mkspecs share; do
        mkdir "$NIX_QT5_TMP/$subdir"
        echo "$subdir/" >> "$NIX_QT5_TMP/nix-support/qt-inputs"
    done

    cp "@dev@/bin/qmake" "$NIX_QT5_TMP/bin"
    echo "bin/qmake" >> "$NIX_QT5_TMP/nix-support/qt-inputs"

    cat >"$NIX_QT5_TMP/bin/qt.conf" <<EOF
[Paths]
Prefix = $NIX_QT5_TMP
Plugins = $qtPluginPrefix
Qml2Imports = $qtQmlPrefix
Documentation = $qtDocPrefix
EOF
    echo "bin/qt.conf" >> "$NIX_QT5_TMP/nix-support/qt-inputs"

    export QMAKE="$NIX_QT5_TMP/bin/qmake"
fi