about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/qt-6
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2022-12-06 19:57:55 +0000
committerAlyssa Ross <hi@alyssa.is>2023-02-08 13:48:30 +0000
commitbf3aadfdd39aa197e18bade671fab6726349ffa4 (patch)
tree698567af766ed441d757b57a7b21e68d4a342a2b /nixpkgs/pkgs/development/libraries/qt-6
parentf4afc5a01d9539ce09e47494e679c51f80723d07 (diff)
parent99665eb45f58d959d2cb9e49ddb960c79d596f33 (diff)
downloadnixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.tar
nixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.tar.gz
nixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.tar.bz2
nixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.tar.lz
nixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.tar.xz
nixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.tar.zst
nixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.zip
Merge commit '99665eb45f58d959d2cb9e49ddb960c79d596f33'
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/qt-6')
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/cmake.patch129
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/default.nix94
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/fetch.sh1
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/hooks/qtbase-setup-hook.sh43
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/hooks/wrap-qt-apps-hook.sh110
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qt3d.nix12
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qt5compat.nix13
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtbase.nix222
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtcharts.nix9
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtconnectivity.nix15
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtdatavis3d.nix9
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtdeclarative.nix19
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtdoc.nix9
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtimageformats.nix13
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtlanguageserver.nix8
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtlottie.nix9
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtmultimedia.nix24
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtnetworkauth.nix6
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtpositioning.nix14
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtquick3d.nix11
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtquicktimeline.nix9
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtremoteobjects.nix9
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtscxml.nix6
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtsensors.nix10
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtserialbus.nix6
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtserialport.nix14
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtshadertools.nix8
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtsvg.nix15
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qttools.nix11
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qttranslations.nix8
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtvirtualkeyboard.nix15
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtwayland.nix16
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebchannel.nix12
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebengine.nix237
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebsockets.nix11
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebview.nix11
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/qtModule.nix45
-rw-r--r--nixpkgs/pkgs/development/libraries/qt-6/srcs.nix262
38 files changed, 1475 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/cmake.patch b/nixpkgs/pkgs/development/libraries/qt-6/cmake.patch
new file mode 100644
index 000000000000..1fb2ea26c35d
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/cmake.patch
@@ -0,0 +1,129 @@
+commit 4f497c358e0386b65df1c1d636aadf72f8647134
+Author: Nick Cao <nickcao@nichi.co>
+Date:   Tue Apr 19 13:49:59 2022 +0800
+
+    patch cmake file generation for nixpkgs packaging
+    
+    As of qt 6.3.0, installing components into different prefixes is not
+    supported. To workaround that, we move files to their designated in the
+    postInstall hook. However the generated cmake files still have
+    references to the original prefix, and would cause issues when using
+    said components as the dependency of other packages. The purpose of this
+    patch is to closely match the output layout of qt, and rewrite the
+    generated cmake files to point to the corrected pathes.
+
+diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx
+index 8b0f64e23b..03291e2ee2 100644
+--- a/Source/cmExportFileGenerator.cxx
++++ b/Source/cmExportFileGenerator.cxx
+@@ -6,6 +6,7 @@
+ #include <cstring>
+ #include <sstream>
+ #include <utility>
++#include <cstdlib>
+ 
+ #include <cm/memory>
+ 
+@@ -325,9 +326,23 @@ static void prefixItems(std::string& exportDirs)
+   for (std::string const& e : entries) {
+     exportDirs += sep;
+     sep = ";";
+-    if (!cmSystemTools::FileIsFullPath(e) &&
+-        e.find("${_IMPORT_PREFIX}") == std::string::npos) {
+-      exportDirs += "${_IMPORT_PREFIX}/";
++    if (!cmSystemTools::FileIsFullPath(e)) {
++      if (std::getenv("dev")) {
++        if (cmHasLiteralPrefix(e, "include") || cmHasLiteralPrefix(e, "./include")) {
++          exportDirs += std::getenv("dev");
++        } else if (cmHasLiteralPrefix(e, "bin") || cmHasLiteralPrefix(e, "./bin")) {
++          exportDirs += std::getenv("dev");
++        } else if (cmHasLiteralPrefix(e, "mkspecs") || cmHasLiteralPrefix(e, "./mkspecs")) {
++          exportDirs += std::getenv("dev");
++        } else if (cmHasLiteralPrefix(e, "libexec") || cmHasLiteralPrefix(e, "./libexec")) {
++          exportDirs += std::getenv("dev");
++        } else {
++          exportDirs += std::getenv("out");
++        }
++      } else {
++        exportDirs += std::getenv("out");
++      }
++      exportDirs += "/";
+     }
+     exportDirs += e;
+   }
+diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx
+index 4a3c565bce..5afa9e5e50 100644
+--- a/Source/cmExportInstallFileGenerator.cxx
++++ b/Source/cmExportInstallFileGenerator.cxx
+@@ -5,6 +5,7 @@
+ #include <memory>
+ #include <sstream>
+ #include <utility>
++#include <cstdlib>
+ 
+ #include "cmExportSet.h"
+ #include "cmGeneratedFileStream.h"
+@@ -263,7 +264,7 @@ void cmExportInstallFileGenerator::LoadConfigFiles(std::ostream& os)
+ 
+ void cmExportInstallFileGenerator::ReplaceInstallPrefix(std::string& input)
+ {
+-  cmGeneratorExpression::ReplaceInstallPrefix(input, "${_IMPORT_PREFIX}");
++  cmGeneratorExpression::ReplaceInstallPrefix(input, std::getenv("out"));
+ }
+ 
+ bool cmExportInstallFileGenerator::GenerateImportFileConfig(
+@@ -381,9 +382,24 @@ void cmExportInstallFileGenerator::SetImportLocationProperty(
+   // Construct the installed location of the target.
+   std::string dest = itgen->GetDestination(config);
+   std::string value;
++
+   if (!cmSystemTools::FileIsFullPath(dest)) {
+-    // The target is installed relative to the installation prefix.
+-    value = "${_IMPORT_PREFIX}/";
++    if (std::getenv("dev")) {
++      if (cmHasLiteralPrefix(dest, "include") || cmHasLiteralPrefix(dest, "./include")) {
++        value = std::getenv("dev");
++      } else if (cmHasLiteralPrefix(dest, "bin") || cmHasLiteralPrefix(dest, "./bin")) {
++        value = std::getenv("dev");
++      } else if (cmHasLiteralPrefix(dest, "mkspecs") || cmHasLiteralPrefix(dest, "./mkspecs")) {
++        value = std::getenv("dev");
++      } else if (cmHasLiteralPrefix(dest, "libexec") || cmHasLiteralPrefix(dest, "./libexec")) {
++        value = std::getenv("dev");
++      } else {
++        value = std::getenv("out");
++      }
++    } else {
++      value = std::getenv("out");
++    }
++    value += "/";
+   }
+   value += dest;
+   value += "/";
+diff --git a/Source/cmGeneratorExpression.cxx b/Source/cmGeneratorExpression.cxx
+index 840f5112d6..7bb4ab41aa 100644
+--- a/Source/cmGeneratorExpression.cxx
++++ b/Source/cmGeneratorExpression.cxx
+@@ -197,7 +197,22 @@ static void prefixItems(const std::string& content, std::string& result,
+     sep = ";";
+     if (!cmSystemTools::FileIsFullPath(e) &&
+         cmGeneratorExpression::Find(e) != 0) {
+-      result += prefix;
++      if (std::getenv("dev")) {
++        if (cmHasLiteralPrefix(e, "include") || cmHasLiteralPrefix(e, "./include")) {
++          result += std::getenv("dev");
++        } else if (cmHasLiteralPrefix(e, "bin") || cmHasLiteralPrefix(e, "./bin")) {
++          result += std::getenv("dev");
++        } else if (cmHasLiteralPrefix(e, "mkspecs") || cmHasLiteralPrefix(e, "./mkspecs")) {
++          result += std::getenv("dev");
++        } else if (cmHasLiteralPrefix(e, "libexec") || cmHasLiteralPrefix(e, "./libexec")) {
++          result += std::getenv("dev");
++        } else {
++          result += std::getenv("out");
++        }
++      } else {
++        result += std::getenv("out");
++      }
++      result += "/";
+     }
+     result += e;
+   }
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/default.nix b/nixpkgs/pkgs/development/libraries/qt-6/default.nix
new file mode 100644
index 000000000000..8c12cc2fb671
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/default.nix
@@ -0,0 +1,94 @@
+{ newScope
+, lib
+, stdenv
+, fetchurl
+, fetchgit
+, fetchpatch
+, fetchFromGitHub
+, makeSetupHook
+, makeWrapper
+, bison
+, cups
+, harfbuzz
+, libGL
+, perl
+, cmake
+, ninja
+, writeText
+, gstreamer
+, gst-plugins-base
+, gtk3
+, dconf
+, buildPackages
+
+  # options
+, developerBuild ? false
+, debug ? false
+}:
+
+let
+  srcs = import ./srcs.nix {
+    inherit fetchurl;
+    mirror = "mirror://qt";
+  };
+
+  qtModule =
+    import ./qtModule.nix
+      { inherit stdenv lib perl cmake ninja writeText; }
+      { inherit self srcs; };
+
+  addPackages = self: with self;
+    let
+      callPackage = self.newScope { inherit qtModule srcs; };
+    in
+    {
+
+      inherit callPackage qtModule srcs;
+
+      qtbase = callPackage ./modules/qtbase.nix {
+        withGtk3 = true;
+        inherit (srcs.qtbase) src version;
+        inherit bison cups harfbuzz libGL dconf gtk3 developerBuild cmake;
+      };
+
+      qt3d = callPackage ./modules/qt3d.nix { };
+      qt5compat = callPackage ./modules/qt5compat.nix { };
+      qtcharts = callPackage ./modules/qtcharts.nix { };
+      qtconnectivity = callPackage ./modules/qtconnectivity.nix { };
+      qtdatavis3d = callPackage ./modules/qtdatavis3d.nix { };
+      qtdeclarative = callPackage ./modules/qtdeclarative.nix { };
+      qtdoc = callPackage ./modules/qtdoc.nix { };
+      qtimageformats = callPackage ./modules/qtimageformats.nix { };
+      qtlanguageserver = callPackage ./modules/qtlanguageserver.nix { };
+      qtlottie = callPackage ./modules/qtlottie.nix { };
+      qtmultimedia = callPackage ./modules/qtmultimedia.nix {
+        inherit gstreamer gst-plugins-base;
+      };
+      qtnetworkauth = callPackage ./modules/qtnetworkauth.nix { };
+      qtpositioning = callPackage ./modules/qtpositioning.nix { };
+      qtsensors = callPackage ./modules/qtsensors.nix { };
+      qtserialbus = callPackage ./modules/qtserialbus.nix { };
+      qtserialport = callPackage ./modules/qtserialport.nix { };
+      qtshadertools = callPackage ./modules/qtshadertools.nix { };
+      qtquick3d = callPackage ./modules/qtquick3d.nix { };
+      qtquicktimeline = callPackage ./modules/qtquicktimeline.nix { };
+      qtremoteobjects = callPackage ./modules/qtremoteobjects.nix { };
+      qtsvg = callPackage ./modules/qtsvg.nix { };
+      qtscxml = callPackage ./modules/qtscxml.nix { };
+      qttools = callPackage ./modules/qttools.nix { };
+      qttranslations = callPackage ./modules/qttranslations.nix { };
+      qtvirtualkeyboard = callPackage ./modules/qtvirtualkeyboard.nix { };
+      qtwayland = callPackage ./modules/qtwayland.nix { };
+      qtwebchannel = callPackage ./modules/qtwebchannel.nix { };
+      qtwebengine = callPackage ./modules/qtwebengine.nix { };
+      qtwebsockets = callPackage ./modules/qtwebsockets.nix { };
+      qtwebview = callPackage ./modules/qtwebview.nix { };
+
+      wrapQtAppsHook = makeSetupHook {
+          deps = [ buildPackages.makeWrapper ];
+        } ./hooks/wrap-qt-apps-hook.sh;
+    };
+
+  self = lib.makeScope newScope addPackages;
+in
+self
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/fetch.sh b/nixpkgs/pkgs/development/libraries/qt-6/fetch.sh
new file mode 100644
index 000000000000..70c9cedb0987
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/fetch.sh
@@ -0,0 +1 @@
+WGET_ARGS=( http://download.qt.io/official_releases/qt/6.3/6.3.1/submodules/ -A '*.tar.xz' )
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/hooks/qtbase-setup-hook.sh b/nixpkgs/pkgs/development/libraries/qt-6/hooks/qtbase-setup-hook.sh
new file mode 100644
index 000000000000..0ae969e8f8fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/hooks/qtbase-setup-hook.sh
@@ -0,0 +1,43 @@
+if [[ -n "${__nix_qtbase-}" ]]; 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:"
+        echo >&2 "    @dev@"
+        echo >&2 "    $__nix_qtbase"
+        exit 1
+    fi
+else # Only set up Qt once.
+__nix_qtbase="@dev@"
+
+qtPluginPrefix=@qtPluginPrefix@
+qtQmlPrefix=@qtQmlPrefix@
+
+# Disable debug symbols if qtbase was built without debugging.
+# This stops -dev paths from leaking into other outputs.
+if [ -z "@debug@" ]; then
+    NIX_CFLAGS_COMPILE="${NIX_CFLAGS_COMPILE-}${NIX_CFLAGS_COMPILE:+ }-DQT_NO_DEBUG"
+fi
+
+# Integration with CMake:
+# Set the CMake build type corresponding to how qtbase was built.
+if [ -n "@debug@" ]; then
+    cmakeBuildType="Debug"
+else
+    cmakeBuildType="Release"
+fi
+
+qtPreHook() {
+    # Check that wrapQtAppsHook is used, or it is explicitly disabled.
+    if [[ -z "$__nix_wrapQtAppsHook" && -z "$dontWrapQtApps" ]]; then
+        echo >&2 "Error: wrapQtAppsHook is not used, and dontWrapQtApps is not set."
+        exit 1
+    fi
+}
+prePhases+=" qtPreHook"
+
+addQtModulePrefix () {
+    addToSearchPath QT_ADDITIONAL_PACKAGES_PREFIX_PATH $1
+}
+addEnvHooks "$hostOffset" addQtModulePrefix
+
+fi
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/hooks/wrap-qt-apps-hook.sh b/nixpkgs/pkgs/development/libraries/qt-6/hooks/wrap-qt-apps-hook.sh
new file mode 100644
index 000000000000..b669da3d058c
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/hooks/wrap-qt-apps-hook.sh
@@ -0,0 +1,110 @@
+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
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qt3d.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qt3d.nix
new file mode 100644
index 000000000000..2f3a45f67d85
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qt3d.nix
@@ -0,0 +1,12 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+, qtmultimedia
+, assimp
+}:
+
+qtModule {
+  pname = "qt3d";
+  qtInputs = [ qtbase qtdeclarative qtmultimedia ];
+  propagatedBuildInputs = [ assimp ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qt5compat.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qt5compat.nix
new file mode 100644
index 000000000000..cba0651a2c46
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qt5compat.nix
@@ -0,0 +1,13 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+, libiconv
+, icu
+, openssl
+}:
+
+qtModule {
+  pname = "qt5compat";
+  qtInputs = [ qtbase qtdeclarative ];
+  buildInputs = [ libiconv icu openssl openssl ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtbase.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtbase.nix
new file mode 100644
index 000000000000..bf210633fc4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtbase.nix
@@ -0,0 +1,222 @@
+{ stdenv
+, lib
+, src
+, patches ? [ ]
+, version
+, coreutils
+, bison
+, flex
+, gdb
+, gperf
+, lndir
+, perl
+, pkg-config
+, python3
+, which
+, cmake
+, ninja
+, ccache
+, xmlstarlet
+, libproxy
+, xlibsWrapper
+, xorg
+, zstd
+, double-conversion
+, util-linux
+, systemd
+, libb2
+, md4c
+, mtdev
+, lksctp-tools
+, libselinux
+, libsepol
+, vulkan-headers
+, vulkan-loader
+, valgrind
+, libthai
+, libdrm
+, libdatrie
+, lttng-ust
+, libepoxy
+, libiconv
+, dbus
+, fontconfig
+, freetype
+, glib
+, harfbuzz
+, icu
+, libX11
+, libXcomposite
+, libXcursor
+, libXext
+, libXi
+, libXrender
+, libinput
+, libjpeg
+, libpng
+, libxcb
+, libxkbcommon
+, libxml2
+, libxslt
+, openssl
+, pcre
+, pcre2
+, sqlite
+, udev
+, xcbutil
+, xcbutilimage
+, xcbutilkeysyms
+, xcbutilrenderutil
+, xcbutilwm
+, zlib
+, at-spi2-core
+, unixODBC
+, unixODBCDrivers
+  # optional dependencies
+, cups
+, libmysqlclient
+, postgresql
+, withGtk3 ? false
+, dconf
+, gtk3
+  # options
+, libGLSupported ? true
+, libGL
+, debug ? false
+, developerBuild ? false
+}:
+
+let
+  debugSymbols = debug || developerBuild;
+in
+stdenv.mkDerivation rec {
+  pname = "qtbase";
+
+  inherit src version;
+
+  debug = debugSymbols;
+
+  propagatedBuildInputs = [
+    libxml2
+    libxslt
+    openssl
+    sqlite
+    zlib
+    unixODBC
+    # Text rendering
+    harfbuzz
+    icu
+    # Image formats
+    libjpeg
+    libpng
+    pcre2
+    pcre
+    libproxy
+    xlibsWrapper
+    zstd
+    double-conversion
+    util-linux
+    systemd
+    libb2
+    md4c
+    mtdev
+    lksctp-tools
+    libselinux
+    libsepol
+    lttng-ust
+    vulkan-headers
+    vulkan-loader
+    libthai
+    libdrm
+    libdatrie
+    valgrind
+    dbus
+    glib
+    udev
+    # Text rendering
+    fontconfig
+    freetype
+    # X11 libs
+    libX11
+    libXcomposite
+    libXext
+    libXi
+    libXrender
+    libxcb
+    libxkbcommon
+    xcbutil
+    xcbutilimage
+    xcbutilkeysyms
+    xcbutilrenderutil
+    xcbutilwm
+    xorg.libXdmcp
+    xorg.libXtst
+    xorg.xcbutilcursor
+    libepoxy
+  ] ++ (with unixODBCDrivers; [
+    psql
+    sqlite
+    mariadb
+  ]) ++ lib.optional libGLSupported libGL;
+
+  buildInputs = [
+    python3
+    at-spi2-core
+    libinput
+  ]
+  ++ lib.optional withGtk3 gtk3
+  ++ lib.optional developerBuild gdb
+  ++ lib.optional (cups != null) cups
+  ++ lib.optional (libmysqlclient != null) libmysqlclient
+  ++ lib.optional (postgresql != null) postgresql;
+
+  nativeBuildInputs = [ bison flex gperf lndir perl pkg-config which cmake xmlstarlet ninja ];
+
+  propagatedNativeBuildInputs = [ lndir ];
+
+  enableParallelBuilding = true;
+
+  inherit patches;
+
+  # https://bugreports.qt.io/browse/QTBUG-97568
+  postPatch = ''
+    substituteInPlace src/corelib/CMakeLists.txt --replace /bin/ls ${coreutils}/bin/ls
+  '';
+
+  preConfigure = ''
+    export LD_LIBRARY_PATH="$PWD/build/lib:$PWD/build/plugins/platforms''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
+  '';
+
+  qtPluginPrefix = "lib/qt-6/plugins";
+  qtQmlPrefix = "lib/qt-6/qml";
+
+  cmakeFlags = [
+    "-DINSTALL_PLUGINSDIR=${qtPluginPrefix}"
+    "-DINSTALL_QMLDIR=${qtQmlPrefix}"
+    "-DQT_FEATURE_journald=ON"
+    "-DQT_FEATURE_sctp=ON"
+    "-DQT_FEATURE_libproxy=ON"
+    "-DQT_FEATURE_system_sqlite=ON"
+    "-DQT_FEATURE_vulkan=ON"
+    "-DQT_FEATURE_openssl_linked=ON"
+  ];
+
+  outputs = [ "out" "dev" ];
+
+  postInstall = ''
+    mkdir -p $dev
+    mv $out/mkspecs $out/bin $out/libexec $dev/
+  '';
+
+  dontStrip = debugSymbols;
+
+  setupHook = ../hooks/qtbase-setup-hook.sh;
+
+  meta = with lib; {
+    homepage = "https://www.qt.io/";
+    description = "A cross-platform application framework for C++";
+    license = with licenses; [ fdl13 gpl2 lgpl21 lgpl3 ];
+    maintainers = with maintainers; [ milahu nickcao ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtcharts.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtcharts.nix
new file mode 100644
index 000000000000..917697c38623
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtcharts.nix
@@ -0,0 +1,9 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+}:
+
+qtModule {
+  pname = "qtcharts";
+  qtInputs = [ qtbase qtdeclarative ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtconnectivity.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtconnectivity.nix
new file mode 100644
index 000000000000..33fbd7231548
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtconnectivity.nix
@@ -0,0 +1,15 @@
+{ qtModule
+, lib
+, stdenv
+, qtbase
+, qtdeclarative
+, bluez
+, pkg-config
+}:
+
+qtModule {
+  pname = "qtconnectivity";
+  qtInputs = [ qtbase qtdeclarative ];
+  buildInputs = [ bluez ];
+  nativeBuildInputs = [ pkg-config ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtdatavis3d.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtdatavis3d.nix
new file mode 100644
index 000000000000..1d0f9711e588
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtdatavis3d.nix
@@ -0,0 +1,9 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+}:
+
+qtModule {
+  pname = "qtdatavis3d";
+  qtInputs = [ qtbase qtdeclarative ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtdeclarative.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtdeclarative.nix
new file mode 100644
index 000000000000..3f691894ff86
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtdeclarative.nix
@@ -0,0 +1,19 @@
+{ qtModule
+, qtbase
+, qtshadertools
+, openssl
+, python3
+}:
+
+qtModule {
+  pname = "qtdeclarative";
+  qtInputs = [ qtbase qtshadertools ];
+  propagatedBuildInputs = [ openssl python3 ];
+  preConfigure = ''
+    export LD_LIBRARY_PATH="$PWD/build/lib''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
+  '';
+  postInstall = ''
+    substituteInPlace "$out/lib/cmake/Qt6Qml/Qt6QmlMacros.cmake" \
+      --replace ''\'''${QT6_INSTALL_PREFIX}' "$out"
+  '';
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtdoc.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtdoc.nix
new file mode 100644
index 000000000000..cde9af30ab93
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtdoc.nix
@@ -0,0 +1,9 @@
+{ qtModule
+, qtdeclarative
+}:
+
+qtModule {
+  pname = "qtdoc";
+  qtInputs = [ qtdeclarative ];
+  outputs = [ "out" ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtimageformats.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtimageformats.nix
new file mode 100644
index 000000000000..b28adbc7295b
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtimageformats.nix
@@ -0,0 +1,13 @@
+{ qtModule
+, qtbase
+, libwebp
+, jasper
+, libmng
+, libtiff
+}:
+
+qtModule {
+  pname = "qtimageformats";
+  qtInputs = [ qtbase ];
+  buildInputs = [ libwebp jasper libmng libtiff ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtlanguageserver.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtlanguageserver.nix
new file mode 100644
index 000000000000..b2e6e450d5f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtlanguageserver.nix
@@ -0,0 +1,8 @@
+{ qtModule
+, qtbase
+}:
+
+qtModule {
+  pname = "qtlanguageserver";
+  qtInputs = [ qtbase ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtlottie.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtlottie.nix
new file mode 100644
index 000000000000..d94c289953d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtlottie.nix
@@ -0,0 +1,9 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+}:
+
+qtModule {
+  pname = "qtlottie";
+  qtInputs = [ qtbase qtdeclarative ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtmultimedia.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtmultimedia.nix
new file mode 100644
index 000000000000..5e6dace906dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtmultimedia.nix
@@ -0,0 +1,24 @@
+{ qtModule
+, lib
+, stdenv
+, qtbase
+, qtdeclarative
+, qtshadertools
+, qtsvg
+, pkg-config
+, alsa-lib
+, gstreamer
+, gst-plugins-base
+, libpulseaudio
+, wayland
+, elfutils
+, libunwind
+, orc
+}:
+
+qtModule {
+  pname = "qtmultimedia";
+  qtInputs = [ qtbase qtdeclarative qtsvg qtshadertools ];
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ gstreamer gst-plugins-base libpulseaudio elfutils libunwind alsa-lib wayland orc ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtnetworkauth.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtnetworkauth.nix
new file mode 100644
index 000000000000..148ed890fc9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtnetworkauth.nix
@@ -0,0 +1,6 @@
+{ qtModule, qtbase }:
+
+qtModule {
+  pname = "qtnetworkauth";
+  qtInputs = [ qtbase ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtpositioning.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtpositioning.nix
new file mode 100644
index 000000000000..99b06bbf2536
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtpositioning.nix
@@ -0,0 +1,14 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+, qtserialport
+, pkg-config
+, openssl
+}:
+
+qtModule {
+  pname = "qtpositioning";
+  qtInputs = [ qtbase qtdeclarative qtserialport ];
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ openssl ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtquick3d.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtquick3d.nix
new file mode 100644
index 000000000000..d19a8e725a16
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtquick3d.nix
@@ -0,0 +1,11 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+, openssl
+}:
+
+qtModule {
+  pname = "qtquick3d";
+  qtInputs = [ qtbase qtdeclarative ];
+  buildInputs = [ openssl ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtquicktimeline.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtquicktimeline.nix
new file mode 100644
index 000000000000..7458515dba26
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtquicktimeline.nix
@@ -0,0 +1,9 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+}:
+
+qtModule {
+  pname = "qtquicktimeline";
+  qtInputs = [ qtbase qtdeclarative ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtremoteobjects.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtremoteobjects.nix
new file mode 100644
index 000000000000..888ec33b461a
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtremoteobjects.nix
@@ -0,0 +1,9 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+}:
+
+qtModule {
+  pname = "qtremoteobjects";
+  qtInputs = [ qtbase qtdeclarative ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtscxml.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtscxml.nix
new file mode 100644
index 000000000000..c49064c5e579
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtscxml.nix
@@ -0,0 +1,6 @@
+{ qtModule, qtbase, qtdeclarative }:
+
+qtModule {
+  pname = "qtscxml";
+  qtInputs = [ qtbase qtdeclarative ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtsensors.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtsensors.nix
new file mode 100644
index 000000000000..73ddc394cc46
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtsensors.nix
@@ -0,0 +1,10 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+, qtsvg
+}:
+
+qtModule {
+  pname = "qtsensors";
+  qtInputs = [ qtbase qtdeclarative qtsvg ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtserialbus.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtserialbus.nix
new file mode 100644
index 000000000000..4fd6d7cb83c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtserialbus.nix
@@ -0,0 +1,6 @@
+{ qtModule, qtbase, qtserialport }:
+
+qtModule {
+  pname = "qtserialbus";
+  qtInputs = [ qtbase qtserialport ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtserialport.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtserialport.nix
new file mode 100644
index 000000000000..96b7a25bb3b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtserialport.nix
@@ -0,0 +1,14 @@
+{ qtModule
+, stdenv
+, lib
+, qtbase
+, udev
+, pkg-config
+}:
+
+qtModule {
+  pname = "qtserialport";
+  qtInputs = [ qtbase ];
+  nativeBuildInputs = [ pkg-config ];
+  propagatedBuildInputs = [ udev ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtshadertools.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtshadertools.nix
new file mode 100644
index 000000000000..47102896f7e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtshadertools.nix
@@ -0,0 +1,8 @@
+{ qtModule
+, qtbase
+}:
+
+qtModule {
+  pname = "qtshadertools";
+  qtInputs = [ qtbase ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtsvg.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtsvg.nix
new file mode 100644
index 000000000000..9031f8805ac9
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtsvg.nix
@@ -0,0 +1,15 @@
+{ qtModule
+, qtbase
+, libwebp
+, jasper
+, libmng
+, zlib
+, pkg-config
+}:
+
+qtModule {
+  pname = "qtsvg";
+  qtInputs = [ qtbase ];
+  buildInputs = [ libwebp jasper libmng zlib ];
+  nativeBuildInputs = [ pkg-config ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qttools.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qttools.nix
new file mode 100644
index 000000000000..b1cf5dd2c146
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qttools.nix
@@ -0,0 +1,11 @@
+{ qtModule
+, stdenv
+, lib
+, qtbase
+, qtdeclarative
+}:
+
+qtModule {
+  pname = "qttools";
+  qtInputs = [ qtbase qtdeclarative ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qttranslations.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qttranslations.nix
new file mode 100644
index 000000000000..4795cd9e1bfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qttranslations.nix
@@ -0,0 +1,8 @@
+{ qtModule
+, qttools
+}:
+
+qtModule {
+  pname = "qttranslations";
+  qtInputs = [ qttools ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtvirtualkeyboard.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtvirtualkeyboard.nix
new file mode 100644
index 000000000000..bb868dc61829
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtvirtualkeyboard.nix
@@ -0,0 +1,15 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+, qtsvg
+, hunspell
+, pkg-config
+}:
+
+qtModule {
+  pname = "qtvirtualkeyboard";
+  qtInputs = [ qtbase qtdeclarative qtsvg ];
+  propagatedBuildInputs = [ hunspell ];
+  nativeBuildInputs = [ pkg-config ];
+  outputs = [ "out" ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwayland.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwayland.nix
new file mode 100644
index 000000000000..3ac23d28a798
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwayland.nix
@@ -0,0 +1,16 @@
+{ qtModule
+, qtbase
+, qtquick3d
+, qtdeclarative
+, wayland
+, pkg-config
+, xlibsWrapper
+, libdrm
+}:
+
+qtModule {
+  pname = "qtwayland";
+  qtInputs = [ qtbase qtdeclarative ];
+  buildInputs = [ wayland xlibsWrapper libdrm ];
+  nativeBuildInputs = [ pkg-config ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebchannel.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebchannel.nix
new file mode 100644
index 000000000000..49b959c5dea7
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebchannel.nix
@@ -0,0 +1,12 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+, qtwebsockets
+, openssl
+}:
+
+qtModule {
+  pname = "qtwebchannel";
+  qtInputs = [ qtbase qtdeclarative qtwebsockets ];
+  buildInputs = [ openssl ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebengine.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebengine.nix
new file mode 100644
index 000000000000..20cfab55d032
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebengine.nix
@@ -0,0 +1,237 @@
+{ qtModule
+, qtdeclarative
+, qtwebchannel
+, qtpositioning
+, qtwebsockets
+, buildPackages
+, bison
+, coreutils
+, flex
+, git
+, gperf
+, ninja
+, pkg-config
+, python3
+, which
+, nodejs
+, qtbase
+, perl
+, xorg
+, libXcursor
+, libXScrnSaver
+, libXrandr
+, libXtst
+, libxshmfence
+, libXi
+, fontconfig
+, freetype
+, harfbuzz
+, icu
+, dbus
+, libdrm
+, zlib
+, minizip
+, libjpeg
+, libpng
+, libtiff
+, libwebp
+, libopus
+, jsoncpp
+, protobuf
+, libvpx
+, srtp
+, snappy
+, nss
+, libevent
+, openssl
+, alsa-lib
+, pulseaudio
+, libcap
+, pciutils
+, systemd
+, pipewire
+, gn
+, cups
+, openbsm
+, runCommand
+, writeScriptBin
+, ffmpeg
+, lib
+, stdenv
+, glib
+, libxml2
+, libxslt
+, lcms2
+, re2
+, libkrb5
+, xkeyboard_config
+, enableProprietaryCodecs ? true
+}:
+
+qtModule rec {
+  pname = "qtwebengine";
+  qtInputs = [ qtdeclarative qtwebchannel qtwebsockets qtpositioning ];
+  nativeBuildInputs = [
+    bison
+    coreutils
+    flex
+    git
+    gperf
+    ninja
+    pkg-config
+    (python3.withPackages (ps: with ps; [ html5lib ]))
+    which
+    gn
+    nodejs
+  ];
+  doCheck = true;
+  outputs = [ "out" "dev" ];
+
+  dontUseGnConfigure = true;
+
+  # ninja builds some components with -Wno-format,
+  # which cannot be set at the same time as -Wformat-security
+  hardeningDisable = [ "format" ];
+
+  postPatch = ''
+    # Patch Chromium build tools
+    (
+      cd src/3rdparty/chromium;
+
+      # Manually fix unsupported shebangs
+      substituteInPlace third_party/harfbuzz-ng/src/src/update-unicode-tables.make \
+        --replace "/usr/bin/env -S make -f" "/usr/bin/make -f" || true
+      substituteInPlace third_party/webgpu-cts/src/tools/deno \
+        --replace "/usr/bin/env -S deno" "/usr/bin/deno" || true
+      patchShebangs .
+    )
+
+    substituteInPlace cmake/Functions.cmake \
+      --replace "/bin/bash" "${buildPackages.bash}/bin/bash"
+
+    sed -i -e '/lib_loader.*Load/s!"\(libudev\.so\)!"${lib.getLib systemd}/lib/\1!' \
+      src/3rdparty/chromium/device/udev_linux/udev?_loader.cc
+
+    sed -i -e '/libpci_loader.*Load/s!"\(libpci\.so\)!"${pciutils}/lib/\1!' \
+      src/3rdparty/chromium/gpu/config/gpu_info_collector_linux.cc
+
+    substituteInPlace src/3rdparty/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc \
+      --replace "/usr/share/X11/xkb" "${xkeyboard_config}/share/X11/xkb"
+
+    # Patch library paths in sources
+    substituteInPlace src/core/web_engine_library_info.cpp \
+      --replace "QLibraryInfo::path(QLibraryInfo::DataPath)" "\"$out\"" \
+      --replace "QLibraryInfo::path(QLibraryInfo::TranslationsPath)" "\"$out/translations\"" \
+      --replace "QLibraryInfo::path(QLibraryInfo::LibraryExecutablesPath)" "\"$out/libexec\""
+  '';
+
+  cmakeFlags = [
+    "-DQT_FEATURE_qtpdf_build=ON"
+    "-DQT_FEATURE_qtpdf_widgets_build=ON"
+    "-DQT_FEATURE_qtpdf_quick_build=ON"
+    "-DQT_FEATURE_pdf_v8=ON"
+    "-DQT_FEATURE_pdf_xfa=ON"
+    "-DQT_FEATURE_pdf_xfa_bmp=ON"
+    "-DQT_FEATURE_pdf_xfa_gif=ON"
+    "-DQT_FEATURE_pdf_xfa_png=ON"
+    "-DQT_FEATURE_pdf_xfa_tiff=ON"
+    "-DQT_FEATURE_webengine_system_icu=ON"
+    "-DQT_FEATURE_webengine_system_libevent=ON"
+    "-DQT_FEATURE_webengine_system_libxml=ON"
+    "-DQT_FEATURE_webengine_system_ffmpeg=ON"
+    # android only. https://bugreports.qt.io/browse/QTBUG-100293
+    # "-DQT_FEATURE_webengine_native_spellchecker=ON"
+    "-DQT_FEATURE_webengine_sanitizer=ON"
+    "-DQT_FEATURE_webengine_webrtc_pipewire=ON"
+    "-DQT_FEATURE_webengine_kerberos=ON"
+  ] ++ lib.optional enableProprietaryCodecs "-DQT_FEATURE_webengine_proprietary_codecs=ON";
+
+  propagatedBuildInputs = [
+    # Image formats
+    libjpeg
+    libpng
+    libtiff
+    libwebp
+
+    # Video formats
+    srtp
+    libvpx
+
+    # Audio formats
+    libopus
+
+    # Text rendering
+    harfbuzz
+    icu
+
+    openssl
+    glib
+    libxml2
+    libxslt
+    lcms2
+    re2
+
+    libevent
+    ffmpeg
+
+    dbus
+    zlib
+    minizip
+    snappy
+    nss
+    protobuf
+    jsoncpp
+
+    # Audio formats
+    alsa-lib
+    pulseaudio
+
+    # Text rendering
+    fontconfig
+    freetype
+
+    libcap
+    pciutils
+
+    # X11 libs
+    xorg.xrandr
+    libXScrnSaver
+    libXcursor
+    libXrandr
+    xorg.libpciaccess
+    libXtst
+    xorg.libXcomposite
+    xorg.libXdamage
+    libdrm
+    xorg.libxkbfile
+    libxshmfence
+    libXi
+    xorg.libXext
+
+    # Pipewire
+    pipewire
+
+    libkrb5
+  ];
+
+  buildInputs = [
+    cups
+  ];
+
+  requiredSystemFeatures = [ "big-parallel" ];
+
+  postInstall = ''
+    # This is required at runtime
+    mkdir $out/libexec
+    mv $dev/libexec/QtWebEngineProcess $out/libexec
+  '';
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    description = "A web engine based on the Chromium web browser";
+    platforms = platforms.linux;
+    # This build takes a long time; particularly on slow architectures
+    # 1 hour on 32x3.6GHz -> maybe 12 hours on 4x2.4GHz
+    timeout = 24 * 3600;
+  };
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebsockets.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebsockets.nix
new file mode 100644
index 000000000000..f81cd64596eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebsockets.nix
@@ -0,0 +1,11 @@
+{ qtModule
+, qtbase
+, qtdeclarative
+, openssl
+}:
+
+qtModule {
+  pname = "qtwebsockets";
+  qtInputs = [ qtbase qtdeclarative ];
+  buildInputs = [ openssl ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebview.nix b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebview.nix
new file mode 100644
index 000000000000..ba784f73ad45
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/modules/qtwebview.nix
@@ -0,0 +1,11 @@
+{ lib
+, stdenv
+, qtModule
+, qtdeclarative
+, qtwebengine
+}:
+
+qtModule {
+  pname = "qtwebview";
+  qtInputs = [ qtdeclarative qtwebengine ];
+}
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/qtModule.nix b/nixpkgs/pkgs/development/libraries/qt-6/qtModule.nix
new file mode 100644
index 000000000000..04349ed68ad2
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/qtModule.nix
@@ -0,0 +1,45 @@
+{ stdenv, lib, perl, cmake, ninja, writeText }:
+
+{ self, srcs, patches ? [ ] }:
+
+args:
+
+let
+  inherit (args) pname;
+  version = args.version or srcs.${pname}.version;
+  src = args.src or srcs.${pname}.src;
+in
+stdenv.mkDerivation (args // {
+  inherit pname version src;
+  patches = args.patches or patches.${pname} or [ ];
+
+  buildInputs = args.buildInputs or [ ];
+  nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [
+    perl
+    cmake
+    ninja
+  ];
+  propagatedBuildInputs = args.qtInputs ++ (args.propagatedBuildInputs or [ ]);
+
+  outputs = args.outputs or [ "out" "dev" ];
+
+  dontWrapQtApps = args.dontWrapQtApps or true;
+  postInstall = ''
+    if [ ! -z "$dev" ]; then
+      mkdir "$dev"
+      for dir in bin libexec mkspecs
+      do
+        moveToOutput "$dir" "$dev"
+      done
+    fi
+    ${args.postInstall or ""}
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.qt.io/";
+    description = "A cross-platform application framework for C++";
+    license = with licenses; [ fdl13 gpl2 lgpl21 lgpl3 ];
+    maintainers = with maintainers; [ milahu nickcao ];
+    platforms = platforms.linux;
+  } // (args.meta or { });
+})
diff --git a/nixpkgs/pkgs/development/libraries/qt-6/srcs.nix b/nixpkgs/pkgs/development/libraries/qt-6/srcs.nix
new file mode 100644
index 000000000000..07bb7fd494f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/qt-6/srcs.nix
@@ -0,0 +1,262 @@
+# DO NOT EDIT! This file is generated automatically.
+# Command: ./maintainers/scripts/fetch-kde-qt.sh pkgs/development/libraries/qt-6
+{ fetchurl, mirror }:
+
+{
+  qt3d = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qt3d-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1zpdafqm82hd2bijw20hi1ng81xwihsn9mm7n5ns4gr5zdnvc6cr";
+      name = "qt3d-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qt5compat = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qt5compat-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1zbcaswpl79ixcxzj85qzjq73962s4c7316pibwfrskqswmwcgm4";
+      name = "qt5compat-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtactiveqt = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtactiveqt-everywhere-src-6.3.1.tar.xz";
+      sha256 = "0axygqjqny6vjwmc5swn80xrcs97bcjwgxsg81f35srxpn9lxdb4";
+      name = "qtactiveqt-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtbase = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtbase-everywhere-src-6.3.1.tar.xz";
+      sha256 = "00sfya41ihqb0zwg6wf1kiy02iymj6mk584hhk2c4s94khfl4r0a";
+      name = "qtbase-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtcharts = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtcharts-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1xvwsabyfln3sih9764xknl2s3w4w069k210kgbh94bj50iwqc7k";
+      name = "qtcharts-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtconnectivity = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtconnectivity-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1c4mnrl7fa8j8fmv5zbqak48nylhxpib7vmsbmmbqqcw19qy8p5j";
+      name = "qtconnectivity-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtdatavis3d = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtdatavis3d-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1wm8iigpml84zfkw3mb2kll0imszc2y19hkcfwq1wbr9w24xda43";
+      name = "qtdatavis3d-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtdeclarative = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtdeclarative-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1s268fha3650dn1lqxf8jfa07wxpw09f6p7rjyiwq3w24d0nkrq3";
+      name = "qtdeclarative-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtdoc = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtdoc-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1qvhv2b9c6mz7r3sdx0l81a2jr9qri17y1y8k3d6qh488fxqrk32";
+      name = "qtdoc-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtimageformats = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtimageformats-everywhere-src-6.3.1.tar.xz";
+      sha256 = "0br1vqgx0hcc2nx32xviic94mvj6fbagrnzskdr7zdmvvyw140xd";
+      name = "qtimageformats-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtlanguageserver = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtlanguageserver-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1g2azb4mdzh5zp7xc57g8l2a8wfi44wfjm6js88q4mmchyj4f4br";
+      name = "qtlanguageserver-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtlottie = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtlottie-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1x8wmc6gwmxk92zjcsrbhrbqbfvnk7302ggghld5wk8jk5lsf2vl";
+      name = "qtlottie-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtmultimedia = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtmultimedia-everywhere-src-6.3.1.tar.xz";
+      sha256 = "0dkk3lmzi2fs13cnj8q1lpcs6gghj219826gkwnzyd6nmlm280vy";
+      name = "qtmultimedia-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtnetworkauth = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtnetworkauth-everywhere-src-6.3.1.tar.xz";
+      sha256 = "0apvsb2ip1m3kw8vi9spvf6f6q72ys8vr40rpyysi7shsjwm83yn";
+      name = "qtnetworkauth-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtpositioning = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtpositioning-everywhere-src-6.3.1.tar.xz";
+      sha256 = "0v78wamvdw02kf9rq7m5v24q2g6jmgq4ch0fnfa014p1r978wy06";
+      name = "qtpositioning-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtquick3d = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtquick3d-everywhere-src-6.3.1.tar.xz";
+      sha256 = "0mhj0r6081bjkq3fsr1vh43zn587v9m20mdpnc979h5q8zp6d9rg";
+      name = "qtquick3d-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtquicktimeline = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtquicktimeline-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1gpb51d8r707sr0dnvbz65d4zwisfdw40s10kximaxwfrvq3r8aq";
+      name = "qtquicktimeline-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtremoteobjects = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtremoteobjects-everywhere-src-6.3.1.tar.xz";
+      sha256 = "19jcxxxj3q8vnf9cbgrp3q1pvgwsln8n16nk1gg822f6265h6vga";
+      name = "qtremoteobjects-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtscxml = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtscxml-everywhere-src-6.3.1.tar.xz";
+      sha256 = "06c6dwwx3z26k9ff6nqagg70lws4l1c6drz1yi4z1lb3c56ibg01";
+      name = "qtscxml-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtsensors = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtsensors-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1k301lgbiw3fiyryfr18k0dq89ls4xgs4n2pffs456msxmchn92b";
+      name = "qtsensors-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtserialbus = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtserialbus-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1lkqv3r66fiddxbg0fv9w6l83adz3y8zq6i4pmd0hnxs0ivkz580";
+      name = "qtserialbus-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtserialport = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtserialport-everywhere-src-6.3.1.tar.xz";
+      sha256 = "0vk17cjj9jpdkgd8qwb1x0lijg0p2jxdzx4d67hd57brcl7didjf";
+      name = "qtserialport-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtshadertools = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtshadertools-everywhere-src-6.3.1.tar.xz";
+      sha256 = "0nj35s2z5n438q7nqf6bnj3slwz2am3169ck1ixwqa0mjrv73dsr";
+      name = "qtshadertools-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtsvg = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtsvg-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1xvxz2jfpr1al85rhwss7ji5vkxa812d0b888hry5f7pwqcg86bv";
+      name = "qtsvg-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qttools = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qttools-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1h96w4bzkbd80vr7lh6hnypdlmbzc1y52c2zrqzvkgm3587pa4n4";
+      name = "qttools-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qttranslations = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qttranslations-everywhere-src-6.3.1.tar.xz";
+      sha256 = "15yvvxw1vngnjlly6cady05ljamg01qiaqn2vh0xkph855gdbgfp";
+      name = "qttranslations-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtvirtualkeyboard = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtvirtualkeyboard-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1f62q0gkz21nraaspy1nrg2ygjih5qgq37qns06snnfq0jr8kq2z";
+      name = "qtvirtualkeyboard-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtwayland = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtwayland-everywhere-src-6.3.1.tar.xz";
+      sha256 = "1w60p1did7awdlzq5k8vnq2ncpskb07cpvz31cbv99bjs6igw53g";
+      name = "qtwayland-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtwebchannel = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtwebchannel-everywhere-src-6.3.1.tar.xz";
+      sha256 = "0s16zx3qn3byldvhmsnwijm8rmizk8vpqj7fnwhjg6c67z10m8ma";
+      name = "qtwebchannel-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtwebengine = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtwebengine-everywhere-src-6.3.1.tar.xz";
+      sha256 = "0ivfsqd5c0cxsnssj6z37901cf6a47w50zaqgjiysvcm3ar36ymd";
+      name = "qtwebengine-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtwebsockets = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtwebsockets-everywhere-src-6.3.1.tar.xz";
+      sha256 = "06hj0pkdzjicmbiinjp1dk1ziz8cb3fgcwy7a0dxxjvzr680v64z";
+      name = "qtwebsockets-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+  qtwebview = {
+    version = "6.3.1";
+    src = fetchurl {
+      url = "${mirror}/official_releases/qt/6.3/6.3.1/submodules/qtwebview-everywhere-src-6.3.1.tar.xz";
+      sha256 = "0f4hx3rqwg5wqnw37nrhcvi2fxshgfx72xmdc416j4gxhra1i6xl";
+      name = "qtwebview-everywhere-src-6.3.1.tar.xz";
+    };
+  };
+}