summary refs log tree commit diff
path: root/pkgs/desktops/kde-4.14/kde-package/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/desktops/kde-4.14/kde-package/default.nix')
-rw-r--r--pkgs/desktops/kde-4.14/kde-package/default.nix131
1 files changed, 131 insertions, 0 deletions
diff --git a/pkgs/desktops/kde-4.14/kde-package/default.nix b/pkgs/desktops/kde-4.14/kde-package/default.nix
new file mode 100644
index 00000000000..c78dfbd8a36
--- /dev/null
+++ b/pkgs/desktops/kde-4.14/kde-package/default.nix
@@ -0,0 +1,131 @@
+{ callPackage, runCommand, stdenv, fetchurl, qt4, cmake, automoc4
+, release, branch, ignoreList, extraSubpkgs
+}:
+
+let
+  inherit (stdenv.lib) filter fold;
+  inherit (builtins) getAttr hasAttr remoteAttrs listToAttrs tail head;
+in
+rec {
+  manifest = import (./. + "/${release}.nix");
+
+  # src attribute for $name tarball
+  kdesrc = name: version: fetchurl {
+    url = "mirror://kde/" + (if manifest.stable then "" else "un")
+      + "stable/${release}/src/${name}-${version}.tar.xz";
+    sha256 = getAttr name manifest.hashes;
+  };
+
+  # Default meta attribute
+  defMeta = {
+    homepage = http://www.kde.org;
+    inherit branch;
+    platforms = stdenv.lib.platforms.linux;
+    inherit (qt4.meta) maintainers;
+  };
+
+  # KDE package built from the whole tarball
+  # This function is used both for monolithic modules and modules which are
+  # released as individual tarballs
+  kdeMonoPkg = name:
+    let n_ = name; v_ = getAttr name manifest.versions; in
+    a@{meta, name ? n_, version ? v_, ...}:
+    stdenv.mkDerivation ({
+      name = "${name}-${version}";
+      src = kdesrc name version;
+      meta = defMeta // meta;
+      enableParallelBuilding = true;
+    } // (removeAttrs a [ "meta" "name" ]));
+
+  # kdeMonoPkg wrapper for modules splitted upstream compatible with combinePkgs
+  # API.
+  kdeSplittedPkg = module: {name, sane ? name}: kdeMonoPkg name;
+
+  # Build subdirectory ${subdir} of tarball ${module}-${release}.tar.xz
+  kdeSubdirPkg = module:
+    {name, subdir ? name, sane ? name}:
+    let name_ = name; version_ = getAttr module manifest.versions; in
+    a@{cmakeFlags ? [], name ? name_, version ? version_, meta ? {}, ...}:
+    stdenv.mkDerivation ({
+      name = "${name}-${release}";
+      src = kdesrc module version;
+      cmakeFlags =
+        [ "-DDISABLE_ALL_OPTIONAL_SUBDIRECTORIES=TRUE"
+          "-DBUILD_doc=TRUE"
+          "-DBUILD_${subdir}=TRUE"
+        ] ++ cmakeFlags;
+      meta = defMeta // meta;
+      enableParallelBuilding = module.enableParallelBuilding or true;
+    } // (removeAttrs a [ "meta" "name" "cmakeFlags" ]));
+
+  # A KDE monolithic module
+  kdeMonoModule = name: path: callPackage path { kde = kdeMonoPkg name; };
+
+  # Combine packages in one module.
+  # Arguments:
+  #  * pkgFun --- a function of the following signature:
+  #               module: manifest_attrs: manual_attrs: derivation;
+  #  * module --- name of the module
+  #  * pkgs --- list of packages in manifest format
+  combinePkgs = pkgFun: module: pkgs:
+    let
+      f = p@{name, ...}:
+        callPackage (./.. + "/${module}/${name}.nix") { kde = pkgFun module p; };
+      list = map f pkgs;
+      attrs = listToAttrs (map
+        ({name, sane ? name, ...}@p: { name = sane; value = f p; })
+        pkgs);
+    in
+      runCommand "${module}-${release}"
+      ({passthru = attrs // {
+         propagatedUserEnvPackages = list;
+         projects = attrs;
+       };})
+        ''
+          mkdir -pv $out/nix-support
+          echo "${toString list}" | tee $out/nix-support/propagated-user-env-packages
+        '';
+
+  # Given manifest module data, return the module
+  kdeModule = { module, sane ? module, split, pkgs ? [] }:
+    let
+      pkgs_ = filterPkgs module pkgs;
+    in
+    # Module is splitted by upstream
+    if split then combinePkgs kdeSplittedPkg module pkgs_
+    # Monolithic module
+    else if pkgs == [] then kdeMonoModule module (./.. + "/${module}.nix")
+    # Module is splitted by us
+    else combinePkgs kdeSubdirPkg module pkgs_;
+
+  # The same, as nameValuePair with sane name
+  kdeModuleNV = a@{ module, sane ? module, ... }:
+    { name = sane; value = kdeModule a; };
+
+  filterPkgs = module: (p:
+      removeNames (stdenv.lib.attrByPath [module] [] ignoreList) p
+      ++ (stdenv.lib.attrByPath [module] [] extraSubpkgs));
+
+  # Remove attrsets with x.name in subst. Optimized for empty subst.
+  removeNames = subst: big:
+    fold (s: out: filter (x: x.name != s) out) big subst;
+
+  modules = listToAttrs (map kdeModuleNV manifest.modules);
+
+  splittedModuleList =
+    let
+      splitted = filter (a: a ? pkgs) manifest.modules;
+      names = map ({module, sane ? module, ...}: sane) splitted;
+    in
+    map (m: m.projects) (stdenv.lib.attrVals names modules);
+
+  individual =
+    stdenv.lib.zipAttrsWith
+    (
+      name: list:
+      if tail list == []
+      then head list
+      else abort "Multiple modules define ${name}"
+    )
+    splittedModuleList;
+}