diff --git a/pkgs/development/libraries/qt-5/5.15/default.nix b/pkgs/development/libraries/qt-5/5.15/default.nix index 16be29ad529e8..6ed5f2b0b1b6d 100644 --- a/pkgs/development/libraries/qt-5/5.15/default.nix +++ b/pkgs/development/libraries/qt-5/5.15/default.nix @@ -207,7 +207,8 @@ let import ../qtModule.nix { inherit perl; - inherit lib; + inherit lib stdenv; + inherit buildPackages; # Use a variant of mkDerivation that does not include wrapQtApplications # to avoid cyclic dependencies between Qt modules. mkDerivation = 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 1b57d676e1fc5..0e23ec1432182 100644 --- a/pkgs/development/libraries/qt-5/hooks/qtbase-setup-hook.sh +++ b/pkgs/development/libraries/qt-5/hooks/qtbase-setup-hook.sh @@ -1,4 +1,5 @@ if [[ -n "${__nix_qtbase-}" ]]; then + if [ -z "${dontWorryAboutQtMismatch-}" ]; then # Throw an error if a different version of Qt was already set up. if [[ "$__nix_qtbase" != "@dev@" ]]; then echo >&2 "Error: detected mismatched Qt dependencies:" @@ -6,6 +7,7 @@ if [[ -n "${__nix_qtbase-}" ]]; then echo >&2 " $__nix_qtbase" exit 1 fi + fi else # Only set up Qt once. __nix_qtbase="@dev@" diff --git a/pkgs/development/libraries/qt-5/modules/qtbase.nix b/pkgs/development/libraries/qt-5/modules/qtbase.nix index de73bcbe27724..ed280cc0151ab 100644 --- a/pkgs/development/libraries/qt-5/modules/qtbase.nix +++ b/pkgs/development/libraries/qt-5/modules/qtbase.nix @@ -28,10 +28,15 @@ , developerBuild ? false , decryptSslTraffic ? false , testers +, buildPackages }: let debugSymbols = debug || developerBuild; + qtPlatformCross = plat: with plat; + if isLinux + then "linux-generic-g++" + else throw "Please add a qtPlatformCross entry for ${plat.config}"; in stdenv.mkDerivation (finalAttrs: { @@ -82,6 +87,11 @@ stdenv.mkDerivation (finalAttrs: { nativeBuildInputs = [ bison flex gperf lndir perl pkg-config which ] ++ lib.optionals stdenv.isDarwin [ xcbuild ]; + # `qtbase` expects to find `cc` (with no prefix) in the + # `$PATH`, so the following is needed even if + # `stdenv.buildPlatform.canExecute stdenv.hostPlatform` + depsBuildBuild = [ buildPackages.stdenv.cc ]; + propagatedNativeBuildInputs = [ lndir ]; # libQt5Core links calls CoreFoundation APIs that call into the system ICU. Binaries linked @@ -161,6 +171,11 @@ stdenv.mkDerivation (finalAttrs: { export MAKEFLAGS+=" -j$NIX_BUILD_CORES" ./bin/syncqt.pl -version $version + '' + lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + # QT's configure script will refuse to use pkg-config unless these two environment variables are set + export PKG_CONFIG_SYSROOT_DIR=/ + export PKG_CONFIG_LIBDIR=${lib.getLib pkg-config}/lib + echo 'QMAKE_PKG_CONFIG=''$''${CROSS_COMPILE}pkg-config' >> mkspecs/devices/${qtPlatformCross stdenv.hostPlatform}/qmake.conf ''; postConfigure = '' @@ -208,6 +223,8 @@ stdenv.mkDerivation (finalAttrs: { # To prevent these failures, we need to override PostgreSQL detection. PSQL_LIBS = lib.optionalString (postgresql != null) "-L${postgresql.lib}/lib -lpq"; + # do not pass --host and --build to configureFlags as QT's configure script doesn't understand them + configurePlatforms = [ ]; # TODO Remove obsolete and useless flags once the build will be totally mastered configureFlags = [ "-plugindir $(out)/$(qtPluginPrefix)" @@ -234,6 +251,9 @@ stdenv.mkDerivation (finalAttrs: { "-L" "${icu.out}/lib" "-I" "${icu.dev}/include" "-pch" + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "-device ${qtPlatformCross stdenv.hostPlatform}" + "-device-option CROSS_COMPILE=${stdenv.cc.targetPrefix}" ] ++ lib.optional debugSymbols "-debug" ++ lib.optionals developerBuild [ diff --git a/pkgs/development/libraries/qt-5/qtModule.nix b/pkgs/development/libraries/qt-5/qtModule.nix index 9abd9fabc9576..75deee58ea604 100644 --- a/pkgs/development/libraries/qt-5/qtModule.nix +++ b/pkgs/development/libraries/qt-5/qtModule.nix @@ -1,4 +1,8 @@ -{ lib, mkDerivation, perl }: +{ lib +, stdenv +, mkDerivation, perl +, buildPackages +}: let inherit (lib) licenses maintainers platforms; in @@ -17,7 +21,8 @@ mkDerivation (args // { patches = (args.patches or []) ++ (patches.${pname} or []); nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ perl self.qmake ]; - propagatedBuildInputs = args.qtInputs ++ (args.propagatedBuildInputs or []); + propagatedBuildInputs = (args.qtInputs or []) ++ (args.propagatedBuildInputs or []); + depsBuildBuild = [ buildPackages.stdenv.cc ]; outputs = args.outputs or [ "out" "dev" ]; setOutputFlags = args.setOutputFlags or false; @@ -74,4 +79,7 @@ mkDerivation (args // { maintainers = with maintainers; [ qknight ttuegel periklis bkchr ]; platforms = platforms.unix; } // (args.meta or {}); + +} // lib.optionalAttrs (stdenv.hostPlatform != stdenv.buildPlatform) { + dontWorryAboutQtMismatch = true; })