summary refs log tree commit diff
path: root/pkgs/development/libraries/qt-6/hooks/wrap-qt-apps-hook.sh
blob: 8b135a7d7492f0cb66d5fb89e1ce14a2f2864af1 (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
if [[ -z "${__nix_wrapQtAppsHook-}" ]]; then
    __nix_wrapQtAppsHook=1 # Don't run this hook more than once.

    # Inherit arguments given in mkDerivation
    qtWrapperArgs=(${qtWrapperArgs-})

    qtHostPathSeen=()

    qtUnseenHostPath() {
        for pkg in "${qtHostPathSeen[@]}"; do
            if [ "${pkg:?}" == "$1" ]; then
                return 1
            fi
        done

        qtHostPathSeen+=("$1")
        return 0
    }

    qtHostPathHook() {
        qtUnseenHostPath "$1" || return 0

        if ! [ -v qtPluginPrefix ]; then
            echo "wrapQtAppsHook qtHostPathHook: qtPluginPrefix is unset. hint: add qt6.qtbase to buildInputs"
        fi

        local pluginDir="$1/${qtPluginPrefix:?}"
        if [ -d "$pluginDir" ]; then
            qtWrapperArgs+=(--prefix QT_PLUGIN_PATH : "$pluginDir")
        fi

        local qmlDir="$1/${qtQmlPrefix:?}"
        if [ -d "$qmlDir" ]; then
            qtWrapperArgs+=(--prefix QML2_IMPORT_PATH : "$qmlDir")
        fi
    }
    addEnvHooks "$targetOffset" qtHostPathHook

    makeQtWrapper() {
        local original="$1"
        local wrapper="$2"
        shift 2
        makeWrapper "$original" "$wrapper" "${qtWrapperArgs[@]}" "$@"
    }

    wrapQtApp() {
        local program="$1"
        shift 1
        wrapProgram "$program" "${qtWrapperArgs[@]}" "$@"
    }

    qtOwnPathsHook() {
        local xdgDataDir="${!outputBin}/share"
        if [ -d "$xdgDataDir" ]; then
            qtWrapperArgs+=(--prefix XDG_DATA_DIRS : "$xdgDataDir")
        fi

        local xdgConfigDir="${!outputBin}/etc/xdg"
        if [ -d "$xdgConfigDir" ]; then
            qtWrapperArgs+=(--prefix XDG_CONFIG_DIRS : "$xdgConfigDir")
        fi

        qtHostPathHook "${!outputBin}"
    }

    preFixupPhases+=" qtOwnPathsHook"

    # Note: $qtWrapperArgs still gets defined even if ${dontWrapQtApps-} is set.
    wrapQtAppsHook() {
        # skip this hook when requested
        [ -z "${dontWrapQtApps-}" ] || return 0

        # guard against running multiple times (e.g. due to propagation)
        [ -z "$wrapQtAppsHookHasRun" ] || return 0
        wrapQtAppsHookHasRun=1

        local targetDirs=("$prefix/bin" "$prefix/sbin" "$prefix/libexec" "$prefix/Applications" "$prefix/"*.app)
        echo "wrapping Qt applications in ${targetDirs[@]}"

        for targetDir in "${targetDirs[@]}"; do
            [ -d "$targetDir" ] || continue

            find "$targetDir" ! -type d -executable -print0 | while IFS= read -r -d '' file; do
                if [ -f "$file" ]; then
                    echo "wrapping $file"
                    wrapQtApp "$file"
                elif [ -h "$file" ]; then
                    target="$(readlink -e "$file")"
                    echo "wrapping $file -> $target"
                    rm "$file"
                    makeQtWrapper "$target" "$file"
                fi
            done
        done
    }

    fixupOutputHooks+=(wrapQtAppsHook)

fi