{ stdenv, lib, src, patches, version, qtCompatVersion, coreutils, bison, flex, gdb, gperf, lndir, perl, pkg-config, python3, copyPathToStore, makeSetupHook, which, # darwin support xcbuild, dbus, fontconfig, freetype, glib, harfbuzz, icu, libdrm, libx11, libxcomposite, libxcursor, libxext, libxi, libxrender, libjpeg, libpng, libxcb, libxkbcommon, libxml2, libxslt, openssl, pcre2, sqlite, udev, libxcb-util, libxcb-image, libxcb-keysyms, libxcb-render-util, libxcb-wm, zlib, at-spi2-core, # optional dependencies cups ? null, libpq ? null, withGtk3 ? false, dconf, gtk3, qttranslations ? null, withLibinput ? false, libinput, # options libGLSupported ? !stdenv.hostPlatform.isDarwin, libGL, mysqlSupport ? true, libmysqlclient, buildExamples ? false, buildTests ? false, debug ? false, 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}"; qtPluginPrefix = "lib/qt-${qtCompatVersion}/plugins"; qtQmlPrefix = "lib/qt-${qtCompatVersion}/qml"; qtDocPrefix = "share/doc/qt-${qtCompatVersion}"; fix_qt_builtin_paths = copyPathToStore ../hooks/fix-qt-builtin-paths.sh; fix_qt_module_paths = copyPathToStore ../hooks/fix-qt-module-paths.sh; devTools = [ "bin/fixqt4headers.pl" "bin/moc" "bin/qdbuscpp2xml" "bin/qdbusxml2cpp" "bin/qlalr" "bin/qmake" "bin/rcc" "bin/syncqt.pl" "bin/uic" ]; in stdenv.mkDerivation ( finalAttrs: ( { pname = "qtbase"; inherit qtCompatVersion src version; propagatedBuildInputs = [ libxml2 libxslt openssl sqlite zlib # Text rendering freetype harfbuzz icu # Image formats libjpeg libpng pcre2 ] ++ lib.optionals (!stdenv.hostPlatform.isDarwin) ( [ dbus glib udev # Text rendering fontconfig libdrm # X11 libs libx11 libxcomposite libxext libxi libxrender libxcb libxkbcommon libxcb-util libxcb-image libxcb-keysyms libxcb-render-util libxcb-wm ] ++ lib.optionals libGLSupported [ libGL ] ); buildInputs = [ python3 at-spi2-core ] ++ lib.optionals (!stdenv.hostPlatform.isDarwin) ( lib.optional withLibinput libinput ++ lib.optional withGtk3 gtk3 ) ++ lib.optionals developerBuild [ gdb ] ++ lib.optionals (cups != null) [ cups ] ++ lib.optionals mysqlSupport [ libmysqlclient ] ++ lib.optionals (libpq != null) [ libpq ]; nativeBuildInputs = [ bison flex gperf lndir perl pkg-config which ] ++ lib.optionals mysqlSupport [ libmysqlclient ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ xcbuild ]; } // lib.optionalAttrs (stdenv.buildPlatform != stdenv.hostPlatform) { # `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 ]; strictDeps = true; # libQt5Core links calls CoreFoundation APIs that call into the system ICU. Binaries linked # against it will crash during build unless they can access `/usr/share/icu/icudtXXl.dat`. propagatedSandboxProfile = lib.optionalString stdenv.hostPlatform.isDarwin '' (allow file-read* (subpath "/usr/share/icu")) ''; enableParallelBuilding = true; outputs = [ "bin" "dev" "out" ]; inherit patches; preHook = '' . ${fix_qt_builtin_paths} . ${fix_qt_module_paths} . ${../hooks/move-qt-dev-tools.sh} . ${../hooks/fix-qmake-libtool.sh} ''; postPatch = '' for prf in qml_plugin.prf qt_plugin.prf qt_docs.prf qml_module.prf create_cmake.prf; do substituteInPlace "mkspecs/features/$prf" \ --subst-var-by qtPluginPrefix ${qtPluginPrefix} \ --subst-var-by qtQmlPrefix ${qtQmlPrefix} \ --subst-var-by qtDocPrefix ${qtDocPrefix} done substituteInPlace configure --replace-fail /bin/pwd pwd substituteInPlace src/corelib/global/global.pri --replace-fail /bin/ls ${coreutils}/bin/ls sed -e 's@/\(usr\|opt\)/@/var/empty/@g' -i mkspecs/*/*.conf sed -i '/PATHS.*NO_DEFAULT_PATH/ d' src/corelib/Qt5Config.cmake.in sed -i '/PATHS.*NO_DEFAULT_PATH/ d' src/corelib/Qt5CoreMacros.cmake sed -i 's/NO_DEFAULT_PATH//' src/gui/Qt5GuiConfigExtras.cmake.in sed -i '/PATHS.*NO_DEFAULT_PATH/ d' mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in # https://bugs.gentoo.org/803470 sed -i 's/-lpthread/-pthread/' mkspecs/common/linux.conf src/corelib/configure.json patchShebangs ./bin '' + ( if stdenv.hostPlatform.isDarwin then '' for file in \ configure \ mkspecs/features/mac/asset_catalogs.prf \ mkspecs/features/mac/default_pre.prf \ mkspecs/features/mac/sdk.mk \ mkspecs/features/mac/sdk.prf do substituteInPlace "$file" \ --replace-quiet /usr/bin/xcode-select '${lib.getExe' xcbuild "xcode-select"}' \ --replace-quiet /usr/bin/xcrun '${lib.getExe' xcbuild "xcrun"}' \ --replace-quiet /usr/libexec/PlistBuddy '${lib.getExe' xcbuild "PlistBuddy"}' done substituteInPlace configure \ --replace-fail /System/Library/Frameworks/Cocoa.framework "$SDKROOT/System/Library/Frameworks/Cocoa.framework" substituteInPlace mkspecs/common/macx.conf \ --replace-fail 'CONFIG += ' 'CONFIG += no_default_rpath ' \ --replace-fail \ 'QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.13' \ "QMAKE_MACOSX_DEPLOYMENT_TARGET = $MACOSX_DEPLOYMENT_TARGET" '' else lib.optionalString libGLSupported '' sed -i mkspecs/common/linux.conf \ -e "/^QMAKE_INCDIR_OPENGL/ s|$|${lib.getDev libGL}/include|" \ -e "/^QMAKE_LIBDIR_OPENGL/ s|$|${lib.getLib libGL}/lib|" '' + lib.optionalString (stdenv.hostPlatform.isx86_32 && stdenv.cc.isGNU) '' sed -i mkspecs/common/gcc-base-unix.conf \ -e "/^QMAKE_LFLAGS_SHLIB/ s/-shared/-shared -static-libgcc/" '' ); setOutputFlags = false; preConfigure = '' export LD_LIBRARY_PATH="$PWD/lib:$PWD/plugins/platforms''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH" NIX_CFLAGS_COMPILE+=" -DNIXPKGS_QT_PLUGIN_PREFIX=\"${qtPluginPrefix}\"" # paralellize compilation of qtmake, which happens within ./configure export MAKEFLAGS+=" -j$NIX_BUILD_CORES" ./bin/syncqt.pl -version ${version} '' + lib.optionalString (!stdenv.buildPlatform.canExecute 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_LFLAGS=''${LDFLAGS}" >> mkspecs/devices/${qtPlatformCross stdenv.hostPlatform}/qmake.conf echo "QMAKE_CFLAGS=''${CFLAGS}" >> mkspecs/devices/${qtPlatformCross stdenv.hostPlatform}/qmake.conf echo "QMAKE_CXXFLAGS=''${CXXFLAGS}" >> mkspecs/devices/${qtPlatformCross stdenv.hostPlatform}/qmake.conf ''; postConfigure = '' qmakeCacheInjectNixOutputs() { local cache="$1/.qmake.stash" echo "qmakeCacheInjectNixOutputs: $cache" if ! [ -f "$cache" ]; then echo >&2 "qmakeCacheInjectNixOutputs: WARNING: $cache does not exist" fi cat >>"$cache" <