summaryrefslogtreecommitdiffstats
path: root/pkgs
diff options
context:
space:
mode:
authorThomas Tuegel <ttuegel@mailbox.org>2019-07-05 10:41:41 -0500
committerThomas Tuegel <ttuegel@mailbox.org>2019-07-05 10:41:41 -0500
commitf79fd2e826dd95b3b64839d3e0bec8ae1dfab17e (patch)
tree6556b45a2f1a5d9b1de7ab9a7bf6093aac46bb62 /pkgs
parent0daecd2d7ae7f98e331c38f520b827e671ac1f74 (diff)
wrapQtAppsHook: wrap Qt applications for runtime dependencies
Diffstat (limited to 'pkgs')
-rw-r--r--pkgs/applications/kde/ark/default.nix38
-rw-r--r--pkgs/applications/kde/okular.nix12
-rw-r--r--pkgs/desktops/plasma-5/plasma-workspace/default.nix11
-rw-r--r--pkgs/development/libraries/kde-frameworks/default.nix15
-rw-r--r--pkgs/development/libraries/kde-frameworks/extra-cmake-modules/setup-hook.sh64
-rw-r--r--pkgs/development/libraries/kde-frameworks/kinit/default.nix4
-rw-r--r--pkgs/development/libraries/qt-5/5.11/default.nix34
-rw-r--r--pkgs/development/libraries/qt-5/5.12/default.nix34
-rw-r--r--pkgs/development/libraries/qt-5/5.6/default.nix30
-rw-r--r--pkgs/development/libraries/qt-5/5.9/default.nix30
-rw-r--r--pkgs/development/libraries/qt-5/hooks/qtbase-setup-hook.sh22
-rw-r--r--pkgs/development/libraries/qt-5/hooks/wrap-qt-apps-hook.sh106
-rw-r--r--pkgs/development/libraries/qt-5/mkDerivation.nix8
-rw-r--r--pkgs/development/libraries/qt-5/modules/qtspeech.nix2
-rw-r--r--pkgs/top-level/all-packages.nix8
15 files changed, 313 insertions, 105 deletions
diff --git a/pkgs/applications/kde/ark/default.nix b/pkgs/applications/kde/ark/default.nix
index 598857f2e70d..6015cb69d778 100644
--- a/pkgs/applications/kde/ark/default.nix
+++ b/pkgs/applications/kde/ark/default.nix
@@ -1,37 +1,39 @@
{
- mkDerivation, lib, makeWrapper,
+ mkDerivation, lib, config,
extra-cmake-modules, kdoctools,
- karchive, kconfig, kcrash, kdbusaddons, ki18n, kiconthemes, kitemmodels,
- khtml, kio, kparts, kpty, kservice, kwidgetsaddons, libarchive,
+ breeze-icons, karchive, kconfig, kcrash, kdbusaddons, ki18n,
+ kiconthemes, kitemmodels, khtml, kio, kparts, kpty, kservice, kwidgetsaddons,
+
+ libarchive, libzip,
# Archive tools
- p7zip, unzip, zip,
+ p7zip, lrzip,
# Unfree tools
unfreeEnableUnrar ? false, unrar,
}:
+let
+ extraTools = [ p7zip lrzip ] ++ lib.optional unfreeEnableUnrar unrar;
+in
+
mkDerivation {
name = "ark";
- nativeBuildInputs = [ extra-cmake-modules kdoctools makeWrapper ];
- propagatedBuildInputs = [
- karchive kconfig kcrash kdbusaddons khtml ki18n kiconthemes kio kitemmodels
- kparts kpty kservice kwidgetsaddons libarchive
- ];
- outputs = [ "out" "dev" ];
- postFixup =
- let
- PATH =
- lib.makeBinPath
- ([ p7zip unzip zip ] ++ lib.optional unfreeEnableUnrar unrar);
- in ''
- wrapProgram "$out/bin/ark" --prefix PATH : "${PATH}"
- '';
meta = {
license = with lib.licenses;
[ gpl2 lgpl3 ] ++ lib.optional unfreeEnableUnrar unfree;
maintainers = [ lib.maintainers.ttuegel ];
};
+
+ outputs = [ "out" "dev" ];
+ nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+ buildInputs = [ libarchive libzip ] ++ extraTools;
+ propagatedBuildInputs = [
+ breeze-icons karchive kconfig kcrash kdbusaddons khtml ki18n kiconthemes kio
+ kitemmodels kparts kpty kservice kwidgetsaddons
+ ];
+
+ qtWrapperArgs = [ "--prefix" "PATH" ":" (lib.makeBinPath extraTools) ];
}
diff --git a/pkgs/applications/kde/okular.nix b/pkgs/applications/kde/okular.nix
index 39fb232b3421..377fbe3339a7 100644
--- a/pkgs/applications/kde/okular.nix
+++ b/pkgs/applications/kde/okular.nix
@@ -1,18 +1,18 @@
{
stdenv, mkDerivation, lib,
extra-cmake-modules, kdoctools,
- chmlib ? null, discount, djvulibre, ebook_tools, kactivities, karchive, kbookmarks,
- kcompletion, kconfig, kconfigwidgets, kcoreaddons, kdbusaddons,
- kdegraphics-mobipocket, kiconthemes, kjs, khtml, kio, kparts, kpty, kwallet,
- kwindowsystem, libkexiv2, libspectre, libzip, phonon, poppler, qca-qt5,
- qtdeclarative, qtsvg, threadweaver, kcrash
+ breeze-icons, chmlib ? null, discount, djvulibre, ebook_tools, kactivities,
+ karchive, kbookmarks, kcompletion, kconfig, kconfigwidgets, kcoreaddons,
+ kdbusaddons, kdegraphics-mobipocket, kiconthemes, kjs, khtml, kio, kparts,
+ kpty, kwallet, kwindowsystem, libkexiv2, libspectre, libzip, phonon, poppler,
+ qca-qt5, qtdeclarative, qtsvg, threadweaver, kcrash
}:
mkDerivation {
name = "okular";
nativeBuildInputs = [ extra-cmake-modules kdoctools ];
buildInputs = [
- discount djvulibre ebook_tools kactivities karchive kbookmarks
+ breeze-icons discount djvulibre ebook_tools kactivities karchive kbookmarks
kcompletion kconfig kconfigwidgets kcoreaddons kdbusaddons
kdegraphics-mobipocket kiconthemes kjs khtml kio kparts kpty kwallet
kwindowsystem libkexiv2 libspectre libzip phonon poppler qca-qt5
diff --git a/pkgs/desktops/plasma-5/plasma-workspace/default.nix b/pkgs/desktops/plasma-5/plasma-workspace/default.nix
index 680021e350b7..1403c9e4c8b7 100644
--- a/pkgs/desktops/plasma-5/plasma-workspace/default.nix
+++ b/pkgs/desktops/plasma-5/plasma-workspace/default.nix
@@ -34,7 +34,8 @@ mkDerivation {
qtgraphicaleffects qtquickcontrols qtquickcontrols2 qtscript qtwayland qtx11extras
];
- outputs = [ "bin" "dev" "out" ];
+ propagatedUserEnvPkgs = [ qtgraphicaleffects ];
+ outputs = [ "out" "dev" ];
cmakeFlags = [
"-DNIXPKGS_XMESSAGE=${getBin xmessage}/bin/xmessage"
@@ -45,7 +46,7 @@ mkDerivation {
"-DNIXPKGS_XPROP=${getBin xprop}/bin/xprop"
"-DNIXPKGS_ID=${getBin coreutils}/bin/id"
"-DNIXPKGS_DBUS_UPDATE_ACTIVATION_ENVIRONMENT=${getBin dbus}/bin/dbus-update-activation-environment"
- "-DNIXPKGS_START_KDEINIT_WRAPPER=${getLib kinit}/lib/libexec/kf5/start_kdeinit_wrapper"
+ "-DNIXPKGS_START_KDEINIT_WRAPPER=${getLib kinit}/libexec/kf5/start_kdeinit_wrapper"
"-DNIXPKGS_QDBUS=${getBin qttools}/bin/qdbus"
"-DNIXPKGS_KWRAPPER5=${getBin kinit}/bin/kwrapper5"
"-DNIXPKGS_KREADCONFIG5=${getBin kconfig}/bin/kreadconfig5"
@@ -72,10 +73,6 @@ mkDerivation {
preConfigure = ''
NIX_CFLAGS_COMPILE+=" -DNIXPKGS_KDOSTARTUPCONFIG5=\"''${!outputBin}/bin/kdostartupconfig5\""
- cmakeFlags+=" -DNIXPKGS_STARTPLASMA=''${!outputBin}/lib/libexec/startplasma"
- '';
-
- postInstall = ''
- moveToOutput lib/libexec/startplasma ''${!outputBin}
+ cmakeFlags+=" -DNIXPKGS_STARTPLASMA=''${!outputBin}/libexec/startplasma"
'';
}
diff --git a/pkgs/development/libraries/kde-frameworks/default.nix b/pkgs/development/libraries/kde-frameworks/default.nix
index 62ae433ff710..7745d78f8fca 100644
--- a/pkgs/development/libraries/kde-frameworks/default.nix
+++ b/pkgs/development/libraries/kde-frameworks/default.nix
@@ -45,17 +45,9 @@ let
if [ "$hookName" != postHook ]; then
postHooks+=("source @dev@/nix-support/setup-hook")
else
- # Propagate $${out} output
- propagatedUserEnvPkgs="$propagatedUserEnvPkgs @${out}@"
-
- if [ -z "$outputDev" ]; then
- echo "error: \$outputDev is unset!" >&2
- exit 1
- fi
-
# Propagate $dev so that this setup hook is propagated
# But only if there is a separate $dev output
- if [ "$outputDev" != out ]; then
+ if [ "''${outputDev:?}" != out ]; then
propagatedBuildInputs="$propagatedBuildInputs @dev@"
fi
fi
@@ -75,10 +67,9 @@ let
inherit (srcs."${name}") src version;
outputs = args.outputs or [ "bin" "dev" "out" ];
- hasBin = lib.elem "bin" outputs;
- hasDev = lib.elem "dev" outputs;
+ hasSeparateDev = lib.elem "dev" outputs;
- defaultSetupHook = if hasBin && hasDev then propagateBin else null;
+ defaultSetupHook = if hasSeparateDev then propagateBin else null;
setupHook = args.setupHook or defaultSetupHook;
meta = {
diff --git a/pkgs/development/libraries/kde-frameworks/extra-cmake-modules/setup-hook.sh b/pkgs/development/libraries/kde-frameworks/extra-cmake-modules/setup-hook.sh
index 88091e78a0cd..4df086ddbf21 100644
--- a/pkgs/development/libraries/kde-frameworks/extra-cmake-modules/setup-hook.sh
+++ b/pkgs/development/libraries/kde-frameworks/extra-cmake-modules/setup-hook.sh
@@ -1,16 +1,16 @@
-_ecmEnvHook() {
+ecmEnvHook() {
addToSearchPath XDG_DATA_DIRS "$1/share"
addToSearchPath XDG_CONFIG_DIRS "$1/etc/xdg"
}
-addEnvHooks "$targetOffset" _ecmEnvHook
+addEnvHooks "$targetOffset" ecmEnvHook
-_ecmPreConfigureHook() {
+ecmPostHook() {
# Because we need to use absolute paths here, we must set *all* the paths.
cmakeFlags+=" -DKDE_INSTALL_EXECROOTDIR=${!outputBin}"
cmakeFlags+=" -DKDE_INSTALL_BINDIR=${!outputBin}/bin"
cmakeFlags+=" -DKDE_INSTALL_SBINDIR=${!outputBin}/sbin"
cmakeFlags+=" -DKDE_INSTALL_LIBDIR=${!outputLib}/lib"
- cmakeFlags+=" -DKDE_INSTALL_LIBEXECDIR=${!outputLib}/lib/libexec"
+ cmakeFlags+=" -DKDE_INSTALL_LIBEXECDIR=${!outputLib}/libexec"
cmakeFlags+=" -DKDE_INSTALL_CMAKEPACKAGEDIR=${!outputDev}/lib/cmake"
cmakeFlags+=" -DKDE_INSTALL_INCLUDEDIR=${!outputInclude}/include"
cmakeFlags+=" -DKDE_INSTALL_LOCALSTATEDIR=/var"
@@ -51,4 +51,58 @@ _ecmPreConfigureHook() {
cmakeFlags+=" -DKDE_INSTALL_QMLDIR=${!outputBin}/$qtQmlPrefix"
fi
}
-preConfigureHooks+=(_ecmPreConfigureHook)
+postHooks+=(ecmPostHook)
+
+xdgDataSubdirs=(
+ "doc" "config.kcfg" "kconf_update" "kservices5" "kservicetypes5" \
+ "kxmlgui5" "knotifications5" "icons" "locale" "sounds" "templates" \
+ "wallpapers" "applications" "desktop-directories" "mime" "appdata" "dbus-1" \
+)
+
+
+ecmHostPathSeen=( )
+
+ecmUnseenHostPath() {
+ for pkg in "${ecmHostPathSeen[@]}"
+ do
+ if [ "${pkg:?}" == "$1" ]
+ then
+ return 1
+ fi
+ done
+
+ ecmHostPathSeen+=("$1")
+ return 0
+}
+
+ecmHostPathHook() {
+ ecmUnseenHostPath "$1" || return 0
+
+ local xdgConfigDir="$1/etc/xdg"
+ if [ -d "$xdgConfigDir" ]
+ then
+ qtWrapperArgs+=(--prefix XDG_CONFIG_DIRS : "$xdgConfigDir")
+ fi
+
+ for xdgDataSubdir in "${xdgDataSubdirs[@]}"
+ do
+ if [ -d "$1/share/$xdgDataSubdir" ]
+ then
+ qtWrapperArgs+=(--prefix XDG_DATA_DIRS : "$1/share")
+ break
+ fi
+ done
+
+ local manDir="$1/man"
+ if [ -d "$manDir" ]
+ then
+ qtWrapperArgs+=(--prefix MANPATH : "$manDir")
+ fi
+
+ local infoDir="$1/info"
+ if [ -d "$infoDir" ]
+ then
+ qtWrapperArgs+=(--prefix INFOPATH : "$infoDir")
+ fi
+}
+addEnvHooks "$hostOffset" ecmHostPathHook
diff --git a/pkgs/development/libraries/kde-frameworks/kinit/default.nix b/pkgs/development/libraries/kde-frameworks/kinit/default.nix
index 538078fd7457..42a1e157a917 100644
--- a/pkgs/development/libraries/kde-frameworks/kinit/default.nix
+++ b/pkgs/development/libraries/kde-frameworks/kinit/default.nix
@@ -9,6 +9,7 @@ let inherit (lib) getLib; in
mkDerivation {
name = "kinit";
meta = { maintainers = [ lib.maintainers.ttuegel ]; };
+ outputs = [ "out" "dev" ];
nativeBuildInputs = [ extra-cmake-modules kdoctools ];
buildInputs = [
kconfig kcrash ki18n kio kservice kwindowsystem
@@ -19,9 +20,6 @@ mkDerivation {
''-DNIXPKGS_KF5_PARTS=\"${getLib kparts}/lib/libKF5Parts.so.5\"''
''-DNIXPKGS_KF5_PLASMA=\"${getLib plasma-framework}/lib/libKF5Plasma.so.5\"''
];
- postFixup = ''
- moveToOutput "lib/libexec/kf5/start_kdeinit" "$bin"
- '';
setupHook = writeScript "setup-hook.sh" ''
kinitFixupOutputHook() {
if [ $prefix != ''${!outputBin} ] && [ -d $prefix/lib ]; then
diff --git a/pkgs/development/libraries/qt-5/5.11/default.nix b/pkgs/development/libraries/qt-5/5.11/default.nix
index f43329d35539..9ef3364cd5c7 100644
--- a/pkgs/development/libraries/qt-5/5.11/default.nix
+++ b/pkgs/development/libraries/qt-5/5.11/default.nix
@@ -17,7 +17,7 @@ top-level attribute to `top-level/all-packages.nix`.
{
newScope,
- stdenv, fetchurl, fetchFromGitHub, makeSetupHook,
+ stdenv, fetchurl, fetchFromGitHub, makeSetupHook, makeWrapper,
bison, cups ? null, harfbuzz, libGL, perl,
gstreamer, gst-plugins-base, gtk3, dconf,
cf-private, llvmPackages_5,
@@ -34,6 +34,8 @@ let
qtCompatVersion = "5.11";
+ stdenvActual = if stdenv.cc.isClang then llvmPackages_5.stdenv else stdenv;
+
mirror = "https://download.qt.io";
srcs = import ./srcs.nix { inherit fetchurl; inherit mirror; } // {
# Community port of the now unmaintained upstream qtwebkit.
@@ -64,16 +66,18 @@ let
qtwebkit = [ ./qtwebkit.patch ];
};
- mkDerivation =
- import ../mkDerivation.nix {
- inherit (stdenv) lib;
- stdenv = if stdenv.cc.isClang then llvmPackages_5.stdenv else stdenv;
- }
- { inherit debug; };
-
qtModule =
import ../qtModule.nix
- { inherit mkDerivation perl; inherit (stdenv) lib; }
+ {
+ inherit perl;
+ inherit (stdenv) lib;
+ # Use a variant of mkDerivation that does not include wrapQtApplications
+ # to avoid cyclic dependencies between Qt modules.
+ mkDerivation =
+ import ../mkDerivation.nix
+ { inherit (stdenv) lib; inherit debug; wrapQtAppsHook = null; }
+ stdenvActual.mkDerivation;
+ }
{ inherit self srcs patches; };
addPackages = self: with self;
@@ -81,7 +85,11 @@ let
callPackage = self.newScope { inherit qtCompatVersion qtModule srcs; };
in {
- inherit mkDerivation;
+ mkDerivationWith =
+ import ../mkDerivation.nix
+ { inherit (stdenv) lib; inherit debug; inherit (self) wrapQtAppsHook; };
+
+ mkDerivation = mkDerivationWith stdenvActual.mkDerivation;
qtbase = callPackage ../modules/qtbase.nix {
inherit (srcs.qtbase) src version;
@@ -146,6 +154,12 @@ let
fix_qt_builtin_paths = ../hooks/fix-qt-builtin-paths.sh;
};
} ../hooks/qmake-hook.sh;
+
+ wrapQtAppsHook = makeSetupHook {
+ deps =
+ [ self.qtbase.dev makeWrapper ]
+ ++ optional stdenv.isLinux self.qtwayland.dev;
+ } ../hooks/wrap-qt-apps-hook.sh;
};
self = makeScope newScope addPackages;
diff --git a/pkgs/development/libraries/qt-5/5.12/default.nix b/pkgs/development/libraries/qt-5/5.12/default.nix
index 2aa7d0f71ee0..7a85202ced76 100644
--- a/pkgs/development/libraries/qt-5/5.12/default.nix
+++ b/pkgs/development/libraries/qt-5/5.12/default.nix
@@ -17,7 +17,7 @@ top-level attribute to `top-level/all-packages.nix`.
{
newScope,
- stdenv, fetchurl, fetchFromGitHub, makeSetupHook,
+ stdenv, fetchurl, fetchFromGitHub, makeSetupHook, makeWrapper,
bison, cups ? null, harfbuzz, libGL, perl,
gstreamer, gst-plugins-base, gtk3, dconf,
cf-private, llvmPackages_5,
@@ -34,6 +34,8 @@ let
qtCompatVersion = "5.12";
+ stdenvActual = if stdenv.cc.isClang then llvmPackages_5.stdenv else stdenv;
+
mirror = "https://download.qt.io";
srcs = import ./srcs.nix { inherit fetchurl; inherit mirror; } // {
# Community port of the now unmaintained upstream qtwebkit.
@@ -69,16 +71,18 @@ let
qttools = [ ./qttools.patch ];
};
- mkDerivation =
- import ../mkDerivation.nix {
- inherit (stdenv) lib;
- stdenv = if stdenv.cc.isClang then llvmPackages_5.stdenv else stdenv;
- }
- { inherit debug; };
-
qtModule =
import ../qtModule.nix
- { inherit mkDerivation perl; inherit (stdenv) lib; }
+ {
+ inherit perl;
+ inherit (stdenv) lib;
+ # Use a variant of mkDerivation that does not include wrapQtApplications
+ # to avoid cyclic dependencies between Qt modules.
+ mkDerivation =
+ import ../mkDerivation.nix
+ { inherit (stdenv) lib; inherit debug; wrapQtAppsHook = null; }
+ stdenvActual.mkDerivation;
+ }
{ inherit self srcs patches; };
addPackages = self: with self;
@@ -86,7 +90,11 @@ let
callPackage = self.newScope { inherit qtCompatVersion qtModule srcs; };
in {
- inherit mkDerivation;
+ mkDerivationWith =
+ import ../mkDerivation.nix
+ { inherit (stdenv) lib; inherit debug; inherit (self) wrapQtAppsHook; };
+
+ mkDerivation = mkDerivationWith stdenvActual.mkDerivation;
qtbase = callPackage ../modules/qtbase.nix {
inherit (srcs.qtbase) src version;
@@ -151,6 +159,12 @@ let
fix_qt_builtin_paths = ../hooks/fix-qt-builtin-paths.sh;
};
} ../hooks/qmake-hook.sh;
+
+ wrapQtAppsHook = makeSetupHook {
+ deps =
+ [ self.qtbase.dev makeWrapper ]
+ ++ optional stdenv.isLinux self.qtwayland.dev;
+ } ../hooks/wrap-qt-apps-hook.sh;
};
self = makeScope newScope addPackages;
diff --git a/pkgs/development/libraries/qt-5/5.6/default.nix b/pkgs/development/libraries/qt-5/5.6/default.nix
index e493fc169aba..2018488cee51 100644
--- a/pkgs/development/libraries/qt-5/5.6/default.nix
+++ b/pkgs/development/libraries/qt-5/5.6/default.nix
@@ -26,7 +26,7 @@ existing packages here and modify it as necessary.
{
newScope,
- stdenv, fetchurl, fetchpatch, makeSetupHook,
+ stdenv, fetchurl, fetchpatch, makeSetupHook, makeWrapper,
bison, cups ? null, harfbuzz, libGL, perl,
gstreamer, gst-plugins-base,
cf-private,
@@ -105,14 +105,18 @@ let
];
};
- mkDerivation =
- import ../mkDerivation.nix
- { inherit stdenv; inherit (stdenv) lib; }
- { inherit debug; };
-
qtModule =
import ../qtModule.nix
- { inherit mkDerivation perl; inherit (stdenv) lib; }
+ {
+ inherit perl;
+ inherit (stdenv) lib;
+ # Use a variant of mkDerivation that does not include wrapQtApplications
+ # to avoid cyclic dependencies between Qt modules.
+ mkDerivation =
+ import ../mkDerivation.nix
+ { inherit (stdenv) lib; inherit debug; wrapQtAppsHook = null; }
+ stdenv.mkDerivation;
+ }
{ inherit self srcs patches; };
addPackages = self: with self;
@@ -120,7 +124,11 @@ let
callPackage = self.newScope { inherit qtCompatVersion qtModule srcs; };
in {
- inherit mkDerivation;
+ mkDerivationWith =
+ import ../mkDerivation.nix
+ { inherit (stdenv) lib; inherit debug; inherit (self) wrapQtAppsHook; };
+
+ mkDerivation = mkDerivationWith stdenv.mkDerivation;
qtbase = callPackage ../modules/qtbase.nix {
inherit bison cups harfbuzz libGL;
@@ -176,6 +184,12 @@ let
deps = [ self.qtbase.dev ];
substitutions = { inherit (stdenv) isDarwin; };
} ../hooks/qmake-hook.sh;
+
+ wrapQtAppsHook = makeSetupHook {
+ deps =
+ [ self.qtbase.dev makeWrapper ]
+ ++ optional stdenv.isLinux self.qtwayland.dev;
+ } ../hooks/wrap-qt-apps-hook.sh;
};
self = makeScope newScope addPackages;
diff --git a/pkgs/development/libraries/qt-5/5.9/default.nix b/pkgs/development/libraries/qt-5/5.9/default.nix
index 9baca8124bd7..373c1b7b9ba6 100644
--- a/pkgs/development/libraries/qt-5/5.9/default.nix
+++ b/pkgs/development/libraries/qt-5/5.9/default.nix
@@ -17,7 +17,7 @@ top-level attribute to `top-level/all-packages.nix`.
{
newScope,
- stdenv, fetchurl, fetchpatch, makeSetupHook,
+ stdenv, fetchurl, fetchpatch, makeSetupHook, makeWrapper,
bison, cups ? null, harfbuzz, libGL, perl,
gstreamer, gst-plugins-base, gtk3, dconf,
cf-private,
@@ -68,14 +68,18 @@ let
};
- mkDerivation =
- import ../mkDerivation.nix
- { inherit stdenv; inherit (stdenv) lib; }
- { inherit debug; };
-
qtModule =
import ../qtModule.nix
- { inherit mkDerivation perl; inherit (stdenv) lib; }
+ {
+ inherit perl;
+ inherit (stdenv) lib;
+ # Use a variant of mkDerivation that does not include wrapQtApplications
+ # to avoid cyclic dependencies between Qt modules.
+ mkDerivation =
+ import ../mkDerivation.nix
+ { inherit (stdenv) lib; inherit debug; wrapQtAppsHook = null; }
+ stdenv.mkDerivation;
+ }
{ inherit self srcs patches; };
addPackages = self: with self;
@@ -83,7 +87,11 @@ let
callPackage = self.newScope { inherit qtCompatVersion qtModule srcs; };
in {
- inherit mkDerivation;
+ mkDerivationWith =
+ import ../mkDerivation.nix
+ { inherit (stdenv) lib; inherit debug; inherit (self) wrapQtAppsHook; };
+
+ mkDerivation = mkDerivationWith stdenv.mkDerivation;
qtbase = callPackage ../modules/qtbase.nix {
inherit (srcs.qtbase) src version;
@@ -145,6 +153,12 @@ let
fix_qt_builtin_paths = ../hooks/fix-qt-builtin-paths.sh;
};
} ../hooks/qmake-hook.sh;
+
+ wrapQtAppsHook = makeSetupHook {
+ deps =
+ [ self.qtbase.dev makeWrapper ]
+ ++ optional stdenv.isLinux self.qtwayland.dev;
+ } ../hooks/wrap-qt-apps-hook.sh;
};
self = makeScope newScope addPackages;
diff --git a/pkgs/development/libraries/qt-5/hooks/qtbase-setup-hook.sh b/pkgs/development/libraries/qt-5/hooks/qtbase-setup-hook.sh
index 3a558153988c..436c2e1d032a 100644
--- a/pkgs/development/libraries/qt-5/hooks/qtbase-setup-hook.sh
+++ b/pkgs/development/libraries/qt-5/hooks/qtbase-setup-hook.sh
@@ -19,12 +19,14 @@ export QMAKEPATH
QMAKEMODULES=
export QMAKEMODULES
-addToQMAKEPATH() {
- if [ -d "$1/mkspecs" ]; then
+qmakePathHook() {
+ if [ -d "$1/mkspecs" ]
+ then
QMAKEMODULES="${QMAKEMODULES}${QMAKEMODULES:+:}/mkspecs"
QMAKEPATH="${QMAKEPATH}${QMAKEPATH:+:}$1"
fi
}
+envBuildHostHooks+=(qmakePathHook)
# Propagate any runtime dependency of the building package.
# Each dependency is propagated to the user environment and as a build
@@ -32,18 +34,18 @@ addToQMAKEPATH() {
# 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.)
-qtEnvHook() {
- addToQMAKEPATH "$1"
- if providesQtRuntime "$1"; then
- if [ "z${!outputBin}" != "z${!outputDev}" ]; then
- propagatedBuildInputs+=" $1"
- fi
- propagatedUserEnvPkgs+=" $1"
+qtEnvHostTargetHook() {
+ if providesQtRuntime "$1" && [ "z${!outputBin}" != "z${!outputDev}" ]
+ then
+ propagatedBuildInputs+=" $1"
fi
}
-envHostTargetHooks+=(qtEnvHook)
+envHostTargetHooks+=(qtEnvHostTargetHook)
postPatchMkspecs() {
+ # Prevent this hook from running multiple times
+ dontPatchMkspecs=1
+
local bin="${!outputBin}"
local dev="${!outputDev}"
local doc="${!outputDoc}"
diff --git a/pkgs/development/libraries/qt-5/hooks/wrap-qt-apps-hook.sh b/pkgs/development/libraries/qt-5/hooks/wrap-qt-apps-hook.sh
new file mode 100644
index 000000000000..83f62e4ec2b8
--- /dev/null
+++ b/pkgs/development/libraries/qt-5/hooks/wrap-qt-apps-hook.sh
@@ -0,0 +1,106 @@
+# 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
+
+ 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 "$hostOffset" 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"
+
+isQtApp () {
+ readelf -d "$1" 2>/dev/null | grep -q -F 'libQt5Core'
+}
+
+# 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" )
+ echo "wrapping Qt applications in ${targetDirs[@]}"
+
+ for targetDir in "${targetDirs[@]}"
+ do
+ [ -d "$targetDir" ] || continue
+
+ find "$targetDir" -executable -print0 | while IFS= read -r -d '' file
+ do
+ isQtApp "$file" || continue
+
+ 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)
diff --git a/pkgs/development/libraries/qt-5/mkDerivation.nix b/pkgs/development/libraries/qt-5/mkDerivation.nix
index d4e2143d564b..95357c096dfd 100644
--- a/pkgs/development/libraries/qt-5/mkDerivation.nix
+++ b/pkgs/development/libraries/qt-5/mkDerivation.nix
@@ -1,8 +1,8 @@
-{ stdenv, lib }:
+{ lib, debug, wrapQtAppsHook }:
let inherit (lib) optional; in
-{ debug }:
+mkDerivation:
args:
@@ -24,7 +24,9 @@ let
enableParallelBuilding = args.enableParallelBuilding or true;
+ nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ wrapQtAppsHook ];
+
};
in
-stdenv.mkDerivation (args // args_)
+mkDerivation (args // args_)
diff --git a/pkgs/development/libraries/qt-5/modules/qtspeech.nix b/pkgs/development/libraries/qt-5/modules/qtspeech.nix
index 7b4b19ccab5a..ddef01a9482e 100644
--- a/pkgs/development/libraries/qt-5/modules/qtspeech.nix
+++ b/pkgs/development/libraries/qt-5/modules/qtspeech.nix
@@ -3,5 +3,5 @@
qtModule {
name = "qtspeech";
qtInputs = [ ];
- outputs = [ "out" "dev" "bin" ];
+ outputs = [ "out" "dev" ];
}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 8fc073db1d35..38df506de600 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -12772,7 +12772,7 @@ in
qt56 = recurseIntoAttrs (makeOverridable
(import ../development/libraries/qt-5/5.6) {
inherit newScope;
- inherit stdenv fetchurl fetchpatch makeSetupHook;
+ inherit stdenv fetchurl fetchpatch makeSetupHook makeWrapper;
bison = bison2; # error: too few arguments to function 'int yylex(...
inherit cups;
harfbuzz = harfbuzzFull;
@@ -12787,7 +12787,7 @@ in
qt59 = recurseIntoAttrs (makeOverridable
(import ../development/libraries/qt-5/5.9) {
inherit newScope;
- inherit stdenv fetchurl fetchpatch makeSetupHook;
+ inherit stdenv fetchurl fetchpatch makeSetupHook makeWrapper;
bison = bison2; # error: too few arguments to function 'int yylex(...
inherit cups;
harfbuzz = harfbuzzFull;
@@ -12804,7 +12804,7 @@ in
qt511 = recurseIntoAttrs (makeOverridable
(import ../development/libraries/qt-5/5.11) {
inherit newScope;
- inherit stdenv fetchurl fetchFromGitHub makeSetupHook;
+ inherit stdenv fetchurl fetchFromGitHub makeSetupHook makeWrapper;
bison = bison2; # error: too few arguments to function 'int yylex(...
inherit cups;
harfbuzz = harfbuzzFull;
@@ -12822,7 +12822,7 @@ in
qt512 = recurseIntoAttrs (makeOverridable
(import ../development/libraries/qt-5/5.12) {
inherit newScope;
- inherit stdenv fetchurl fetchFromGitHub makeSetupHook;
+ inherit stdenv fetchurl fetchFromGitHub makeSetupHook makeWrapper;
bison = bison2; # error: too few arguments to function 'int yylex(...
inherit cups;
harfbuzz = harfbuzzFull;