summary refs log tree commit diff
path: root/pkgs/desktops
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/desktops')
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/attica.nix11
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/baloo.nix25
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/bluez-qt.nix17
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/breeze-icons.nix10
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/default.nix121
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/default.nix20
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/nix-lib-path.patch37
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/series1
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/setup-hook.sh80
-rwxr-xr-xpkgs/desktops/kde-5/frameworks-5.21/fetchsrcs.sh57
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/frameworkintegration.nix17
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kactivities-stats.nix9
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kactivities.nix19
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kapidox.nix12
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/karchive.nix11
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kauth/cmake-install-paths.patch17
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kauth/default.nix16
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kauth/kauth-policy-install.patch13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kauth/series1
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kbookmarks.nix25
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kcmutils/0001-qdiriterator-follow-symlinks.patch25
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kcmutils/default.nix17
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kcodecs.nix11
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kcompletion.nix14
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kconfig.nix16
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kconfigwidgets/0001-qdiriterator-follow-symlinks.patch25
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kconfigwidgets/default.nix18
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kcoreaddons.nix16
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kcrash.nix16
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdbusaddons.nix17
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdeclarative.nix22
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kded.nix19
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support.nix32
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/default.nix36
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/nix-kde-include-dir.patch13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/series1
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/setup-hook.sh1
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdesignerplugin.nix34
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdesu.nix13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdewebkit.nix13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdnssd.nix13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdoctools/default.nix19
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdoctools/kdoctools-no-find-docbook-xml.patch12
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kdoctools/setup-hook.sh5
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kemoticons.nix17
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata.nix13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata/cmake-install-paths.patch13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata/default.nix14
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata/series1
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kglobalaccel.nix23
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kguiaddons.nix13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/khtml.nix21
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/ki18n.nix17
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kiconthemes/default-theme-breeze.patch13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kiconthemes/default.nix18
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kiconthemes/series1
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kidletime.nix15
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kimageformats.nix13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kinit/default.nix17
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kinit/kinit-libpath.patch34
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kinit/series1
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kio/default.nix33
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kio/samba-search-path.patch28
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kio/series1
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kitemmodels.nix11
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kitemviews.nix11
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kjobwidgets.nix16
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kjs.nix16
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kjsembed.nix17
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kmediaplayer.nix15
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/knewstuff.nix17
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/knotifications.nix21
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/knotifyconfig.nix13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kpackage/allow-external-paths.patch13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kpackage/default.nix23
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kpackage/qdiriterator-follow-symlinks.patch26
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kpackage/series2
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kparts.nix17
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kpeople.nix15
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kplotting.nix11
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kpty.nix10
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kross.nix14
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/krunner.nix16
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kservice/0001-qdiriterator-follow-symlinks.patch25
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kservice/0002-no-canonicalize-path.patch25
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kservice/default.nix18
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kservice/setup-hook.sh43
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/ktexteditor/default.nix22
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/ktexteditor/no-qcoreapplication.patch36
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/ktexteditor/series1
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/ktextwidgets.nix16
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kunitconversion.nix10
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kwallet.nix21
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kwidgetsaddons.nix11
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kwindowsystem.nix13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kxmlgui.nix18
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/kxmlrpcclient.nix10
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/modemmanager-qt.nix13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/networkmanager-qt.nix13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/oxygen-icons5.nix13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/plasma-framework/default.nix25
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/solid.nix17
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/sonnet.nix13
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/srcs.nix573
-rw-r--r--pkgs/desktops/kde-5/frameworks-5.21/threadweaver.nix11
105 files changed, 2464 insertions, 0 deletions
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/attica.nix b/pkgs/desktops/kde-5/frameworks-5.21/attica.nix
new file mode 100644
index 00000000000..98721876c12
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/attica.nix
@@ -0,0 +1,11 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+}:
+
+kdeFramework {
+  name = "attica";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/baloo.nix b/pkgs/desktops/kde-5/frameworks-5.21/baloo.nix
new file mode 100644
index 00000000000..38c41d9271d
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/baloo.nix
@@ -0,0 +1,25 @@
+{ kdeFramework, lib, extra-cmake-modules, kauth, kconfig
+, kcoreaddons, kcrash, kdbusaddons, kfilemetadata, ki18n, kidletime
+, kio, lmdb, makeQtWrapper, qtbase, qtquick1, solid
+}:
+
+kdeFramework {
+  name = "baloo";
+  nativeBuildInputs = [ extra-cmake-modules makeQtWrapper ];
+  buildInputs = [
+    kconfig kcrash kdbusaddons lmdb qtquick1 solid
+  ];
+  propagatedBuildInputs = [
+    kauth kcoreaddons kfilemetadata ki18n kio kidletime qtbase
+  ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/baloo_file"
+    wrapQtProgram "$out/bin/baloo_file_extractor"
+    wrapQtProgram "$out/bin/balooctl"
+    wrapQtProgram "$out/bin/baloosearch"
+    wrapQtProgram "$out/bin/balooshow"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/bluez-qt.nix b/pkgs/desktops/kde-5/frameworks-5.21/bluez-qt.nix
new file mode 100644
index 00000000000..f981b0516f7
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/bluez-qt.nix
@@ -0,0 +1,17 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, qtdeclarative
+}:
+
+kdeFramework {
+  name = "bluez-qt";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ qtdeclarative ];
+  preConfigure = ''
+    substituteInPlace CMakeLists.txt \
+      --replace /lib/udev/rules.d "$out/lib/udev/rules.d"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/breeze-icons.nix b/pkgs/desktops/kde-5/frameworks-5.21/breeze-icons.nix
new file mode 100644
index 00000000000..44cc99daf26
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/breeze-icons.nix
@@ -0,0 +1,10 @@
+{ kdeFramework
+, extra-cmake-modules
+, qtsvg
+}:
+
+kdeFramework {
+  name = "breeze-icons";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ qtsvg ];
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/default.nix
new file mode 100644
index 00000000000..e88538a78b3
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/default.nix
@@ -0,0 +1,121 @@
+# Maintainer's Notes:
+#
+# Minor updates:
+#  1. Edit ./fetchsrcs.sh to point to the updated URL.
+#  2. Run ./fetchsrcs.sh.
+#  3. Build and enjoy.
+#
+# Major updates:
+#  We prefer not to immediately overwrite older versions with major updates, so
+#  make a copy of this directory first. After copying, be sure to delete ./tmp
+#  if it exists. Then follow the minor update instructions. Be sure to check if
+#  any new components have been added and package them as necessary.
+
+{ pkgs, debug ? false }:
+
+let
+
+  inherit (pkgs) lib makeSetupHook stdenv;
+
+  mirror = "mirror://kde";
+  srcs = import ./srcs.nix { inherit (pkgs) fetchurl; inherit mirror; };
+
+  packages = self: with self; {
+    kdeFramework = args:
+      let
+        inherit (args) name;
+        inherit (srcs."${name}") src version;
+      in stdenv.mkDerivation (args // {
+        name = "${name}-${version}";
+        inherit src;
+
+        outputs = args.outputs or [ "dev" "out" ];
+
+        cmakeFlags =
+          (args.cmakeFlags or [])
+          ++ [ "-DBUILD_TESTING=OFF" ]
+          ++ lib.optional debug "-DCMAKE_BUILD_TYPE=Debug";
+
+        meta = {
+          license = with lib.licenses; [
+            lgpl21Plus lgpl3Plus bsd2 mit gpl2Plus gpl3Plus fdl12
+          ];
+          platforms = lib.platforms.linux;
+          homepage = "http://www.kde.org";
+        } // (args.meta or {});
+      });
+
+    attica = callPackage ./attica.nix {};
+    baloo = callPackage ./baloo.nix {};
+    bluez-qt = callPackage ./bluez-qt.nix {};
+    breeze-icons = callPackage ./breeze-icons.nix {};
+    extra-cmake-modules = callPackage ./extra-cmake-modules {};
+    frameworkintegration = callPackage ./frameworkintegration.nix {};
+    kactivities = callPackage ./kactivities.nix {};
+    kactivities-stats = callPackage ./kactivities-stats.nix {};
+    kapidox = callPackage ./kapidox.nix {};
+    karchive = callPackage ./karchive.nix {};
+    kauth = callPackage ./kauth {};
+    kbookmarks = callPackage ./kbookmarks.nix {};
+    kcmutils = callPackage ./kcmutils {};
+    kcodecs = callPackage ./kcodecs.nix {};
+    kcompletion = callPackage ./kcompletion.nix {};
+    kconfig = callPackage ./kconfig.nix {};
+    kconfigwidgets = callPackage ./kconfigwidgets {};
+    kcoreaddons = callPackage ./kcoreaddons.nix {};
+    kcrash = callPackage ./kcrash.nix {};
+    kdbusaddons = callPackage ./kdbusaddons.nix {};
+    kdeclarative = callPackage ./kdeclarative.nix {};
+    kded = callPackage ./kded.nix {};
+    kdelibs4support = callPackage ./kdelibs4support {};
+    kdesignerplugin = callPackage ./kdesignerplugin.nix {};
+    kdesu = callPackage ./kdesu.nix {};
+    kdewebkit = callPackage ./kdewebkit.nix {};
+    kdnssd = callPackage ./kdnssd.nix {};
+    kdoctools = callPackage ./kdoctools {};
+    kemoticons = callPackage ./kemoticons.nix {};
+    kfilemetadata = callPackage ./kfilemetadata {};
+    kglobalaccel = callPackage ./kglobalaccel.nix {};
+    kguiaddons = callPackage ./kguiaddons.nix {};
+    khtml = callPackage ./khtml.nix {};
+    ki18n = callPackage ./ki18n.nix {};
+    kiconthemes = callPackage ./kiconthemes {};
+    kidletime = callPackage ./kidletime.nix {};
+    kimageformats = callPackage ./kimageformats.nix {};
+    kinit = callPackage ./kinit {};
+    kio = callPackage ./kio {};
+    kitemmodels = callPackage ./kitemmodels.nix {};
+    kitemviews = callPackage ./kitemviews.nix {};
+    kjobwidgets = callPackage ./kjobwidgets.nix {};
+    kjs = callPackage ./kjs.nix {};
+    kjsembed = callPackage ./kjsembed.nix {};
+    kmediaplayer = callPackage ./kmediaplayer.nix {};
+    knewstuff = callPackage ./knewstuff.nix {};
+    knotifications = callPackage ./knotifications.nix {};
+    knotifyconfig = callPackage ./knotifyconfig.nix {};
+    kpackage = callPackage ./kpackage {};
+    kparts = callPackage ./kparts.nix {};
+    kpeople = callPackage ./kpeople.nix {};
+    kplotting = callPackage ./kplotting.nix {};
+    kpty = callPackage ./kpty.nix {};
+    kross = callPackage ./kross.nix {};
+    krunner = callPackage ./krunner.nix {};
+    kservice = callPackage ./kservice {};
+    ktexteditor = callPackage ./ktexteditor {};
+    ktextwidgets = callPackage ./ktextwidgets.nix {};
+    kunitconversion = callPackage ./kunitconversion.nix {};
+    kwallet = callPackage ./kwallet.nix {};
+    kwidgetsaddons = callPackage ./kwidgetsaddons.nix {};
+    kwindowsystem = callPackage ./kwindowsystem.nix {};
+    kxmlgui = callPackage ./kxmlgui.nix {};
+    kxmlrpcclient = callPackage ./kxmlrpcclient.nix {};
+    modemmanager-qt = callPackage ./modemmanager-qt.nix {};
+    networkmanager-qt = callPackage ./networkmanager-qt.nix {};
+    oxygen-icons5 = callPackage ./oxygen-icons5.nix {};
+    plasma-framework = callPackage ./plasma-framework {};
+    solid = callPackage ./solid.nix {};
+    sonnet = callPackage ./sonnet.nix {};
+    threadweaver = callPackage ./threadweaver.nix {};
+  };
+
+in packages
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/default.nix
new file mode 100644
index 00000000000..1c2ea70442d
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/default.nix
@@ -0,0 +1,20 @@
+{ kdeFramework, lib, copyPathsToStore, cmake, pkgconfig, qttools }:
+
+kdeFramework {
+  name = "extra-cmake-modules";
+
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+
+  outputs = [ "out" ];  # this package has no runtime components
+  setupHook = ./setup-hook.sh;
+
+  # It is OK to propagate these inputs as long as
+  # extra-cmake-modules is never a propagated input
+  # of some other derivation.
+  propagatedNativeBuildInputs = [ cmake pkgconfig qttools ];
+
+  meta = with lib; {
+    license = licenses.bsd2;
+    maintainers = [ maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/nix-lib-path.patch b/pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/nix-lib-path.patch
new file mode 100644
index 00000000000..a74340a6dc9
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/nix-lib-path.patch
@@ -0,0 +1,37 @@
+Index: extra-cmake-modules-5.18.0/kde-modules/KDEInstallDirs.cmake
+===================================================================
+--- extra-cmake-modules-5.18.0.orig/kde-modules/KDEInstallDirs.cmake
++++ extra-cmake-modules-5.18.0/kde-modules/KDEInstallDirs.cmake
+@@ -200,32 +200,6 @@
+ # GNUInstallDirs code deals with re-configuring, but that is dealt with
+ # by the _define_* macros in this module).
+ set(_LIBDIR_DEFAULT "lib")
+-# Override this default 'lib' with 'lib64' iff:
+-#  - we are on a Linux, kFreeBSD or Hurd system but NOT cross-compiling
+-#  - we are NOT on debian
+-#  - we are on a 64 bits system
+-# reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf
+-# For Debian with multiarch, use 'lib/${CMAKE_LIBRARY_ARCHITECTURE}' if
+-# CMAKE_LIBRARY_ARCHITECTURE is set (which contains e.g. "i386-linux-gnu"
+-# See http://wiki.debian.org/Multiarch
+-if((CMAKE_SYSTEM_NAME MATCHES "Linux|kFreeBSD" OR CMAKE_SYSTEM_NAME STREQUAL "GNU")
+-   AND NOT CMAKE_CROSSCOMPILING)
+-  if (EXISTS "/etc/debian_version") # is this a debian system ?
+-    if(CMAKE_LIBRARY_ARCHITECTURE)
+-      set(_LIBDIR_DEFAULT "lib/${CMAKE_LIBRARY_ARCHITECTURE}")
+-    endif()
+-  else() # not debian, rely on CMAKE_SIZEOF_VOID_P:
+-    if(NOT DEFINED CMAKE_SIZEOF_VOID_P)
+-      message(AUTHOR_WARNING
+-        "Unable to determine default LIB_INSTALL_LIBDIR directory because no target architecture is known. "
+-        "Please enable at least one language before including KDEInstallDirs.")
+-    else()
+-      if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
+-        set(_LIBDIR_DEFAULT "lib64")
+-      endif()
+-    endif()
+-  endif()
+-endif()
+ 
+ set(_gnu_install_dirs_vars
+     BINDIR
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/series b/pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/series
new file mode 100644
index 00000000000..b4569e50a5f
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/series
@@ -0,0 +1 @@
+nix-lib-path.patch
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/setup-hook.sh b/pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/setup-hook.sh
new file mode 100644
index 00000000000..193cb048949
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/extra-cmake-modules/setup-hook.sh
@@ -0,0 +1,80 @@
+_ecmSetXdgDirs() {
+    addToSearchPathOnce XDG_DATA_DIRS "$1/share"
+    addToSearchPathOnce XDG_CONFIG_DIRS "$1/etc/xdg"
+    addToSearchPathOnce NIX_WRAP_XDG_CONFIG_DIRS "$1/etc/xdg"
+}
+
+_ecmPropagateSharedData() {
+    local sharedPaths=( \
+        "config.cfg" \
+        "kconf_update" \
+        "kservices5" \
+        "kservicetypes5" \
+        "kxmlgui5" \
+        "knotifications5" \
+        "icons" \
+        "sounds" \
+        "templates" \
+        "wallpapers" \
+        "applications" \
+        "desktop-directories" \
+        "mime" \
+        "dbus-1" \
+        "interfaces" \
+        "services" \
+        "system-services" )
+    for dir in ${sharedPaths[@]}; do
+        if [ -d "$1/share/$dir" ]; then
+            addToSearchPathOnce NIX_WRAP_XDG_DATA_DIRS "$1/share"
+            propagateOnce propagatedBuildInputs "$1"
+            propagateOnce propagatedUserEnvPkgs "$1"
+            break
+        fi
+    done
+}
+
+_ecmConfig() {
+    # 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_CMAKEPACKAGEDIR=${!outputDev}/lib/cmake"
+    cmakeFlags+=" -DKDE_INSTALL_QTPLUGINDIR=${!outputLib}/lib/qt5/plugins"
+    cmakeFlags+=" -DKDE_INSTALL_PLUGINDIR=${!outputLib}/lib/qt5/plugins"
+    cmakeFlags+=" -DKDE_INSTALL_QTQUICKIMPORTSDIR=${!outputLib}/lib/qt5/imports"
+    cmakeFlags+=" -DKDE_INSTALL_QMLDIR=${!outputLib}/lib/qt5/qml"
+    cmakeFlags+=" -DKDE_INSTALL_INCLUDEDIR=${!outputInclude}/include"
+    cmakeFlags+=" -DKDE_INSTALL_LOCALSTATEDIR=/var"
+    cmakeFlags+=" -DKDE_INSTALL_DATAROOTDIR=${!outputLib}/share"
+    cmakeFlags+=" -DKDE_INSTALL_DATADIR=${!outputLib}/share"
+    cmakeFlags+=" -DKDE_INSTALL_DOCBUNDLEDIR=${!outputLib}/share/doc/HTML"
+    cmakeFlags+=" -DKDE_INSTALL_KCFGDIR=${!outputLib}/share/config.kcfg"
+    cmakeFlags+=" -DKDE_INSTALL_KCONFUPDATEDIR=${!outputLib}/share/kconf_update"
+    cmakeFlags+=" -DKDE_INSTALL_KSERVICES5DIR=${!outputLib}/share/kservices5"
+    cmakeFlags+=" -DKDE_INSTALL_KSERVICETYPES5DIR=${!outputLib}/share/kservicetypes5"
+    cmakeFlags+=" -DKDE_INSTALL_KXMLGUI5DIR=${!outputLib}/share/kxmlgui5"
+    cmakeFlags+=" -DKDE_INSTALL_KNOTIFY5RCDIR=${!outputLib}/share/knotifications5"
+    cmakeFlags+=" -DKDE_INSTALL_ICONDIR=${!outputLib}/share/icons"
+    cmakeFlags+=" -DKDE_INSTALL_LOCALEDIR=${!outputLib}/share/locale"
+    cmakeFlags+=" -DKDE_INSTALL_SOUNDDIR=${!outputLib}/share/sounds"
+    cmakeFlags+=" -DKDE_INSTALL_TEMPLATEDIR=${!outputLib}/share/templates"
+    cmakeFlags+=" -DKDE_INSTALL_WALLPAPERDIR=${!outputLib}/share/wallpapers"
+    cmakeFlags+=" -DKDE_INSTALL_APPDIR=${!outputLib}/share/applications"
+    cmakeFlags+=" -DKDE_INSTALL_DESKTOPDIR=${!outputLib}/share/desktop-directories"
+    cmakeFlags+=" -DKDE_INSTALL_MIMEDIR=${!outputLib}/share/mime/packages"
+    cmakeFlags+=" -DKDE_INSTALL_METAINFODIR=${!outputLib}/share/appdata"
+    cmakeFlags+=" -DKDE_INSTALL_MANDIR=${!outputLib}/share/man"
+    cmakeFlags+=" -DKDE_INSTALL_INFODIR=${!outputLib}/share/info"
+    cmakeFlags+=" -DKDE_INSTALL_DBUSDIR=${!outputLib}/share/dbus-1"
+    cmakeFlags+=" -DKDE_INSTALL_DBUSINTERFACEDIR=${!outputLib}/share/dbus-1/interfaces"
+    cmakeFlags+=" -DKDE_INSTALL_DBUSSERVICEDIR=${!outputLib}/share/dbus-1/services"
+    cmakeFlags+=" -DKDE_INSTALL_DBUSSYSTEMSERVICEDIR=${!outputLib}/share/dbus-1/system-services"
+    cmakeFlags+=" -DKDE_INSTALL_SYSCONFDIR=${!outputLib}/etc"
+    cmakeFlags+=" -DKDE_INSTALL_CONFDIR=${!outputLib}/etc/xdg"
+    cmakeFlags+=" -DKDE_INSTALL_AUTOSTARTDIR=${!outputLib}/etc/xdg/autostart"
+}
+
+envHooks+=(_ecmSetXdgDirs _ecmPropagateSharedData)
+preConfigureHooks+=(_ecmConfig)
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/fetchsrcs.sh b/pkgs/desktops/kde-5/frameworks-5.21/fetchsrcs.sh
new file mode 100755
index 00000000000..dde749b218c
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/fetchsrcs.sh
@@ -0,0 +1,57 @@
+#! /usr/bin/env nix-shell
+#! nix-shell -i bash -p coreutils findutils gnused nix wget
+
+set -x
+
+# The trailing slash at the end is necessary!
+RELEASE_URL="http://download.kde.org/stable/frameworks/5.21/"
+EXTRA_WGET_ARGS='-A *.tar.xz'
+
+mkdir tmp; cd tmp
+
+rm -f ../srcs.csv
+
+wget -nH -r -c --no-parent $RELEASE_URL $EXTRA_WGET_ARGS
+
+find . | while read src; do
+    if [[ -f "${src}" ]]; then
+        # Sanitize file name
+        filename=$(basename "$src" | tr '@' '_')
+        nameVersion="${filename%.tar.*}"
+        name=$(echo "$nameVersion" | sed -e 's,-[[:digit:]].*,,' | sed -e 's,-opensource-src$,,')
+        version=$(echo "$nameVersion" | sed -e 's,^\([[:alpha:]][[:alnum:]]*-\)\+,,')
+        echo "$name,$version,$src,$filename" >>../srcs.csv
+    fi
+done
+
+cat >../srcs.nix <<EOF
+# DO NOT EDIT! This file is generated automatically by fetchsrcs.sh
+{ fetchurl, mirror }:
+
+{
+EOF
+
+gawk -F , "{ print \$1 }" ../srcs.csv | sort | uniq | while read name; do
+    versions=$(gawk -F , "/^$name,/ { print \$2 }" ../srcs.csv)
+    latestVersion=$(echo "$versions" | sort -rV | head -n 1)
+    src=$(gawk -F , "/^$name,$latestVersion,/ { print \$3 }" ../srcs.csv)
+    filename=$(gawk -F , "/^$name,$latestVersion,/ { print \$4 }" ../srcs.csv)
+    url="${src:2}"
+    sha256=$(nix-hash --type sha256 --base32 --flat "$src")
+    cat >>../srcs.nix <<EOF
+  $name = {
+    version = "$latestVersion";
+    src = fetchurl {
+      url = "\${mirror}/$url";
+      sha256 = "$sha256";
+      name = "$filename";
+    };
+  };
+EOF
+done
+
+echo "}" >>../srcs.nix
+
+rm -f ../srcs.csv
+
+cd ..
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/frameworkintegration.nix b/pkgs/desktops/kde-5/frameworks-5.21/frameworkintegration.nix
new file mode 100644
index 00000000000..26987c385ad
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/frameworkintegration.nix
@@ -0,0 +1,17 @@
+{ kdeFramework, lib, extra-cmake-modules, kbookmarks, kcompletion
+, kconfig, kconfigwidgets, ki18n, kiconthemes, kio, knotifications
+, kwidgetsaddons, libXcursor, qtx11extras
+}:
+
+kdeFramework {
+  name = "frameworkintegration";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    kbookmarks kcompletion kconfig knotifications kwidgetsaddons
+    libXcursor
+  ];
+  propagatedBuildInputs = [ kconfigwidgets ki18n kio kiconthemes qtx11extras ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kactivities-stats.nix b/pkgs/desktops/kde-5/frameworks-5.21/kactivities-stats.nix
new file mode 100644
index 00000000000..c8405ce31b0
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kactivities-stats.nix
@@ -0,0 +1,9 @@
+{ kdeFramework, lib, extra-cmake-modules
+, boost, kactivities, kconfig }:
+
+kdeFramework {
+  name = "kactivities-stats";
+  meta = { maintainers = [ lib.maintainers.ttuegel ]; };
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ boost kactivities kconfig ];
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kactivities.nix b/pkgs/desktops/kde-5/frameworks-5.21/kactivities.nix
new file mode 100644
index 00000000000..7c01073e078
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kactivities.nix
@@ -0,0 +1,19 @@
+{ kdeFramework, lib, extra-cmake-modules, boost, kcmutils, kconfig
+, kcoreaddons, kdbusaddons, kdeclarative, kglobalaccel, ki18n
+, kio, kservice, kwindowsystem, kxmlgui, qtdeclarative
+}:
+
+kdeFramework {
+  name = "kactivities";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    boost kcmutils kconfig kcoreaddons kdbusaddons kservice
+    kxmlgui
+  ];
+  propagatedBuildInputs = [
+    kdeclarative kglobalaccel ki18n kio kwindowsystem qtdeclarative
+  ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kapidox.nix b/pkgs/desktops/kde-5/frameworks-5.21/kapidox.nix
new file mode 100644
index 00000000000..647be8f052c
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kapidox.nix
@@ -0,0 +1,12 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, python
+}:
+
+kdeFramework {
+  name = "kapidox";
+  nativeBuildInputs = [ extra-cmake-modules python ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/karchive.nix b/pkgs/desktops/kde-5/frameworks-5.21/karchive.nix
new file mode 100644
index 00000000000..a8d9a0003c3
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/karchive.nix
@@ -0,0 +1,11 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+}:
+
+kdeFramework {
+  name = "karchive";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kauth/cmake-install-paths.patch b/pkgs/desktops/kde-5/frameworks-5.21/kauth/cmake-install-paths.patch
new file mode 100644
index 00000000000..c66f5ecd008
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kauth/cmake-install-paths.patch
@@ -0,0 +1,17 @@
+Index: kauth-5.18.0/KF5AuthConfig.cmake.in
+===================================================================
+--- kauth-5.18.0.orig/KF5AuthConfig.cmake.in
++++ kauth-5.18.0/KF5AuthConfig.cmake.in
+@@ -4,9 +4,9 @@ set(KAUTH_STUB_FILES_DIR "@PACKAGE_KDE_I
+ 
+ set(KAUTH_BACKEND_NAME "@KAUTH_BACKEND_NAME@")
+ set(KAUTH_HELPER_BACKEND_NAME "@KAUTH_HELPER_BACKEND_NAME@")
+-set(KAUTH_POLICY_FILES_INSTALL_DIR "@KAUTH_POLICY_FILES_INSTALL_DIR@")
+-set(KAUTH_HELPER_INSTALL_DIR "@KAUTH_HELPER_INSTALL_DIR@")
+-set(KAUTH_HELPER_INSTALL_ABSOLUTE_DIR "@KAUTH_HELPER_INSTALL_ABSOLUTE_DIR@")
++set(KAUTH_POLICY_FILES_INSTALL_DIR "${KDE_INSTALL_DATADIR}/polkit-1/actions")
++set(KAUTH_HELPER_INSTALL_DIR "${KDE_INSTALL_LIBEXECDIR}")
++set(KAUTH_HELPER_INSTALL_ABSOLUTE_DIR "${KDE_INSTALL_LIBEXECDIR}")
+ 
+ find_dependency(KF5CoreAddons "@KF5_DEP_VERSION@")
+ 
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kauth/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/kauth/default.nix
new file mode 100644
index 00000000000..1352d8c5821
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kauth/default.nix
@@ -0,0 +1,16 @@
+{ kdeFramework, lib, copyPathsToStore
+, extra-cmake-modules
+, kcoreaddons
+, polkit-qt
+}:
+
+kdeFramework {
+  name = "kauth";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ polkit-qt ];
+  propagatedBuildInputs = [ kcoreaddons ];
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kauth/kauth-policy-install.patch b/pkgs/desktops/kde-5/frameworks-5.21/kauth/kauth-policy-install.patch
new file mode 100644
index 00000000000..340155256f2
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kauth/kauth-policy-install.patch
@@ -0,0 +1,13 @@
+diff --git a/KF5AuthConfig.cmake.in b/KF5AuthConfig.cmake.in
+index e859ec7..9a8ab18 100644
+--- a/KF5AuthConfig.cmake.in
++++ b/KF5AuthConfig.cmake.in
+@@ -4,7 +4,7 @@ set(KAUTH_STUB_FILES_DIR "${PACKAGE_PREFIX_DIR}/@KF5_DATA_INSTALL_DIR@/kauth/")
+ 
+ set(KAUTH_BACKEND_NAME "@KAUTH_BACKEND_NAME@")
+ set(KAUTH_HELPER_BACKEND_NAME "@KAUTH_HELPER_BACKEND_NAME@")
+-set(KAUTH_POLICY_FILES_INSTALL_DIR "@KAUTH_POLICY_FILES_INSTALL_DIR@")
++set(KAUTH_POLICY_FILES_INSTALL_DIR "\${CMAKE_INSTALL_PREFIX}/share/polkit-1/actions")
+ set(KAUTH_HELPER_INSTALL_DIR "@KAUTH_HELPER_INSTALL_DIR@")
+ 
+ find_dependency(KF5CoreAddons "@KF5_DEP_VERSION@")
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kauth/series b/pkgs/desktops/kde-5/frameworks-5.21/kauth/series
new file mode 100644
index 00000000000..d2689425c38
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kauth/series
@@ -0,0 +1 @@
+cmake-install-paths.patch
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kbookmarks.nix b/pkgs/desktops/kde-5/frameworks-5.21/kbookmarks.nix
new file mode 100644
index 00000000000..1a469ab4db6
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kbookmarks.nix
@@ -0,0 +1,25 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, kcodecs
+, kconfig
+, kconfigwidgets
+, kcoreaddons
+, kiconthemes
+, kxmlgui
+}:
+
+kdeFramework {
+  name = "kbookmarks";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    kcodecs
+    kconfig
+    kconfigwidgets
+    kcoreaddons
+    kiconthemes
+    kxmlgui
+  ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kcmutils/0001-qdiriterator-follow-symlinks.patch b/pkgs/desktops/kde-5/frameworks-5.21/kcmutils/0001-qdiriterator-follow-symlinks.patch
new file mode 100644
index 00000000000..0d861fa9501
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kcmutils/0001-qdiriterator-follow-symlinks.patch
@@ -0,0 +1,25 @@
+From f14d2a275323a47104b33eb61c5b6910ae1a9f59 Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@gmail.com>
+Date: Wed, 14 Oct 2015 06:43:53 -0500
+Subject: [PATCH] qdiriterator follow symlinks
+
+---
+ src/kpluginselector.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/kpluginselector.cpp b/src/kpluginselector.cpp
+index 9c3431d..d6b1ee2 100644
+--- a/src/kpluginselector.cpp
++++ b/src/kpluginselector.cpp
+@@ -305,7 +305,7 @@ void KPluginSelector::addPlugins(const QString &componentName,
+     QStringList desktopFileNames;
+     const QStringList dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, componentName + QStringLiteral("/kpartplugins"), QStandardPaths::LocateDirectory);
+     Q_FOREACH (const QString &dir, dirs) {
+-        QDirIterator it(dir, QStringList() << QStringLiteral("*.desktop"), QDir::NoFilter, QDirIterator::Subdirectories);
++      QDirIterator it(dir, QStringList() << QStringLiteral("*.desktop"), QDir::NoFilter, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
+         while (it.hasNext()) {
+             desktopFileNames.append(it.next());
+         }
+-- 
+2.5.2
+
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kcmutils/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/kcmutils/default.nix
new file mode 100644
index 00000000000..dbbb783ac61
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kcmutils/default.nix
@@ -0,0 +1,17 @@
+{ kdeFramework, lib, extra-cmake-modules, kconfigwidgets
+, kcoreaddons, kdeclarative, ki18n, kiconthemes, kitemviews
+, kpackage, kservice, kxmlgui
+}:
+
+kdeFramework {
+  name = "kcmutils";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    kcoreaddons kiconthemes kitemviews kpackage kxmlgui
+  ];
+  propagatedBuildInputs = [ kconfigwidgets kdeclarative ki18n kservice ];
+  patches = [ ./0001-qdiriterator-follow-symlinks.patch ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kcodecs.nix b/pkgs/desktops/kde-5/frameworks-5.21/kcodecs.nix
new file mode 100644
index 00000000000..53a69a69b69
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kcodecs.nix
@@ -0,0 +1,11 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+}:
+
+kdeFramework {
+  name = "kcodecs";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kcompletion.nix b/pkgs/desktops/kde-5/frameworks-5.21/kcompletion.nix
new file mode 100644
index 00000000000..e393774f16a
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kcompletion.nix
@@ -0,0 +1,14 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, kconfig
+, kwidgetsaddons
+}:
+
+kdeFramework {
+  name = "kcompletion";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ kconfig kwidgetsaddons ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kconfig.nix b/pkgs/desktops/kde-5/frameworks-5.21/kconfig.nix
new file mode 100644
index 00000000000..e132afe5988
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kconfig.nix
@@ -0,0 +1,16 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, makeQtWrapper
+}:
+
+kdeFramework {
+  name = "kconfig";
+  nativeBuildInputs = [ extra-cmake-modules makeQtWrapper ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/kreadconfig5"
+    wrapQtProgram "$out/bin/kwriteconfig5"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kconfigwidgets/0001-qdiriterator-follow-symlinks.patch b/pkgs/desktops/kde-5/frameworks-5.21/kconfigwidgets/0001-qdiriterator-follow-symlinks.patch
new file mode 100644
index 00000000000..7a6c0ee9053
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kconfigwidgets/0001-qdiriterator-follow-symlinks.patch
@@ -0,0 +1,25 @@
+From 4f84780893d505b2d62a14633dd983baa8ec6e28 Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@gmail.com>
+Date: Wed, 14 Oct 2015 06:47:01 -0500
+Subject: [PATCH] qdiriterator follow symlinks
+
+---
+ src/khelpclient.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/khelpclient.cpp b/src/khelpclient.cpp
+index 53a331e..80fbb01 100644
+--- a/src/khelpclient.cpp
++++ b/src/khelpclient.cpp
+@@ -48,7 +48,7 @@ void KHelpClient::invokeHelp(const QString &anchor, const QString &_appname)
+     QString docPath;
+     const QStringList desktopDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
+     Q_FOREACH (const QString &dir, desktopDirs) {
+-        QDirIterator it(dir, QStringList() << appname + QLatin1String(".desktop"), QDir::NoFilter, QDirIterator::Subdirectories);
++        QDirIterator it(dir, QStringList() << appname + QLatin1String(".desktop"), QDir::NoFilter, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
+         while (it.hasNext()) {
+             const QString desktopPath(it.next());
+             KDesktopFile desktopFile(desktopPath);
+-- 
+2.5.2
+
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kconfigwidgets/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/kconfigwidgets/default.nix
new file mode 100644
index 00000000000..3b3bd27cce0
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kconfigwidgets/default.nix
@@ -0,0 +1,18 @@
+{ kdeFramework, lib, extra-cmake-modules, kauth, kcodecs, kconfig
+, kdoctools, kguiaddons, ki18n, kwidgetsaddons, makeQtWrapper
+}:
+
+kdeFramework {
+  name = "kconfigwidgets";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools makeQtWrapper ];
+  buildInputs = [ kguiaddons ];
+  propagatedBuildInputs = [ kauth kconfig kcodecs ki18n kwidgetsaddons ];
+  patches = [ ./0001-qdiriterator-follow-symlinks.patch ];
+  postInstall = ''
+    moveToOutput "bin/preparetips5" "$dev"
+    wrapQtProgram "$dev/bin/preparetips5"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kcoreaddons.nix b/pkgs/desktops/kde-5/frameworks-5.21/kcoreaddons.nix
new file mode 100644
index 00000000000..f3a1db7bd48
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kcoreaddons.nix
@@ -0,0 +1,16 @@
+{ kdeFramework, lib, makeQtWrapper
+, extra-cmake-modules
+, shared_mime_info
+}:
+
+kdeFramework {
+  name = "kcoreaddons";
+  nativeBuildInputs = [ extra-cmake-modules makeQtWrapper ];
+  buildInputs = [ shared_mime_info ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/desktoptojson"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kcrash.nix b/pkgs/desktops/kde-5/frameworks-5.21/kcrash.nix
new file mode 100644
index 00000000000..bbab78ccb40
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kcrash.nix
@@ -0,0 +1,16 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, kcoreaddons
+, kwindowsystem
+, qtx11extras
+}:
+
+kdeFramework {
+  name = "kcrash";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ kcoreaddons ];
+  propagatedBuildInputs = [ kwindowsystem qtx11extras ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdbusaddons.nix b/pkgs/desktops/kde-5/frameworks-5.21/kdbusaddons.nix
new file mode 100644
index 00000000000..d2ceab31d14
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdbusaddons.nix
@@ -0,0 +1,17 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, makeQtWrapper
+, qtx11extras
+}:
+
+kdeFramework {
+  name = "kdbusaddons";
+  nativeBuildInputs = [ extra-cmake-modules makeQtWrapper ];
+  propagatedBuildInputs = [ qtx11extras ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/kquitapp5"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdeclarative.nix b/pkgs/desktops/kde-5/frameworks-5.21/kdeclarative.nix
new file mode 100644
index 00000000000..74d107466cf
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdeclarative.nix
@@ -0,0 +1,22 @@
+{ kdeFramework, lib, extra-cmake-modules, epoxy, kconfig
+, kglobalaccel, kguiaddons, ki18n, kiconthemes, kio, kpackage
+, kwidgetsaddons, kwindowsystem, makeQtWrapper, pkgconfig
+, qtdeclarative
+}:
+
+kdeFramework {
+  name = "kdeclarative";
+  nativeBuildInputs = [ extra-cmake-modules makeQtWrapper ];
+  buildInputs = [
+    epoxy kguiaddons kiconthemes kwidgetsaddons
+  ];
+  propagatedBuildInputs = [
+    kconfig kglobalaccel ki18n kio kpackage kwindowsystem qtdeclarative
+  ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/kpackagelauncherqml"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kded.nix b/pkgs/desktops/kde-5/frameworks-5.21/kded.nix
new file mode 100644
index 00000000000..47ae2d68c68
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kded.nix
@@ -0,0 +1,19 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, kconfig
+, kcoreaddons
+, kcrash
+, kdbusaddons
+, kdoctools
+, kinit
+, kservice
+}:
+
+kdeFramework {
+  name = "kded";
+  buildInputs = [ kconfig kcoreaddons kcrash kdbusaddons kinit kservice ];
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support.nix b/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support.nix
new file mode 100644
index 00000000000..e61c4bb86e7
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support.nix
@@ -0,0 +1,32 @@
+{ kdeFramework, lib, extra-cmake-modules, docbook_xml_dtd_45, kauth
+, karchive, kcompletion, kconfig, kconfigwidgets, kcoreaddons
+, kcrash, kdbusaddons, kded, kdesignerplugin, kdoctools, kemoticons
+, kglobalaccel, kguiaddons, ki18n, kiconthemes, kio, kitemmodels
+, kinit, knotifications, kparts, kservice, ktextwidgets
+, kunitconversion, kwidgetsaddons, kwindowsystem, kxmlgui
+, networkmanager, qtsvg, qtx11extras, xlibs
+}:
+
+# TODO: debug docbook detection
+
+kdeFramework {
+  name = "kdelibs4support";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    kcompletion kconfig kded kservice kwidgetsaddons
+    kxmlgui networkmanager qtsvg qtx11extras xlibs.libSM
+  ];
+  propagatedBuildInputs = [
+    kauth karchive kconfigwidgets kcoreaddons kcrash kdbusaddons
+    kdesignerplugin kemoticons kglobalaccel kguiaddons ki18n kio
+    kiconthemes kitemmodels kinit knotifications kparts ktextwidgets
+    kunitconversion kwindowsystem
+  ];
+  cmakeFlags = [
+    "-DDocBookXML4_DTD_DIR=${docbook_xml_dtd_45}/xml/dtd/docbook"
+    "-DDocBookXML4_DTD_VERSION=4.5"
+  ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/default.nix
new file mode 100644
index 00000000000..843db83a99b
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/default.nix
@@ -0,0 +1,36 @@
+{ kdeFramework, lib, copyPathsToStore
+, extra-cmake-modules, docbook_xml_dtd_45, kauth
+, karchive, kcompletion, kconfig, kconfigwidgets, kcoreaddons
+, kcrash, kdbusaddons, kded, kdesignerplugin, kdoctools, kemoticons
+, kglobalaccel, kguiaddons, ki18n, kiconthemes, kio, kitemmodels
+, kinit, knotifications, kparts, kservice, ktextwidgets
+, kunitconversion, kwidgetsaddons, kwindowsystem, kxmlgui
+, networkmanager, qtsvg, qtx11extras, xlibs
+}:
+
+# TODO: debug docbook detection
+
+kdeFramework {
+  name = "kdelibs4support";
+  outputs = [ "dev" "out" ];
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  setupHook = ./setup-hook.sh;
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    kcompletion kconfig kded kservice kwidgetsaddons
+    kxmlgui networkmanager qtsvg qtx11extras xlibs.libSM
+  ];
+  propagatedBuildInputs = [
+    kauth karchive kconfigwidgets kcoreaddons kcrash kdbusaddons
+    kdesignerplugin kemoticons kglobalaccel kguiaddons ki18n kio
+    kiconthemes kitemmodels kinit knotifications kparts ktextwidgets
+    kunitconversion kwindowsystem
+  ];
+  cmakeFlags = [
+    "-DDocBookXML4_DTD_DIR=${docbook_xml_dtd_45}/xml/dtd/docbook"
+    "-DDocBookXML4_DTD_VERSION=4.5"
+  ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/nix-kde-include-dir.patch b/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/nix-kde-include-dir.patch
new file mode 100644
index 00000000000..eabb7025448
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/nix-kde-include-dir.patch
@@ -0,0 +1,13 @@
+Index: kdelibs4support-5.18.0/src/kdecore/kstandarddirs.cpp
+===================================================================
+--- kdelibs4support-5.18.0.orig/src/kdecore/kstandarddirs.cpp
++++ kdelibs4support-5.18.0/src/kdecore/kstandarddirs.cpp
+@@ -292,7 +292,7 @@ static QString relativeInstallPath(const
+             return QFile::decodeName(ICON_INSTALL_DIR "/");
+         }
+         if (strcmp("include", type) == 0) {
+-            return QFile::decodeName(INCLUDE_INSTALL_DIR "/");
++            return QFile::decodeName(qgetenv("NIX_KDE_INCLUDE_DIR"));
+         }
+         break;
+     case 'l':
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/series b/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/series
new file mode 100644
index 00000000000..9b08ab20877
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/series
@@ -0,0 +1 @@
+nix-kde-include-dir.patch
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/setup-hook.sh b/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/setup-hook.sh
new file mode 100644
index 00000000000..21ac2e83b5d
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdelibs4support/setup-hook.sh
@@ -0,0 +1 @@
+export NIX_KDE_INCLUDE_DIR="@dev@/include/"  # trailing slash is required!
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdesignerplugin.nix b/pkgs/desktops/kde-5/frameworks-5.21/kdesignerplugin.nix
new file mode 100644
index 00000000000..cbc114ccca0
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdesignerplugin.nix
@@ -0,0 +1,34 @@
+{ kdeFramework, lib, makeQtWrapper
+, extra-cmake-modules
+, kcompletion
+, kconfig
+, kconfigwidgets
+, kcoreaddons
+, kdewebkit
+, kdoctools
+, kiconthemes
+, kio
+, kitemviews
+, kplotting
+, ktextwidgets
+, kwidgetsaddons
+, kxmlgui
+, sonnet
+}:
+
+kdeFramework {
+  name = "kdesignerplugin";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools makeQtWrapper ];
+  buildInputs = [
+    kcompletion kconfig kconfigwidgets kcoreaddons kdewebkit
+    kiconthemes kitemviews kplotting ktextwidgets kwidgetsaddons
+    kxmlgui
+  ];
+  propagatedBuildInputs = [ kio sonnet ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/kgendesignerplugin"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdesu.nix b/pkgs/desktops/kde-5/frameworks-5.21/kdesu.nix
new file mode 100644
index 00000000000..364fbd6a720
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdesu.nix
@@ -0,0 +1,13 @@
+{ kdeFramework, lib, extra-cmake-modules, kcoreaddons, ki18n, kpty
+, kservice
+}:
+
+kdeFramework {
+  name = "kdesu";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ kcoreaddons kservice ];
+  propagatedBuildInputs = [ ki18n kpty ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdewebkit.nix b/pkgs/desktops/kde-5/frameworks-5.21/kdewebkit.nix
new file mode 100644
index 00000000000..d361313d1d4
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdewebkit.nix
@@ -0,0 +1,13 @@
+{ kdeFramework, lib, extra-cmake-modules, kconfig, kcoreaddons
+, ki18n, kio, kjobwidgets, kparts, kservice, kwallet, qtwebkit
+}:
+
+kdeFramework {
+  name = "kdewebkit";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ kconfig kcoreaddons kjobwidgets kparts kservice kwallet ];
+  propagatedBuildInputs = [ ki18n kio qtwebkit ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdnssd.nix b/pkgs/desktops/kde-5/frameworks-5.21/kdnssd.nix
new file mode 100644
index 00000000000..f00432b0c9c
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdnssd.nix
@@ -0,0 +1,13 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, avahi
+}:
+
+kdeFramework {
+  name = "kdnssd";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ avahi ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdoctools/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/kdoctools/default.nix
new file mode 100644
index 00000000000..f67c19f4239
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdoctools/default.nix
@@ -0,0 +1,19 @@
+{ kdeFramework, lib, extra-cmake-modules, docbook_xml_dtd_45
+, docbook5_xsl, karchive, ki18n, makeQtWrapper, perl, perlPackages
+}:
+
+kdeFramework {
+  name = "kdoctools";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ karchive ];
+  propagatedBuildInputs = [ ki18n ];
+  propagatedNativeBuildInputs = [ makeQtWrapper perl perlPackages.URI ];
+  cmakeFlags = [
+    "-DDocBookXML4_DTD_DIR=${docbook_xml_dtd_45}/xml/dtd/docbook"
+    "-DDocBookXSL_DIR=${docbook5_xsl}/xml/xsl/docbook"
+  ];
+  patches = [ ./kdoctools-no-find-docbook-xml.patch ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdoctools/kdoctools-no-find-docbook-xml.patch b/pkgs/desktops/kde-5/frameworks-5.21/kdoctools/kdoctools-no-find-docbook-xml.patch
new file mode 100644
index 00000000000..4e3a33efab3
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdoctools/kdoctools-no-find-docbook-xml.patch
@@ -0,0 +1,12 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 5c4863c..f731775 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -46,7 +46,6 @@ set_package_properties(LibXml2 PROPERTIES
+                       )
+ 
+ 
+-find_package(DocBookXML4 "4.5")
+ 
+ set_package_properties(DocBookXML4 PROPERTIES
+                        TYPE REQUIRED
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kdoctools/setup-hook.sh b/pkgs/desktops/kde-5/frameworks-5.21/kdoctools/setup-hook.sh
new file mode 100644
index 00000000000..5cfffbd622d
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kdoctools/setup-hook.sh
@@ -0,0 +1,5 @@
+addXdgData() {
+    addToSearchPath XDG_DATA_DIRS "$1/share"
+}
+
+envHooks+=(addXdgData)
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kemoticons.nix b/pkgs/desktops/kde-5/frameworks-5.21/kemoticons.nix
new file mode 100644
index 00000000000..d165f84e3a2
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kemoticons.nix
@@ -0,0 +1,17 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, karchive
+, kconfig
+, kcoreaddons
+, kservice
+}:
+
+kdeFramework {
+  name = "kemoticons";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ karchive kconfig kcoreaddons ];
+  propagatedBuildInputs = [ kservice ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata.nix b/pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata.nix
new file mode 100644
index 00000000000..be99c58d550
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata.nix
@@ -0,0 +1,13 @@
+{ kdeFramework, lib, extra-cmake-modules, attr, ebook_tools, exiv2
+, ffmpeg, karchive, ki18n, poppler, qtbase, taglib
+}:
+
+kdeFramework {
+  name = "kfilemetadata";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ attr ebook_tools exiv2 ffmpeg karchive poppler taglib ];
+  propagatedBuildInputs = [ qtbase ki18n ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata/cmake-install-paths.patch b/pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata/cmake-install-paths.patch
new file mode 100644
index 00000000000..732f7b69c82
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata/cmake-install-paths.patch
@@ -0,0 +1,13 @@
+Index: kfilemetadata-5.18.0/src/CMakeLists.txt
+===================================================================
+--- kfilemetadata-5.18.0.orig/src/CMakeLists.txt
++++ kfilemetadata-5.18.0/src/CMakeLists.txt
+@@ -49,7 +49,7 @@ install(TARGETS KF5FileMetaData EXPORT K
+ 
+ install(EXPORT KF5FileMetaDataTargets
+         NAMESPACE KF5::
+-        DESTINATION ${LIB_INSTALL_DIR}/cmake/KF5FileMetaData
++        DESTINATION ${KDE_INSTALL_FULL_CMAKEPACKAGEDIR}/KF5FileMetaData
+         FILE KF5FileMetaDataTargets.cmake)
+ 
+ install(FILES
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata/default.nix
new file mode 100644
index 00000000000..9bb4831cf8d
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata/default.nix
@@ -0,0 +1,14 @@
+{ kdeFramework, lib, copyPathsToStore, extra-cmake-modules
+, attr, ebook_tools, exiv2, ffmpeg, karchive, ki18n, poppler, qtbase, taglib
+}:
+
+kdeFramework {
+  name = "kfilemetadata";
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ attr ebook_tools exiv2 ffmpeg karchive poppler taglib ];
+  propagatedBuildInputs = [ qtbase ki18n ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata/series b/pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata/series
new file mode 100644
index 00000000000..d2689425c38
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kfilemetadata/series
@@ -0,0 +1 @@
+cmake-install-paths.patch
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kglobalaccel.nix b/pkgs/desktops/kde-5/frameworks-5.21/kglobalaccel.nix
new file mode 100644
index 00000000000..c535b3590a3
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kglobalaccel.nix
@@ -0,0 +1,23 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, kconfig
+, kcoreaddons
+, kcrash
+, kdbusaddons
+, kwindowsystem
+, makeQtWrapper
+, qtx11extras
+}:
+
+kdeFramework {
+  name = "kglobalaccel";
+  nativeBuildInputs = [ extra-cmake-modules makeQtWrapper ];
+  buildInputs = [ kconfig kcoreaddons kcrash kdbusaddons ];
+  propagatedBuildInputs = [ kwindowsystem qtx11extras ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/kglobalaccel5"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kguiaddons.nix b/pkgs/desktops/kde-5/frameworks-5.21/kguiaddons.nix
new file mode 100644
index 00000000000..bc4e9ab1184
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kguiaddons.nix
@@ -0,0 +1,13 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, qtx11extras
+}:
+
+kdeFramework {
+  name = "kguiaddons";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ qtx11extras ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/khtml.nix b/pkgs/desktops/kde-5/frameworks-5.21/khtml.nix
new file mode 100644
index 00000000000..d40df466ebb
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/khtml.nix
@@ -0,0 +1,21 @@
+{ kdeFramework, lib, extra-cmake-modules, giflib, karchive
+, kcodecs, kglobalaccel, ki18n, kiconthemes, kio, kjs
+, knotifications, kparts, ktextwidgets, kwallet, kwidgetsaddons
+, kwindowsystem, kxmlgui, perl, phonon, qtx11extras, sonnet
+}:
+
+kdeFramework {
+  name = "khtml";
+  nativeBuildInputs = [ extra-cmake-modules perl ];
+  buildInputs = [
+    giflib karchive kiconthemes knotifications kwallet kwidgetsaddons
+    kxmlgui phonon
+  ];
+  propagatedBuildInputs = [
+    kcodecs kglobalaccel ki18n kio kjs kparts ktextwidgets
+    kwindowsystem qtx11extras sonnet
+  ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/ki18n.nix b/pkgs/desktops/kde-5/frameworks-5.21/ki18n.nix
new file mode 100644
index 00000000000..268006512e7
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/ki18n.nix
@@ -0,0 +1,17 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, gettext
+, python
+, qtdeclarative
+, qtscript
+}:
+
+kdeFramework {
+  name = "ki18n";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ qtdeclarative qtscript ];
+  propagatedNativeBuildInputs = [ gettext python ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kiconthemes/default-theme-breeze.patch b/pkgs/desktops/kde-5/frameworks-5.21/kiconthemes/default-theme-breeze.patch
new file mode 100644
index 00000000000..5b3b15d5d5b
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kiconthemes/default-theme-breeze.patch
@@ -0,0 +1,13 @@
+Index: kiconthemes-5.17.0/src/kicontheme.cpp
+===================================================================
+--- kiconthemes-5.17.0.orig/src/kicontheme.cpp
++++ kiconthemes-5.17.0/src/kicontheme.cpp
+@@ -557,7 +557,7 @@ void KIconTheme::reconfigure()
+ // static
+ QString KIconTheme::defaultThemeName()
+ {
+-    return QStringLiteral("oxygen");
++    return QStringLiteral("breeze");
+ }
+ 
+ void KIconTheme::assignIconsToContextMenu(ContextMenus type,
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kiconthemes/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/kiconthemes/default.nix
new file mode 100644
index 00000000000..b78b25582be
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kiconthemes/default.nix
@@ -0,0 +1,18 @@
+{ kdeFramework, lib, copyPathsToStore
+, extra-cmake-modules, makeQtWrapper
+, kconfigwidgets, ki18n, breeze-icons, kitemviews, qtsvg
+}:
+
+kdeFramework {
+  name = "kiconthemes";
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  nativeBuildInputs = [ extra-cmake-modules makeQtWrapper ];
+  buildInputs = [ kconfigwidgets kitemviews qtsvg ];
+  propagatedBuildInputs = [ breeze-icons ki18n ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/kiconfinder5"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kiconthemes/series b/pkgs/desktops/kde-5/frameworks-5.21/kiconthemes/series
new file mode 100644
index 00000000000..ab5cc8a3edb
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kiconthemes/series
@@ -0,0 +1 @@
+default-theme-breeze.patch
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kidletime.nix b/pkgs/desktops/kde-5/frameworks-5.21/kidletime.nix
new file mode 100644
index 00000000000..fc086560023
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kidletime.nix
@@ -0,0 +1,15 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, qtbase
+, qtx11extras
+}:
+
+kdeFramework {
+  name = "kidletime";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ qtx11extras ];
+  propagatedBuildInputs = [ qtbase ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kimageformats.nix b/pkgs/desktops/kde-5/frameworks-5.21/kimageformats.nix
new file mode 100644
index 00000000000..49d66bbcc2c
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kimageformats.nix
@@ -0,0 +1,13 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, ilmbase
+}:
+
+kdeFramework {
+  name = "kimageformats";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  NIX_CFLAGS_COMPILE = "-I${ilmbase}/include/OpenEXR";
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kinit/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/kinit/default.nix
new file mode 100644
index 00000000000..64210ca7605
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kinit/default.nix
@@ -0,0 +1,17 @@
+{ kdeFramework, lib, copyPathsToStore, extra-cmake-modules, kconfig, kcrash
+, kdoctools, ki18n, kio, kservice, kwindowsystem, libcap
+, libcap_progs
+}:
+
+# TODO: setuid wrapper
+
+kdeFramework {
+  name = "kinit";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools libcap_progs ];
+  buildInputs = [ kconfig kcrash kservice libcap ];
+  propagatedBuildInputs = [ ki18n kio kwindowsystem ];
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kinit/kinit-libpath.patch b/pkgs/desktops/kde-5/frameworks-5.21/kinit/kinit-libpath.patch
new file mode 100644
index 00000000000..47538fbe456
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kinit/kinit-libpath.patch
@@ -0,0 +1,34 @@
+Index: kinit-5.21.0/src/kdeinit/kinit.cpp
+===================================================================
+--- kinit-5.21.0.orig/src/kdeinit/kinit.cpp
++++ kinit-5.21.0/src/kdeinit/kinit.cpp
+@@ -657,19 +657,16 @@ static pid_t launch(int argc, const char
+ 
+         if (!libpath.isEmpty()) {
+             if (libpath_relative) {
+-                // NB: Because Qt makes the actual dlopen() call, the
+-                //     RUNPATH of kdeinit is *not* respected - see
+-                //     https://sourceware.org/bugzilla/show_bug.cgi?id=13945
+-                //     - so we try hacking it in ourselves
+-                QString install_lib_dir = QFile::decodeName(
+-                        CMAKE_INSTALL_PREFIX "/" LIB_INSTALL_DIR "/");
+-                QString orig_libpath = libpath;
+-                libpath = install_lib_dir + libpath;
+-                l.setFileName(libpath);
+-                if (!l.load()) {
+-                    libpath = orig_libpath;
+-                    l.setFileName(libpath);
+-                    l.load();
++                // Try to load the library relative to the active profiles.
++                QByteArrayList profiles = qgetenv("NIX_PROFILES").split(' ');
++                // Reverse the profile list.
++                std::reverse(profiles.begin(), profiles.end());
++                const QString libdir = QString::fromLatin1("/lib/");
++                Q_FOREACH (const QByteArray &profile, profiles) {
++                    if (!profile.isEmpty()) {
++                        l.setFileName(QFile::decodeName(profile) + libdir + libpath);
++                        if (l.load()) break;
++                    }
+                 }
+             } else {
+                 l.load();
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kinit/series b/pkgs/desktops/kde-5/frameworks-5.21/kinit/series
new file mode 100644
index 00000000000..5faa456366b
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kinit/series
@@ -0,0 +1 @@
+kinit-libpath.patch
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kio/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/kio/default.nix
new file mode 100644
index 00000000000..a2131ff3385
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kio/default.nix
@@ -0,0 +1,33 @@
+{ kdeFramework, lib, copyPathsToStore
+, extra-cmake-modules, acl, karchive
+, kbookmarks, kcompletion, kconfig, kconfigwidgets, kcoreaddons
+, kdbusaddons, kdoctools, ki18n, kiconthemes, kitemviews
+, kjobwidgets, knotifications, kservice, ktextwidgets, kwallet
+, kwidgetsaddons, kwindowsystem, kxmlgui, makeQtWrapper
+, qtscript, qtx11extras, solid
+}:
+
+kdeFramework {
+  name = "kio";
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  nativeBuildInputs = [ extra-cmake-modules kdoctools makeQtWrapper ];
+  buildInputs = [
+    acl karchive kconfig kcoreaddons kdbusaddons kiconthemes
+    knotifications ktextwidgets kwallet kwidgetsaddons
+    qtscript
+  ];
+  propagatedBuildInputs = [
+    kbookmarks kcompletion kconfigwidgets ki18n kitemviews kjobwidgets
+    kservice kwindowsystem kxmlgui solid qtx11extras
+  ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/kcookiejar5"
+    wrapQtProgram "$out/bin/ktelnetservice5"
+    wrapQtProgram "$out/bin/ktrash5"
+    wrapQtProgram "$out/bin/kmailservice5"
+    wrapQtProgram "$out/bin/protocoltojson"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kio/samba-search-path.patch b/pkgs/desktops/kde-5/frameworks-5.21/kio/samba-search-path.patch
new file mode 100644
index 00000000000..c9ad46b41bb
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kio/samba-search-path.patch
@@ -0,0 +1,28 @@
+Index: kio-5.17.0/src/core/ksambashare.cpp
+===================================================================
+--- kio-5.17.0.orig/src/core/ksambashare.cpp
++++ kio-5.17.0/src/core/ksambashare.cpp
+@@ -67,13 +67,18 @@ KSambaSharePrivate::~KSambaSharePrivate(
+ 
+ bool KSambaSharePrivate::isSambaInstalled()
+ {
+-    if (QFile::exists(QStringLiteral("/usr/sbin/smbd"))
+-            || QFile::exists(QStringLiteral("/usr/local/sbin/smbd"))) {
+-        return true;
++    const QByteArray pathEnv = qgetenv("PATH");
++    if (!pathEnv.isEmpty()) {
++        QLatin1Char pathSep(':');
++        QStringList paths = QFile::decodeName(pathEnv).split(pathSep, QString::SkipEmptyParts);
++        for (QStringList::iterator it = paths.begin(); it != paths.end(); ++it) {
++            it->append("/smbd");
++            if (QFile::exists(*it)) {
++                return true;
++            }
++        }
+     }
+ 
+-    //qDebug() << "Samba is not installed!";
+-
+     return false;
+ }
+ 
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kio/series b/pkgs/desktops/kde-5/frameworks-5.21/kio/series
new file mode 100644
index 00000000000..77ca1545004
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kio/series
@@ -0,0 +1 @@
+samba-search-path.patch
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kitemmodels.nix b/pkgs/desktops/kde-5/frameworks-5.21/kitemmodels.nix
new file mode 100644
index 00000000000..a9024d771cc
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kitemmodels.nix
@@ -0,0 +1,11 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+}:
+
+kdeFramework {
+  name = "kitemmodels";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kitemviews.nix b/pkgs/desktops/kde-5/frameworks-5.21/kitemviews.nix
new file mode 100644
index 00000000000..931019ce495
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kitemviews.nix
@@ -0,0 +1,11 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+}:
+
+kdeFramework {
+  name = "kitemviews";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kjobwidgets.nix b/pkgs/desktops/kde-5/frameworks-5.21/kjobwidgets.nix
new file mode 100644
index 00000000000..746edf12eea
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kjobwidgets.nix
@@ -0,0 +1,16 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, kcoreaddons
+, kwidgetsaddons
+, qtx11extras
+}:
+
+kdeFramework {
+  name = "kjobwidgets";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ kcoreaddons kwidgetsaddons ];
+  propagatedBuildInputs = [ qtx11extras ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kjs.nix b/pkgs/desktops/kde-5/frameworks-5.21/kjs.nix
new file mode 100644
index 00000000000..768720f178c
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kjs.nix
@@ -0,0 +1,16 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, kdoctools
+, makeQtWrapper
+}:
+
+kdeFramework {
+  name = "kjs";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools makeQtWrapper ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/kjs5"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kjsembed.nix b/pkgs/desktops/kde-5/frameworks-5.21/kjsembed.nix
new file mode 100644
index 00000000000..22eef2d47bd
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kjsembed.nix
@@ -0,0 +1,17 @@
+{ kdeFramework, lib, extra-cmake-modules, kdoctools, ki18n, kjs
+, makeQtWrapper, qtsvg
+}:
+
+kdeFramework {
+  name = "kjsembed";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools makeQtWrapper ];
+  buildInputs = [ qtsvg ];
+  propagatedBuildInputs = [ ki18n kjs ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/kjscmd5"
+    wrapQtProgram "$out/bin/kjsconsole"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kmediaplayer.nix b/pkgs/desktops/kde-5/frameworks-5.21/kmediaplayer.nix
new file mode 100644
index 00000000000..460458b2232
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kmediaplayer.nix
@@ -0,0 +1,15 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, kparts
+, kxmlgui
+}:
+
+kdeFramework {
+  name = "kmediaplayer";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ kxmlgui ];
+  propagatedBuildInputs = [ kparts ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/knewstuff.nix b/pkgs/desktops/kde-5/frameworks-5.21/knewstuff.nix
new file mode 100644
index 00000000000..5bcd6f30146
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/knewstuff.nix
@@ -0,0 +1,17 @@
+{ kdeFramework, lib, extra-cmake-modules, attica, karchive
+, kcompletion, kconfig, kcoreaddons, ki18n, kiconthemes, kio
+, kitemviews, kservice, ktextwidgets, kwidgetsaddons, kxmlgui
+}:
+
+kdeFramework {
+  name = "knewstuff";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    karchive kcompletion kconfig kcoreaddons kiconthemes
+    kitemviews ktextwidgets kwidgetsaddons
+  ];
+  propagatedBuildInputs = [ attica ki18n kio kservice kxmlgui ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/knotifications.nix b/pkgs/desktops/kde-5/frameworks-5.21/knotifications.nix
new file mode 100644
index 00000000000..7e301dd0f26
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/knotifications.nix
@@ -0,0 +1,21 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, kcodecs
+, kconfig
+, kcoreaddons
+, kwindowsystem
+, phonon
+, qtx11extras
+}:
+
+kdeFramework {
+  name = "knotifications";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    kcodecs kconfig kcoreaddons phonon
+  ];
+  propagatedBuildInputs = [ kwindowsystem qtx11extras ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/knotifyconfig.nix b/pkgs/desktops/kde-5/frameworks-5.21/knotifyconfig.nix
new file mode 100644
index 00000000000..dd99d2d4f1e
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/knotifyconfig.nix
@@ -0,0 +1,13 @@
+{ kdeFramework, lib, extra-cmake-modules, kcompletion, kconfig
+, ki18n, kio, phonon
+}:
+
+kdeFramework {
+  name = "knotifyconfig";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ kcompletion kconfig phonon ];
+  propagatedBuildInputs = [ ki18n kio ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kpackage/allow-external-paths.patch b/pkgs/desktops/kde-5/frameworks-5.21/kpackage/allow-external-paths.patch
new file mode 100644
index 00000000000..e9d74444814
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kpackage/allow-external-paths.patch
@@ -0,0 +1,13 @@
+Index: kpackage-5.18.0/src/kpackage/package.cpp
+===================================================================
+--- kpackage-5.18.0.orig/src/kpackage/package.cpp
++++ kpackage-5.18.0/src/kpackage/package.cpp
+@@ -808,7 +808,7 @@ PackagePrivate::PackagePrivate()
+     : QSharedData(),
+       fallbackPackage(0),
+       metadata(0),
+-      externalPaths(false),
++      externalPaths(true),
+       valid(false),
+       checkedValid(false)
+ {
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kpackage/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/kpackage/default.nix
new file mode 100644
index 00000000000..aea1b0d31a0
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kpackage/default.nix
@@ -0,0 +1,23 @@
+{ kdeFramework, lib, copyPathsToStore
+, extra-cmake-modules
+, karchive
+, kconfig
+, kcoreaddons
+, kdoctools
+, ki18n
+, makeQtWrapper
+}:
+
+kdeFramework {
+  name = "kpackage";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools makeQtWrapper ];
+  buildInputs = [ karchive kconfig ];
+  propagatedBuildInputs = [ kcoreaddons ki18n ];
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  postInstall = ''
+    wrapQtProgram "$out/bin/kpackagetool5"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kpackage/qdiriterator-follow-symlinks.patch b/pkgs/desktops/kde-5/frameworks-5.21/kpackage/qdiriterator-follow-symlinks.patch
new file mode 100644
index 00000000000..ddbf17d0006
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kpackage/qdiriterator-follow-symlinks.patch
@@ -0,0 +1,26 @@
+Index: kpackage-5.18.0/src/kpackage/packageloader.cpp
+===================================================================
+--- kpackage-5.18.0.orig/src/kpackage/packageloader.cpp
++++ kpackage-5.18.0/src/kpackage/packageloader.cpp
+@@ -241,7 +241,7 @@ QList<KPluginMetaData> PackageLoader::li
+         } else {
+             //qDebug() << "Not cached";
+             // If there's no cache file, fall back to listing the directory
+-            const QDirIterator::IteratorFlags flags = QDirIterator::Subdirectories;
++            const QDirIterator::IteratorFlags flags = QDirIterator::Subdirectories | QDirIterator::FollowSymlinks;
+             const QStringList nameFilters = QStringList(QStringLiteral("metadata.desktop")) << QStringLiteral("metadata.json");
+ 
+             QDirIterator it(plugindir, nameFilters, QDir::Files, flags);
+Index: kpackage-5.18.0/src/kpackage/private/packagejobthread.cpp
+===================================================================
+--- kpackage-5.18.0.orig/src/kpackage/private/packagejobthread.cpp
++++ kpackage-5.18.0/src/kpackage/private/packagejobthread.cpp
+@@ -146,7 +146,7 @@ bool indexDirectory(const QString& dir,
+ 
+     QJsonArray plugins;
+ 
+-    QDirIterator it(dir, *metaDataFiles, QDir::Files, QDirIterator::Subdirectories);
++    QDirIterator it(dir, *metaDataFiles, QDir::Files, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
+     while (it.hasNext()) {
+         it.next();
+         const QString path = it.fileInfo().absoluteFilePath();
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kpackage/series b/pkgs/desktops/kde-5/frameworks-5.21/kpackage/series
new file mode 100644
index 00000000000..9b7f076efc7
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kpackage/series
@@ -0,0 +1,2 @@
+allow-external-paths.patch
+qdiriterator-follow-symlinks.patch
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kparts.nix b/pkgs/desktops/kde-5/frameworks-5.21/kparts.nix
new file mode 100644
index 00000000000..1c3e0b2cbc5
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kparts.nix
@@ -0,0 +1,17 @@
+{ kdeFramework, lib, extra-cmake-modules, kconfig, kcoreaddons
+, ki18n, kiconthemes, kio, kjobwidgets, knotifications, kservice
+, ktextwidgets, kwidgetsaddons, kxmlgui
+}:
+
+kdeFramework {
+  name = "kparts";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    kconfig kcoreaddons kiconthemes kjobwidgets knotifications
+    kservice kwidgetsaddons
+  ];
+  propagatedBuildInputs = [ ki18n kio ktextwidgets kxmlgui ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kpeople.nix b/pkgs/desktops/kde-5/frameworks-5.21/kpeople.nix
new file mode 100644
index 00000000000..4c3877e7efd
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kpeople.nix
@@ -0,0 +1,15 @@
+{ kdeFramework, lib, extra-cmake-modules, kcoreaddons, ki18n
+, kitemviews, kservice, kwidgetsaddons, qtdeclarative
+}:
+
+kdeFramework {
+  name = "kpeople";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    kcoreaddons kitemviews kservice kwidgetsaddons
+  ];
+  propagatedBuildInputs = [ ki18n qtdeclarative ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kplotting.nix b/pkgs/desktops/kde-5/frameworks-5.21/kplotting.nix
new file mode 100644
index 00000000000..c16f51b5ac3
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kplotting.nix
@@ -0,0 +1,11 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+}:
+
+kdeFramework {
+  name = "kplotting";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kpty.nix b/pkgs/desktops/kde-5/frameworks-5.21/kpty.nix
new file mode 100644
index 00000000000..2e34e6f674c
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kpty.nix
@@ -0,0 +1,10 @@
+{ kdeFramework, lib, extra-cmake-modules, kcoreaddons, ki18n }:
+
+kdeFramework {
+  name = "kpty";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  propagatedBuildInputs = [ kcoreaddons ki18n ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kross.nix b/pkgs/desktops/kde-5/frameworks-5.21/kross.nix
new file mode 100644
index 00000000000..7c6f079feaa
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kross.nix
@@ -0,0 +1,14 @@
+{ kdeFramework, lib, extra-cmake-modules, kcompletion, kcoreaddons
+, kdoctools, ki18n, kiconthemes, kio, kparts, kwidgetsaddons
+, kxmlgui, qtscript
+}:
+
+kdeFramework {
+  name = "kross";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [ kcompletion kcoreaddons kxmlgui ];
+  propagatedBuildInputs = [ ki18n kiconthemes kio kparts kwidgetsaddons qtscript ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/krunner.nix b/pkgs/desktops/kde-5/frameworks-5.21/krunner.nix
new file mode 100644
index 00000000000..12d2b54d0eb
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/krunner.nix
@@ -0,0 +1,16 @@
+{ kdeFramework, lib, extra-cmake-modules, kconfig, kcoreaddons
+, ki18n, kio, kservice, plasma-framework, qtquick1, solid
+, threadweaver
+}:
+
+kdeFramework {
+  name = "krunner";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    kconfig kcoreaddons kservice qtquick1 solid threadweaver
+  ];
+  propagatedBuildInputs = [ ki18n kio plasma-framework ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kservice/0001-qdiriterator-follow-symlinks.patch b/pkgs/desktops/kde-5/frameworks-5.21/kservice/0001-qdiriterator-follow-symlinks.patch
new file mode 100644
index 00000000000..3d8397d8ee2
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kservice/0001-qdiriterator-follow-symlinks.patch
@@ -0,0 +1,25 @@
+From ae8919eb81abad369e4a26ffcd845b140983398d Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@gmail.com>
+Date: Wed, 14 Oct 2015 06:28:57 -0500
+Subject: [PATCH 1/2] qdiriterator follow symlinks
+
+---
+ src/sycoca/kbuildsycoca.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/sycoca/kbuildsycoca.cpp b/src/sycoca/kbuildsycoca.cpp
+index 1deae14..250baa8 100644
+--- a/src/sycoca/kbuildsycoca.cpp
++++ b/src/sycoca/kbuildsycoca.cpp
+@@ -208,7 +208,7 @@ bool KBuildSycoca::build()
+         QStringList relFiles;
+         const QStringList dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, m_resourceSubdir, QStandardPaths::LocateDirectory);
+         Q_FOREACH (const QString &dir, dirs) {
+-            QDirIterator it(dir, QDirIterator::Subdirectories);
++            QDirIterator it(dir, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
+             while (it.hasNext()) {
+                 const QString filePath = it.next();
+                 Q_ASSERT(filePath.startsWith(dir)); // due to the line below...
+-- 
+2.5.2
+
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kservice/0002-no-canonicalize-path.patch b/pkgs/desktops/kde-5/frameworks-5.21/kservice/0002-no-canonicalize-path.patch
new file mode 100644
index 00000000000..685c6852611
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kservice/0002-no-canonicalize-path.patch
@@ -0,0 +1,25 @@
+From 46d124da602d84b7611a7ff0ac0862168d451cdb Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@gmail.com>
+Date: Wed, 14 Oct 2015 06:31:29 -0500
+Subject: [PATCH 2/2] no canonicalize path
+
+---
+ src/sycoca/vfolder_menu.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/sycoca/vfolder_menu.cpp b/src/sycoca/vfolder_menu.cpp
+index d3e31c3..d15d743 100644
+--- a/src/sycoca/vfolder_menu.cpp
++++ b/src/sycoca/vfolder_menu.cpp
+@@ -415,7 +415,7 @@ VFolderMenu::absoluteDir(const QString &_dir, const QString &baseDir, bool keepR
+     }
+ 
+     if (!relative) {
+-        QString resolved = QDir(dir).canonicalPath();
++      QString resolved = QDir::cleanPath(dir);
+         if (!resolved.isEmpty()) {
+             dir = resolved;
+         }
+-- 
+2.5.2
+
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kservice/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/kservice/default.nix
new file mode 100644
index 00000000000..3a27d85b916
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kservice/default.nix
@@ -0,0 +1,18 @@
+{ kdeFramework, lib, extra-cmake-modules, kconfig, kcoreaddons
+, kcrash, kdbusaddons, kdoctools, ki18n, kwindowsystem
+}:
+
+kdeFramework {
+  name = "kservice";
+  propagatedNativeBuildInputs = [ extra-cmake-modules ];
+  nativeBuildInputs = [ kdoctools ];
+  buildInputs = [ kcrash kdbusaddons ];
+  propagatedBuildInputs = [ kconfig kcoreaddons ki18n kwindowsystem ];
+  patches = [
+    ./0001-qdiriterator-follow-symlinks.patch
+    ./0002-no-canonicalize-path.patch
+  ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kservice/setup-hook.sh b/pkgs/desktops/kde-5/frameworks-5.21/kservice/setup-hook.sh
new file mode 100644
index 00000000000..c28e862ff8a
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kservice/setup-hook.sh
@@ -0,0 +1,43 @@
+addServicePkg() {
+    local propagated
+    for dir in "share/kservices5" "share/kservicetypes5"; do
+        if [[ -d "$1/$dir" ]]; then
+            propagated=
+            for pkg in $propagatedBuildInputs; do
+                if [[ "z$pkg" == "z$1" ]]; then
+                    propagated=1
+                    break
+                fi
+            done
+            if [[ -z $propagated ]]; then
+                propagatedBuildInputs="$propagatedBuildInputs $1"
+            fi
+
+            propagated=
+            for pkg in $propagatedUserEnvPkgs; do
+                if [[ "z$pkg" == "z$1" ]]; then
+                    propagated=1
+                    break
+                fi
+            done
+            if [[ -z $propagated ]]; then
+                propagatedUserEnvPkgs="$propagatedUserEnvPkgs $1"
+            fi
+
+            break
+        fi
+    done
+}
+
+envHooks+=(addServicePkg)
+
+local propagated
+for pkg in $propagatedBuildInputs; do
+    if [[ "z$pkg" == "z@out@" ]]; then
+        propagated=1
+        break
+    fi
+done
+if [[ -z $propagated ]]; then
+    propagatedBuildInputs="$propagatedBuildInputs @out@"
+fi
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/ktexteditor/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/ktexteditor/default.nix
new file mode 100644
index 00000000000..b8df6a5f4c0
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/ktexteditor/default.nix
@@ -0,0 +1,22 @@
+{ kdeFramework, lib, copyPathsToStore
+, extra-cmake-modules, makeQtWrapper, perl
+, karchive, kconfig, kguiaddons, kiconthemes, kparts
+, libgit2
+, qtscript, qtxmlpatterns
+, ki18n, kio, sonnet
+}:
+
+kdeFramework {
+  name = "ktexteditor";
+  nativeBuildInputs = [ extra-cmake-modules makeQtWrapper perl ];
+  buildInputs = [
+    karchive kconfig kguiaddons kiconthemes kparts
+    libgit2
+    qtscript qtxmlpatterns
+  ];
+  propagatedBuildInputs = [ ki18n kio sonnet ];
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/ktexteditor/no-qcoreapplication.patch b/pkgs/desktops/kde-5/frameworks-5.21/ktexteditor/no-qcoreapplication.patch
new file mode 100644
index 00000000000..19ab1e1e551
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/ktexteditor/no-qcoreapplication.patch
@@ -0,0 +1,36 @@
+Index: ktexteditor-5.18.0/src/syntax/data/katehighlightingindexer.cpp
+===================================================================
+--- ktexteditor-5.18.0.orig/src/syntax/data/katehighlightingindexer.cpp
++++ ktexteditor-5.18.0/src/syntax/data/katehighlightingindexer.cpp
+@@ -55,19 +55,16 @@ QStringList readListing(const QString &f
+ 
+ int main(int argc, char *argv[])
+ {
+-    // get app instance
+-    QCoreApplication app(argc, argv);
+-
+     // ensure enough arguments are passed
+-    if (app.arguments().size() < 3)
++    if (argc < 3)
+         return 1;
+ 
+     // open schema
+     QXmlSchema schema;
+-    if (!schema.load(QUrl::fromLocalFile(app.arguments().at(2))))
++    if (!schema.load(QUrl::fromLocalFile(QString::fromLocal8Bit(argv[2]))))
+         return 2;
+ 
+-    const QString hlFilenamesListing = app.arguments().value(3);
++    const QString hlFilenamesListing = QString::fromLocal8Bit(argv[3]);
+     if (hlFilenamesListing.isEmpty()) {
+         return 1;
+     }
+@@ -152,7 +149,7 @@ int main(int argc, char *argv[])
+         return anyError;
+ 
+     // create outfile, after all has worked!
+-    QFile outFile(app.arguments().at(1));
++    QFile outFile(QString::fromLocal8Bit(argv[1]));
+     if (!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
+         return 7;
+ 
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/ktexteditor/series b/pkgs/desktops/kde-5/frameworks-5.21/ktexteditor/series
new file mode 100644
index 00000000000..46cd23829a2
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/ktexteditor/series
@@ -0,0 +1 @@
+no-qcoreapplication.patch
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/ktextwidgets.nix b/pkgs/desktops/kde-5/frameworks-5.21/ktextwidgets.nix
new file mode 100644
index 00000000000..e332d4ff9a8
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/ktextwidgets.nix
@@ -0,0 +1,16 @@
+{ kdeFramework, lib, extra-cmake-modules, kcompletion, kconfig
+, kconfigwidgets, ki18n, kiconthemes, kservice, kwindowsystem
+, sonnet
+}:
+
+kdeFramework {
+  name = "ktextwidgets";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    kcompletion kconfig kconfigwidgets kiconthemes kservice
+  ];
+  propagatedBuildInputs = [ ki18n kwindowsystem sonnet ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kunitconversion.nix b/pkgs/desktops/kde-5/frameworks-5.21/kunitconversion.nix
new file mode 100644
index 00000000000..3cf0f847d83
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kunitconversion.nix
@@ -0,0 +1,10 @@
+{ kdeFramework, lib, extra-cmake-modules, ki18n }:
+
+kdeFramework {
+  name = "kunitconversion";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  propagatedBuildInputs = [ ki18n ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kwallet.nix b/pkgs/desktops/kde-5/frameworks-5.21/kwallet.nix
new file mode 100644
index 00000000000..5ade5f63a8d
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kwallet.nix
@@ -0,0 +1,21 @@
+{ kdeFramework, lib, extra-cmake-modules, kconfig, kconfigwidgets
+, kcoreaddons , kdbusaddons, kdoctools, ki18n, kiconthemes
+, knotifications , kservice, kwidgetsaddons, kwindowsystem, libgcrypt
+, makeQtWrapper }:
+
+kdeFramework {
+  name = "kwallet";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools makeQtWrapper ];
+  buildInputs = [
+    kconfig kconfigwidgets kcoreaddons kdbusaddons kiconthemes
+    knotifications kservice kwidgetsaddons libgcrypt
+  ];
+  propagatedBuildInputs = [ ki18n kwindowsystem ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/kwalletd5"
+    wrapQtProgram "$out/bin/kwallet-query"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kwidgetsaddons.nix b/pkgs/desktops/kde-5/frameworks-5.21/kwidgetsaddons.nix
new file mode 100644
index 00000000000..d95f44d3fec
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kwidgetsaddons.nix
@@ -0,0 +1,11 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+}:
+
+kdeFramework {
+  name = "kwidgetsaddons";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kwindowsystem.nix b/pkgs/desktops/kde-5/frameworks-5.21/kwindowsystem.nix
new file mode 100644
index 00000000000..09ab1f2200d
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kwindowsystem.nix
@@ -0,0 +1,13 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, qtx11extras
+}:
+
+kdeFramework {
+  name = "kwindowsystem";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ qtx11extras ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kxmlgui.nix b/pkgs/desktops/kde-5/frameworks-5.21/kxmlgui.nix
new file mode 100644
index 00000000000..f081d5f9170
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kxmlgui.nix
@@ -0,0 +1,18 @@
+{ kdeFramework, lib, extra-cmake-modules, attica, kconfig
+, kconfigwidgets, kglobalaccel, ki18n, kiconthemes, kitemviews
+, ktextwidgets, kwindowsystem, sonnet
+}:
+
+kdeFramework {
+  name = "kxmlgui";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    attica kconfig kiconthemes kitemviews ktextwidgets
+  ];
+  propagatedBuildInputs = [
+    kconfigwidgets kglobalaccel ki18n kwindowsystem sonnet
+  ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/kxmlrpcclient.nix b/pkgs/desktops/kde-5/frameworks-5.21/kxmlrpcclient.nix
new file mode 100644
index 00000000000..20a300b68bc
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/kxmlrpcclient.nix
@@ -0,0 +1,10 @@
+{ kdeFramework, lib, extra-cmake-modules, ki18n, kio }:
+
+kdeFramework {
+  name = "kxmlrpcclient";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  propagatedBuildInputs = [ ki18n kio ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/modemmanager-qt.nix b/pkgs/desktops/kde-5/frameworks-5.21/modemmanager-qt.nix
new file mode 100644
index 00000000000..7d7f769d6a9
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/modemmanager-qt.nix
@@ -0,0 +1,13 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, modemmanager
+}:
+
+kdeFramework {
+  name = "modemmanager-qt";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  propagatedBuildInputs = [ modemmanager ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/networkmanager-qt.nix b/pkgs/desktops/kde-5/frameworks-5.21/networkmanager-qt.nix
new file mode 100644
index 00000000000..333378bd143
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/networkmanager-qt.nix
@@ -0,0 +1,13 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, networkmanager
+}:
+
+kdeFramework {
+  name = "networkmanager-qt";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  propagatedBuildInputs = [ networkmanager ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/oxygen-icons5.nix b/pkgs/desktops/kde-5/frameworks-5.21/oxygen-icons5.nix
new file mode 100644
index 00000000000..ee350f8e153
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/oxygen-icons5.nix
@@ -0,0 +1,13 @@
+{ kdeFramework
+, lib
+, extra-cmake-modules
+}:
+
+kdeFramework {
+  name = "oxygen-icons5";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  meta = {
+    license = lib.licenses.lgpl3Plus;
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/plasma-framework/default.nix b/pkgs/desktops/kde-5/frameworks-5.21/plasma-framework/default.nix
new file mode 100644
index 00000000000..d8846f77723
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/plasma-framework/default.nix
@@ -0,0 +1,25 @@
+{ kdeFramework, lib, extra-cmake-modules, kactivities, karchive
+, kconfig, kconfigwidgets, kcoreaddons, kdbusaddons, kdeclarative
+, kdoctools, kglobalaccel, kguiaddons, ki18n, kiconthemes, kio
+, knotifications, kpackage, kservice, kwindowsystem, kxmlgui
+, makeQtWrapper, qtscript, qtx11extras
+}:
+
+kdeFramework {
+  name = "plasma-framework";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools makeQtWrapper ];
+  buildInputs = [
+    karchive kconfig kconfigwidgets kcoreaddons kdbusaddons kguiaddons
+    kiconthemes knotifications kxmlgui qtscript
+  ];
+  propagatedBuildInputs = [
+    kactivities kdeclarative kglobalaccel ki18n kio kpackage kservice kwindowsystem
+    qtx11extras
+  ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/plasmapkg2"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/solid.nix b/pkgs/desktops/kde-5/frameworks-5.21/solid.nix
new file mode 100644
index 00000000000..afd125e3c59
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/solid.nix
@@ -0,0 +1,17 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, makeQtWrapper
+, qtdeclarative
+}:
+
+kdeFramework {
+  name = "solid";
+  nativeBuildInputs = [ extra-cmake-modules makeQtWrapper ];
+  buildInputs = [ qtdeclarative ];
+  postInstall = ''
+    wrapQtProgram "$out/bin/solid-hardware5"
+  '';
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/sonnet.nix b/pkgs/desktops/kde-5/frameworks-5.21/sonnet.nix
new file mode 100644
index 00000000000..943fe04a1c9
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/sonnet.nix
@@ -0,0 +1,13 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+, hunspell
+}:
+
+kdeFramework {
+  name = "sonnet";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ hunspell ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/srcs.nix b/pkgs/desktops/kde-5/frameworks-5.21/srcs.nix
new file mode 100644
index 00000000000..a4a1f95c52c
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/srcs.nix
@@ -0,0 +1,573 @@
+# DO NOT EDIT! This file is generated automatically by fetchsrcs.sh
+{ fetchurl, mirror }:
+
+{
+  attica = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/attica-5.21.0.tar.xz";
+      sha256 = "1aqfw73g424f60qmpx1lky3qfqrsl1id02388pnlmpa8fnpp940c";
+      name = "attica-5.21.0.tar.xz";
+    };
+  };
+  baloo = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/baloo-5.21.0.tar.xz";
+      sha256 = "1a5sl2bkrs90mfks93q2hrijp6dpapp2l0fhq7km36mvsrc78yqn";
+      name = "baloo-5.21.0.tar.xz";
+    };
+  };
+  bluez-qt = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/bluez-qt-5.21.0.tar.xz";
+      sha256 = "0nsnxa4k31l69fapxn49g112948zprc5xr7v3ggxwnxkb1pll60a";
+      name = "bluez-qt-5.21.0.tar.xz";
+    };
+  };
+  breeze-icons = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/breeze-icons-5.21.0.tar.xz";
+      sha256 = "1a7ikdq8a44n42i6swf29aqyfwjh05ir3ym0lzjzdb6133fzlb01";
+      name = "breeze-icons-5.21.0.tar.xz";
+    };
+  };
+  extra-cmake-modules = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/extra-cmake-modules-5.21.0.tar.xz";
+      sha256 = "1kbc5fkcbz9vkg0jpz10vsfgwajlrsmbl0vrbls5qvrdgbgrwlm3";
+      name = "extra-cmake-modules-5.21.0.tar.xz";
+    };
+  };
+  frameworkintegration = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/frameworkintegration-5.21.0.tar.xz";
+      sha256 = "0mbpn18cjzd8xznk73slvals86lv77ram09px4l44xgyf019xll8";
+      name = "frameworkintegration-5.21.0.tar.xz";
+    };
+  };
+  kactivities = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kactivities-5.21.0.tar.xz";
+      sha256 = "09jr7m6vaffdb879jph1ckgri0b9pdyh5q39i7fyi6s277rybcyk";
+      name = "kactivities-5.21.0.tar.xz";
+    };
+  };
+  kactivities-stats = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kactivities-stats-5.21.0.tar.xz";
+      sha256 = "0vd01b812r0ggbnqsq3y6ik68v0668rzx6npl3h11wdrvlidhyqf";
+      name = "kactivities-stats-5.21.0.tar.xz";
+    };
+  };
+  kapidox = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kapidox-5.21.0.tar.xz";
+      sha256 = "0w3jch93d8vdqd0g4yl2fxmamrg9hnx1lypnpgw7615wlsb02qyx";
+      name = "kapidox-5.21.0.tar.xz";
+    };
+  };
+  karchive = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/karchive-5.21.0.tar.xz";
+      sha256 = "042ww21wmm3sf87zqgr2qiyg2j5mjf1mmqpqhpcax4gnjpck5nvc";
+      name = "karchive-5.21.0.tar.xz";
+    };
+  };
+  kauth = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kauth-5.21.0.tar.xz";
+      sha256 = "03dy36g9y04p3533l2y0m0jlr91m94y0i4wpnlr5ndgccif2a63r";
+      name = "kauth-5.21.0.tar.xz";
+    };
+  };
+  kbookmarks = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kbookmarks-5.21.0.tar.xz";
+      sha256 = "0qxq5wbddaj1cpjd34q8k65brfbb677gs0y5zh24mqbwcr0rfs6g";
+      name = "kbookmarks-5.21.0.tar.xz";
+    };
+  };
+  kcmutils = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kcmutils-5.21.0.tar.xz";
+      sha256 = "01ch3y43r4cb1sj0gy5a8wq3c6wpx2brn96d7rjm3r3hh5n5xdlj";
+      name = "kcmutils-5.21.0.tar.xz";
+    };
+  };
+  kcodecs = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kcodecs-5.21.0.tar.xz";
+      sha256 = "0wng7kqqxrsz7b4w163j6m2zdhb5pvgbd9n6bn7ggyldn4zl86w7";
+      name = "kcodecs-5.21.0.tar.xz";
+    };
+  };
+  kcompletion = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kcompletion-5.21.0.tar.xz";
+      sha256 = "0r6gsnsjkfvwhrpkch7y44m2yqyxb42bdkc35jxrm8y7xaa8nwi4";
+      name = "kcompletion-5.21.0.tar.xz";
+    };
+  };
+  kconfig = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kconfig-5.21.0.tar.xz";
+      sha256 = "0w5wvy3yhgh64k8jghyv5fkx9jr828yl11jlihg24hfplnmihkxw";
+      name = "kconfig-5.21.0.tar.xz";
+    };
+  };
+  kconfigwidgets = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kconfigwidgets-5.21.0.tar.xz";
+      sha256 = "030iq46bwiaixn2wf6285y2gg7h1y5xqf6d6bg3xcz0v1xjd3n0f";
+      name = "kconfigwidgets-5.21.0.tar.xz";
+    };
+  };
+  kcoreaddons = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kcoreaddons-5.21.0.tar.xz";
+      sha256 = "16226z60simxgfriwsm6srx39f7wm64mdl39qxaa77wn07i8xmsi";
+      name = "kcoreaddons-5.21.0.tar.xz";
+    };
+  };
+  kcrash = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kcrash-5.21.0.tar.xz";
+      sha256 = "1mrbmfkzd0dy42ppq8gl1z9liprq722w4f3a499iamqnlsdwq2w8";
+      name = "kcrash-5.21.0.tar.xz";
+    };
+  };
+  kdbusaddons = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kdbusaddons-5.21.0.tar.xz";
+      sha256 = "1yvpan0plm80sw0wai39ffvpswyzy7xiqra69cb8mfxcdl8acjjw";
+      name = "kdbusaddons-5.21.0.tar.xz";
+    };
+  };
+  kdeclarative = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kdeclarative-5.21.0.tar.xz";
+      sha256 = "1m61js8kdnif1106vxs5bv830hyj8j2whv5mlshkj9jbpp9v5qkj";
+      name = "kdeclarative-5.21.0.tar.xz";
+    };
+  };
+  kded = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kded-5.21.0.tar.xz";
+      sha256 = "138svq07zgabn6razkqp5zxdlw9ajr1966icd82mxsxq1cjgfl4g";
+      name = "kded-5.21.0.tar.xz";
+    };
+  };
+  kdelibs4support = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/portingAids/kdelibs4support-5.21.0.tar.xz";
+      sha256 = "1q1wyfry2ypa1mk01rabva0cq1ai9lmq8ygsji413p6c1avfrywc";
+      name = "kdelibs4support-5.21.0.tar.xz";
+    };
+  };
+  kdesignerplugin = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kdesignerplugin-5.21.0.tar.xz";
+      sha256 = "0rj79mdgdcm0wlramx5s53ba0jkhravcgkl570ds7s3wwa1aa62j";
+      name = "kdesignerplugin-5.21.0.tar.xz";
+    };
+  };
+  kdesu = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kdesu-5.21.0.tar.xz";
+      sha256 = "13daljcjgrvybj7hbv6l9cwc6cdh45d2zz2ch7cbar46z2zxh5qb";
+      name = "kdesu-5.21.0.tar.xz";
+    };
+  };
+  kdewebkit = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kdewebkit-5.21.0.tar.xz";
+      sha256 = "1rc5i265sagvbqwy96i4dnksc4vnrq864z3rkxqlrx2blwq08550";
+      name = "kdewebkit-5.21.0.tar.xz";
+    };
+  };
+  kdnssd = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kdnssd-5.21.0.tar.xz";
+      sha256 = "0k3qia322cd2h9pcf7k0fg7w91jxc503digjv93vhsfzfhbadf9l";
+      name = "kdnssd-5.21.0.tar.xz";
+    };
+  };
+  kdoctools = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kdoctools-5.21.0.tar.xz";
+      sha256 = "16ysqwvwmxas56rhg68rzkipszqqahh787ww9rkq9ak2r6d29r6c";
+      name = "kdoctools-5.21.0.tar.xz";
+    };
+  };
+  kemoticons = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kemoticons-5.21.0.tar.xz";
+      sha256 = "1paddfylh1xb4g4h939lzvy7f67syyfsx76gz7w5mdbnqk5xc7fc";
+      name = "kemoticons-5.21.0.tar.xz";
+    };
+  };
+  kfilemetadata = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kfilemetadata-5.21.0.tar.xz";
+      sha256 = "1jmcvzazcw5klmnzd17a7x6rcwjb6xdrxrn1jjiq8kibdbghx7l0";
+      name = "kfilemetadata-5.21.0.tar.xz";
+    };
+  };
+  kglobalaccel = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kglobalaccel-5.21.0.tar.xz";
+      sha256 = "1bdd613ybz1cl25sx3ihdfzsjwlxyjx9blidmzbnvv0lb2304hwp";
+      name = "kglobalaccel-5.21.0.tar.xz";
+    };
+  };
+  kguiaddons = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kguiaddons-5.21.0.tar.xz";
+      sha256 = "01hdrcdsiq3qs620jprv65kk4pvldlm70aghjsi9wk7j3x6qid2x";
+      name = "kguiaddons-5.21.0.tar.xz";
+    };
+  };
+  khtml = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/portingAids/khtml-5.21.0.tar.xz";
+      sha256 = "17xvzklhhp6k9wi94s7agc8qnb7gwvx3aa5jbq6d76qn0rsqbzhv";
+      name = "khtml-5.21.0.tar.xz";
+    };
+  };
+  ki18n = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/ki18n-5.21.0.tar.xz";
+      sha256 = "0qm9p77zqz2jy0j5yfv5v6pqska25p790yy1b6wg1gd67561q5bn";
+      name = "ki18n-5.21.0.tar.xz";
+    };
+  };
+  kiconthemes = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kiconthemes-5.21.0.tar.xz";
+      sha256 = "14a43jca1cyh45dbz5c9lc5yqc376qg3q2c420bk5s44ynpnhp4i";
+      name = "kiconthemes-5.21.0.tar.xz";
+    };
+  };
+  kidletime = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kidletime-5.21.0.tar.xz";
+      sha256 = "10vdx2sp3hjp20saqlyqdz83jbqhsqyk7gl063lhz00mnk7nk1mn";
+      name = "kidletime-5.21.0.tar.xz";
+    };
+  };
+  kimageformats = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kimageformats-5.21.0.tar.xz";
+      sha256 = "09m0w5f39y9gq0g00iapay3v09kk24lqwiyjq4y487il865p22ph";
+      name = "kimageformats-5.21.0.tar.xz";
+    };
+  };
+  kinit = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kinit-5.21.0.tar.xz";
+      sha256 = "19avsq0bi2ys574n0dcn65chd7wrpyp354xfsw45gig28skjiir5";
+      name = "kinit-5.21.0.tar.xz";
+    };
+  };
+  kio = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kio-5.21.0.tar.xz";
+      sha256 = "08wrjimkv255gbc9y7pxilwxi9nikg3196rzs0fbw4vqdlzl0gjq";
+      name = "kio-5.21.0.tar.xz";
+    };
+  };
+  kitemmodels = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kitemmodels-5.21.0.tar.xz";
+      sha256 = "1bp02vp08bwsd64wnrr3ivy4k8g1vzv1s5iyiqj99d1gk0fxvv7d";
+      name = "kitemmodels-5.21.0.tar.xz";
+    };
+  };
+  kitemviews = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kitemviews-5.21.0.tar.xz";
+      sha256 = "16yzcyrg8wa8fvz749x8dbixyga1ggls1fvjns6gdbz5aqm6ib4d";
+      name = "kitemviews-5.21.0.tar.xz";
+    };
+  };
+  kjobwidgets = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kjobwidgets-5.21.0.tar.xz";
+      sha256 = "0y8zmz6wx4igbpc0jlsxrr1yxgyq8hsmynl9fqy3lc2bzmwr9wcp";
+      name = "kjobwidgets-5.21.0.tar.xz";
+    };
+  };
+  kjs = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/portingAids/kjs-5.21.0.tar.xz";
+      sha256 = "0vsgmz0yn1if11xfbw3f9p0kg2dv1rb26ging4fc860wv2j5gyln";
+      name = "kjs-5.21.0.tar.xz";
+    };
+  };
+  kjsembed = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/portingAids/kjsembed-5.21.0.tar.xz";
+      sha256 = "1nbc12m86s90y8f5gp62l4f9v4hqy8cmzw4sh0655sczd5vbkvki";
+      name = "kjsembed-5.21.0.tar.xz";
+    };
+  };
+  kmediaplayer = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/portingAids/kmediaplayer-5.21.0.tar.xz";
+      sha256 = "1hz7l95w57z73wg9ypbqpkxvkw42wgbymv67lg4vdxppplnkqriz";
+      name = "kmediaplayer-5.21.0.tar.xz";
+    };
+  };
+  knewstuff = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/knewstuff-5.21.0.tar.xz";
+      sha256 = "05r11r9r789686i36y0x770f1pc7dwvqzdzclrx22r3lbz708pga";
+      name = "knewstuff-5.21.0.tar.xz";
+    };
+  };
+  knotifications = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/knotifications-5.21.0.tar.xz";
+      sha256 = "0iia73ai2s5w8c3j1kmc8bb7yp1d2cv0yd2k3ilaxf3y9wgsp4x8";
+      name = "knotifications-5.21.0.tar.xz";
+    };
+  };
+  knotifyconfig = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/knotifyconfig-5.21.0.tar.xz";
+      sha256 = "1mqal5ndr3v54lp7a9a2fm0c0hsiqb7kziw56rz0xd659328k9ix";
+      name = "knotifyconfig-5.21.0.tar.xz";
+    };
+  };
+  kpackage = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kpackage-5.21.0.tar.xz";
+      sha256 = "024k15v0b24hivkjpn3gwn2wdfsng9ralz414i858qj0lm688xk5";
+      name = "kpackage-5.21.0.tar.xz";
+    };
+  };
+  kparts = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kparts-5.21.0.tar.xz";
+      sha256 = "1s1nk1vdnb3g0ilv2b1m783h8g52yr9hpqz0vscj56m9cn2sf8rv";
+      name = "kparts-5.21.0.tar.xz";
+    };
+  };
+  kpeople = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kpeople-5.21.0.tar.xz";
+      sha256 = "0nfpv4g9zvja9sv3zbpyksbvz1xa8lmncg48awrwbrmf83bxvcjq";
+      name = "kpeople-5.21.0.tar.xz";
+    };
+  };
+  kplotting = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kplotting-5.21.0.tar.xz";
+      sha256 = "1hrpv1qg6qx4y4wvyq0rxfi0ngq1lgd5l3vwi00ri86xm1qbs4hk";
+      name = "kplotting-5.21.0.tar.xz";
+    };
+  };
+  kpty = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kpty-5.21.0.tar.xz";
+      sha256 = "1vzgpmagjggssva6r57hd094dv3vxf3gpsr3xpvspa9l1mk4d35c";
+      name = "kpty-5.21.0.tar.xz";
+    };
+  };
+  kross = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/portingAids/kross-5.21.0.tar.xz";
+      sha256 = "0c1gbaifzswz4dcdwzka5mnlm07i463dpwc2fihmzn67skm4ybix";
+      name = "kross-5.21.0.tar.xz";
+    };
+  };
+  krunner = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/portingAids/krunner-5.21.0.tar.xz";
+      sha256 = "1jn8fr83c71kz25yzd1qay9as6dvzl1xvlg1vyspdifxg43vqzq4";
+      name = "krunner-5.21.0.tar.xz";
+    };
+  };
+  kservice = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kservice-5.21.0.tar.xz";
+      sha256 = "19cnapz23ji5p01r9rgj91rzph3mqqrmnfwprmi9p3h2w68njhv6";
+      name = "kservice-5.21.0.tar.xz";
+    };
+  };
+  ktexteditor = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/ktexteditor-5.21.0.tar.xz";
+      sha256 = "1m9zipx5kisxsy037py709c2ri5qvix6n362l981kbbvcgkpiaq2";
+      name = "ktexteditor-5.21.0.tar.xz";
+    };
+  };
+  ktextwidgets = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/ktextwidgets-5.21.0.tar.xz";
+      sha256 = "11nsi6j9b2678bqaa0ykp8as5lw1v9421b73dd1qxqrpdqfkxyzn";
+      name = "ktextwidgets-5.21.0.tar.xz";
+    };
+  };
+  kunitconversion = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kunitconversion-5.21.0.tar.xz";
+      sha256 = "03vnls5df0c2bqyw9a04hlc3cn34y6xwx693klh27jmm37r776yh";
+      name = "kunitconversion-5.21.0.tar.xz";
+    };
+  };
+  kwallet = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kwallet-5.21.0.tar.xz";
+      sha256 = "1rmfy21r2p79gwg1kq26g2fqnclbsww9rz3py368pk4s1lrzafii";
+      name = "kwallet-5.21.0.tar.xz";
+    };
+  };
+  kwidgetsaddons = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kwidgetsaddons-5.21.0.tar.xz";
+      sha256 = "1gqyc0j77sm6i2511qnz0sllmfxjgjb9qpi8551np16zviqa52k7";
+      name = "kwidgetsaddons-5.21.0.tar.xz";
+    };
+  };
+  kwindowsystem = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kwindowsystem-5.21.0.tar.xz";
+      sha256 = "13lfwpw5a4in0mp5y8d15jg6xhhrka2qmw73wrdzcvj22n6ldzzi";
+      name = "kwindowsystem-5.21.0.tar.xz";
+    };
+  };
+  kxmlgui = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kxmlgui-5.21.0.tar.xz";
+      sha256 = "1cb6n016ffvxy8dbbhc3dwlzdqpq0pbvly416qlvlc1lv70lxyfj";
+      name = "kxmlgui-5.21.0.tar.xz";
+    };
+  };
+  kxmlrpcclient = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/kxmlrpcclient-5.21.0.tar.xz";
+      sha256 = "082qpnvgm9r81iip9akakbf5rqmxb0r8y6gp7jk49q29lvkrx1kh";
+      name = "kxmlrpcclient-5.21.0.tar.xz";
+    };
+  };
+  modemmanager-qt = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/modemmanager-qt-5.21.0.tar.xz";
+      sha256 = "1w0kjp2pmgss45g63930lbn1c018ld2snng6h40saxi76n8cv57n";
+      name = "modemmanager-qt-5.21.0.tar.xz";
+    };
+  };
+  networkmanager-qt = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/networkmanager-qt-5.21.0.tar.xz";
+      sha256 = "0iy4a4qb1am2y7w03jg6n7q69c46y4gdpb72r6qjrnm9d4c2xsg1";
+      name = "networkmanager-qt-5.21.0.tar.xz";
+    };
+  };
+  oxygen-icons5 = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/oxygen-icons5-5.21.0.tar.xz";
+      sha256 = "00qh1h3xx392hh73zdlknc1j9i2sck9ys74a9ffkf6an4rl0hws5";
+      name = "oxygen-icons5-5.21.0.tar.xz";
+    };
+  };
+  plasma-framework = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/plasma-framework-5.21.0.tar.xz";
+      sha256 = "006k8y8dnar371b5qhikny6rda3vg810jy53sl9yps695j0y39c0";
+      name = "plasma-framework-5.21.0.tar.xz";
+    };
+  };
+  solid = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/solid-5.21.0.tar.xz";
+      sha256 = "13r9zcf7sr6vg5wlqjms2q7vl4g8gpzqghp3y25ldglhj0z7252r";
+      name = "solid-5.21.0.tar.xz";
+    };
+  };
+  sonnet = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/sonnet-5.21.0.tar.xz";
+      sha256 = "088b87r80lds6jr0lnqxv0bd4isy2mkcgrq7hxfni7r2h6vn3xcd";
+      name = "sonnet-5.21.0.tar.xz";
+    };
+  };
+  threadweaver = {
+    version = "5.21.0";
+    src = fetchurl {
+      url = "${mirror}/stable/frameworks/5.21/threadweaver-5.21.0.tar.xz";
+      sha256 = "17l23jj9bsixhg3gpv5sjrlc6w1kmjwlfb0z17drdkyzs5ak80ry";
+      name = "threadweaver-5.21.0.tar.xz";
+    };
+  };
+}
diff --git a/pkgs/desktops/kde-5/frameworks-5.21/threadweaver.nix b/pkgs/desktops/kde-5/frameworks-5.21/threadweaver.nix
new file mode 100644
index 00000000000..52817921cc7
--- /dev/null
+++ b/pkgs/desktops/kde-5/frameworks-5.21/threadweaver.nix
@@ -0,0 +1,11 @@
+{ kdeFramework, lib
+, extra-cmake-modules
+}:
+
+kdeFramework {
+  name = "threadweaver";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  meta = {
+    maintainers = [ lib.maintainers.ttuegel ];
+  };
+}