nixpkgs/pkgs/kde/lib/mk-kde-derivation.nix
2024-09-20 08:54:48 +03:00

160 lines
4.7 KiB
Nix

self:
{
lib,
stdenv,
makeSetupHook,
fetchurl,
cmake,
qt6,
}:
let
dependencies = (lib.importJSON ../generated/dependencies.json).dependencies;
projectInfo = lib.importJSON ../generated/projects.json;
licenseInfo = lib.importJSON ../generated/licenses.json;
licensesBySpdxId =
(lib.mapAttrs' (_: v: {
name = v.spdxId or "unknown";
value = v;
}) lib.licenses)
// {
# https://community.kde.org/Policies/Licensing_Policy
"LicenseRef-KDE-Accepted-GPL" = lib.licenses.gpl3Plus;
"LicenseRef-KFQF-Accepted-GPL" = lib.licenses.gpl3Plus;
"LicenseRef-KDE-Accepted-LGPL" = lib.licenses.lgpl3Plus;
# https://sjfonts.sourceforge.net/
"LicenseRef-SJFonts" = lib.licenses.gpl2Plus;
# https://invent.kde.org/education/kiten/-/blob/master/LICENSES/LicenseRef-EDRDG.txt
"LicenseRef-EDRDG" = lib.licenses.cc-by-sa-30;
# https://invent.kde.org/kdevelop/kdevelop/-/blob/master/LICENSES/LicenseRef-MIT-KDevelop-Ideal.txt
"LicenseRef-MIT-KDevelop-Ideal" = lib.licenses.mit;
"FSFAP" = {
spdxId = "FSFAP";
fullName = "FSF All Permissive License";
};
"FSFULLR" = {
spdxId = "FSFULLR";
fullName = "FSF Unlimited License (with License Retention)";
};
"W3C-20150513" = {
spdxId = "W3C-20150513";
fullName = "W3C Software Notice and Document License (2015-05-13)";
};
"LGPL" = lib.licenses.lgpl2Plus;
# Technically not exact
"bzip2-1.0.6" = lib.licenses.bsdOriginal;
# FIXME: typo lol
"ICS" = lib.licenses.isc;
"BSD-3-clause" = lib.licenses.bsd3;
# These are only relevant to Qt commercial users
"Qt-Commercial-exception-1.0" = null;
"LicenseRef-Qt-Commercial" = null;
"LicenseRef-Qt-Commercial-exception-1.0" = null;
# FIXME: ???
"Qt-GPL-exception-1.0" = null;
"LicenseRef-Qt-LGPL-exception-1.0" = null;
"Qt-LGPL-exception-1.1" = null;
"LicenseRef-Qt-exception" = null;
"GCC-exception-3.1" = null;
"Bison-exception-2.2" = null;
"Font-exception-2.0" = null;
None = null;
};
moveDevHook = makeSetupHook { name = "kf6-move-dev-hook"; } ./move-dev-hook.sh;
in
{
pname,
version ? self.sources.${pname}.version,
src ? self.sources.${pname},
extraBuildInputs ? [ ],
extraNativeBuildInputs ? [ ],
extraPropagatedBuildInputs ? [ ],
extraCmakeFlags ? [ ],
excludeDependencies ? [ ],
...
}@args:
let
depNames = dependencies.${pname} or [ ];
filteredDepNames = builtins.filter (dep: !(builtins.elem dep excludeDependencies)) depNames;
# FIXME(later): this is wrong for cross, some of these things really need to go into nativeBuildInputs,
# but cross is currently very broken anyway, so we can figure this out later.
deps = map (dep: self.${dep}) filteredDepNames;
traceDuplicateDeps =
attrName: attrValue:
let
pretty = lib.generators.toPretty { };
duplicates = builtins.filter (dep: (builtins.elem (lib.getName dep) filteredDepNames)) attrValue;
in
if duplicates != [ ] then
lib.warn "Duplicate dependencies in ${attrName} of package ${pname}: ${pretty duplicates}"
else
lib.id;
traceAllDuplicateDeps = lib.flip lib.pipe [
(traceDuplicateDeps "extraBuildInputs" extraBuildInputs)
(traceDuplicateDeps "extraPropagatedBuildInputs" extraPropagatedBuildInputs)
];
defaultArgs = {
inherit version src;
outputs = [
"out"
"dev"
"devtools"
];
nativeBuildInputs = [
cmake
qt6.wrapQtAppsHook
moveDevHook
] ++ extraNativeBuildInputs;
buildInputs = [ qt6.qtbase ] ++ extraBuildInputs;
# FIXME: figure out what to propagate here
propagatedBuildInputs = deps ++ extraPropagatedBuildInputs;
strictDeps = true;
dontFixCmake = true;
cmakeFlags = [ "-DQT_MAJOR_VERSION=6" ] ++ extraCmakeFlags;
separateDebugInfo = true;
env.LANG = "C.UTF-8";
};
cleanArgs = builtins.removeAttrs args [
"extraBuildInputs"
"extraNativeBuildInputs"
"extraPropagatedBuildInputs"
"extraCmakeFlags"
"excludeDependencies"
"meta"
];
meta = {
description = projectInfo.${pname}.description;
homepage = "https://invent.kde.org/${projectInfo.${pname}.repo_path}";
license = lib.filter (l: l != null) (map (l: licensesBySpdxId.${l}) licenseInfo.${pname});
maintainers = lib.teams.qt-kde.members;
# Platforms are currently limited to what upstream tests in CI, but can be extended if there's interest.
platforms = lib.platforms.linux ++ lib.platforms.freebsd;
} // (args.meta or { });
pos = builtins.unsafeGetAttrPos "pname" args;
in
traceAllDuplicateDeps (stdenv.mkDerivation (defaultArgs // cleanArgs // { inherit meta pos; }))