100 lines
2.9 KiB
Bash
100 lines
2.9 KiB
Bash
|
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 NIXPKGS_QT6_QML_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
|