Merge pull request #286522 from K900/plasma-6

Plasma 6
This commit is contained in:
K900 2024-02-28 18:58:50 +03:00 committed by GitHub
commit d237e4e855
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
479 changed files with 26724 additions and 135 deletions

View File

@ -108,3 +108,7 @@ charset = unset
[lib/tests/*.plist]
indent_style = tab
insert_final_newline = unset
[pkgs/kde/generated/**]
insert_final_newline = unset
end_of_line = unset

17
.github/CODEOWNERS vendored
View File

@ -185,11 +185,18 @@ pkgs/development/python-modules/buildcatrust/ @ajs124 @lukegb @mweinelt
# Licenses
/lib/licenses.nix @alyssais
# Qt / KDE
/pkgs/applications/kde @ttuegel
/pkgs/desktops/plasma-5 @ttuegel
/pkgs/development/libraries/kde-frameworks @ttuegel
/pkgs/development/libraries/qt-5 @ttuegel
# Qt
/pkgs/development/libraries/qt-5 @NixOS/qt-kde
/pkgs/development/libraries/qt-6 @NixOS/qt-kde
# KDE / Plasma 5
/pkgs/applications/kde @NixOS/qt-kde
/pkgs/desktops/plasma-5 @NixOS/qt-kde
/pkgs/development/libraries/kde-frameworks @NixOS/qt-kde
# KDE / Plasma 6
/pkgs/kde @NixOS/qt-kde
/maintainers/scripts/kde @NixOS/qt-kde
# PostgreSQL and related stuff
/pkgs/servers/sql/postgresql @thoughtpolice @marsam

View File

@ -0,0 +1,31 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p gnutar jq reuse
set -eu
cd "$(dirname "$(readlink -f "$0")")"/../../..
TMPDIR=$(mktemp -d)
trap 'rm -rf $TMPDIR' EXIT
echo "# Prebuilding sources..."
nix-build -A kdePackages.sources --no-link || true
echo "# Evaluating sources..."
declare -A sources
eval "$(nix-instantiate --eval -A kdePackages.sources --json --strict | jq 'to_entries[] | "sources[" + .key + "]=" + .value' -r)"
echo "# Collecting licenses..."
for k in "${!sources[@]}"; do
echo "- Processing $k..."
if [ ! -f "${sources[$k]}" ]; then
echo "Not found!"
continue
fi
mkdir "$TMPDIR/$k"
tar -C "$TMPDIR/$k" -xf "${sources[$k]}"
(cd "$TMPDIR/$k"; reuse lint --json) | jq --arg name "$k" '{$name: .summary.used_licenses | sort}' -c > "$TMPDIR/$k.json"
done
jq -s 'add' -S "$TMPDIR"/*.json > pkgs/kde/generated/licenses.json

View File

@ -0,0 +1,11 @@
#!/usr/bin/env nix-shell
#!nix-shell -i nu -p nushell
cd $"($env.FILE_PWD)/../../.."
mkdir logs
nix-env -qaP -f . -A kdePackages --json --out-path | from json | values | par-each { |it|
echo $"Processing ($it.pname)..."
if "outputs" in $it {
nix-store --read-log $it.outputs.out | save -f $"logs/($it.pname).log"
}
}

View File

@ -0,0 +1,36 @@
#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p "python3.withPackages(ps: [ ps.click ps.pyyaml ])"
import pathlib
import click
import utils
@click.command
@click.argument(
"repo-metadata",
type=click.Path(
exists=True,
file_okay=False,
resolve_path=True,
path_type=pathlib.Path,
),
)
@click.option(
"--nixpkgs",
type=click.Path(
exists=True,
file_okay=False,
resolve_path=True,
writable=True,
path_type=pathlib.Path,
),
default=pathlib.Path(__file__).parent.parent.parent.parent
)
def main(repo_metadata: pathlib.Path, nixpkgs: pathlib.Path):
metadata = utils.KDERepoMetadata.from_repo_metadata_checkout(repo_metadata)
out_dir = nixpkgs / "pkgs/kde/generated"
metadata.write_json(out_dir)
if __name__ == "__main__":
main() # type: ignore

View File

@ -0,0 +1,127 @@
#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p python3
import pathlib
OK_MISSING = {
# we don't use precompiled QML
'Qt6QuickCompiler',
'Qt6QmlCompilerPlusPrivate',
# usually used for version numbers
'Git',
# useless by itself, will warn if something else is not found
'PkgConfig',
# license verification
'ReuseTool',
# dev only
'ClangFormat',
# doesn't exist
'Qt6X11Extras',
}
OK_MISSING_BY_PACKAGE = {
"angelfish": {
"Qt6Feedback", # we don't have it
},
"attica": {
"Python3", # only used for license checks
},
"discover": {
"rpm-ostree-1", # we don't have rpm-ostree (duh)
"Snapd", # we don't have snaps and probably never will
},
"elisa": {
"UPNPQT", # upstream says it's broken
},
"extra-cmake-modules": {
"Sphinx", # only used for docs, bloats closure size
"QCollectionGenerator"
},
"kio-extras-kf5": {
"KDSoapWSDiscoveryClient", # actually vendored on KF5 version
},
"kitinerary": {
"OsmTools", # used for map data updates, we use prebuilt
},
"kosmindoormap": {
"OsmTools", # same
"Protobuf",
},
"kpty": {
"UTEMPTER", # we don't have it and it probably wouldn't work anyway
},
"kpublictransport": {
"OsmTools", # same
"PolyClipping",
"Protobuf",
},
"krfb": {
"Qt6XkbCommonSupport", # not real
},
"kuserfeedback": {
"Qt6Svg", # all used for backend console stuff we don't ship
"QmlLint",
"Qt6Charts",
"FLEX",
"BISON",
"Php",
"PhpUnit",
},
"kwin": {
"display-info", # newer versions identify as libdisplay-info
},
"mlt": {
"Qt5", # intentionally disabled
"SWIG",
},
"plasma-desktop": {
"scim", # upstream is dead, not packaged in Nixpkgs
},
"powerdevil": {
"DDCUtil", # cursed, intentionally disabled
},
"pulseaudio-qt": {
"Qt6Qml", # tests only
"Qt6Quick",
},
"syntax-highlighting": {
"XercesC", # only used for extra validation at build time
}
}
def main():
here = pathlib.Path(__file__).parent.parent.parent.parent
logs = (here / "logs").glob("*.log")
for log in sorted(logs):
pname = log.stem
missing = []
is_in_block = False
with log.open(errors="replace") as fd:
for line in fd:
line = line.strip()
if line.startswith("-- No package '"):
package = line.removeprefix("-- No package '").removesuffix("' found")
missing.append(package)
if line == "-- The following OPTIONAL packages have not been found:" or line == "-- The following RECOMMENDED packages have not been found:":
is_in_block = True
elif line.startswith("--") and is_in_block:
is_in_block = False
elif line.startswith("*") and is_in_block:
package = line.removeprefix("* ")
missing.append(package)
missing = {
package
for package in missing
if not any(package.startswith(i) for i in OK_MISSING | OK_MISSING_BY_PACKAGE.get(pname, set()))
}
if missing:
print(pname + ":")
for line in missing:
print(" -", line)
print()
if __name__ == '__main__':
main()

View File

@ -0,0 +1,113 @@
#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p "python3.withPackages(ps: [ ps.beautifulsoup4 ps.click ps.httpx ps.jinja2 ps.pyyaml ])
import base64
import binascii
import json
import pathlib
from urllib.parse import urlparse
import bs4
import click
import httpx
import jinja2
import utils
LEAF_TEMPLATE = jinja2.Template('''
{mkKdeDerivation}:
mkKdeDerivation {
pname = "{{ pname }}";
}
'''.strip())
ROOT_TEMPLATE = jinja2.Template('''
{callPackage}: {
{%- for p in packages %}
{{ p }} = callPackage ./{{ p }} {};
{%- endfor %}
}
'''.strip());
def to_sri(hash):
raw = binascii.unhexlify(hash)
b64 = base64.b64encode(raw).decode()
return f"sha256-{b64}"
@click.command
@click.argument(
"set",
type=click.Choice(["frameworks", "gear", "plasma"]),
required=True
)
@click.argument(
"version",
type=str,
required=True
)
@click.option(
"--nixpkgs",
type=click.Path(
exists=True,
file_okay=False,
resolve_path=True,
writable=True,
path_type=pathlib.Path,
),
default=pathlib.Path(__file__).parent.parent.parent.parent
)
def main(set: str, version: str, nixpkgs: pathlib.Path):
root_dir = nixpkgs / "pkgs/kde"
set_dir = root_dir / set
generated_dir = root_dir / "generated"
metadata = utils.KDERepoMetadata.from_json(generated_dir)
set_url = {
"frameworks": "kf",
"gear": "releases",
"plasma": "plasma",
}[set]
sources = httpx.get(f"https://kde.org/info/sources/source-{set_url}-{version}.html")
sources.raise_for_status()
bs = bs4.BeautifulSoup(sources.text, features="html.parser")
results = {}
for item in bs.select("tr")[1:]:
link = item.select_one("td:nth-child(1) a")
assert link
hash = item.select_one("td:nth-child(3) tt")
assert hash
project_name, version = link.text.rsplit("-", maxsplit=1)
if project_name not in metadata.projects_by_name:
print(f"Warning: unknown tarball: {project_name}")
results[project_name] = {
"version": version,
"url": "mirror://kde" + urlparse(link.attrs["href"]).path,
"hash": to_sri(hash.text)
}
pkg_dir = set_dir / project_name
pkg_file = pkg_dir / "default.nix"
if not pkg_file.exists():
print(f"Generated new package: {set}/{project_name}")
pkg_dir.mkdir(parents=True, exist_ok=True)
with pkg_file.open("w") as fd:
fd.write(LEAF_TEMPLATE.render(pname=project_name) + "\n")
set_dir.mkdir(parents=True, exist_ok=True)
with (set_dir / "default.nix").open("w") as fd:
fd.write(ROOT_TEMPLATE.render(packages=results.keys()) + "\n")
sources_dir = generated_dir / "sources"
sources_dir.mkdir(parents=True, exist_ok=True)
with (sources_dir / f"{set}.json").open("w") as fd:
json.dump(results, fd, indent=2)
if __name__ == "__main__":
main() # type: ignore

View File

@ -0,0 +1,185 @@
import collections
import dataclasses
import functools
import json
import pathlib
import subprocess
import yaml
class DataclassEncoder(json.JSONEncoder):
def default(self, it):
if dataclasses.is_dataclass(it):
return dataclasses.asdict(it)
return super().default(it)
@dataclasses.dataclass
class Project:
name: str
description: str | None
project_path: str
repo_path: str | None
def __hash__(self) -> int:
return hash(self.name)
@classmethod
def from_yaml(cls, path: pathlib.Path):
data = yaml.safe_load(path.open())
return cls(
name=data["identifier"],
description=data["description"],
project_path=data["projectpath"],
repo_path=data["repopath"]
)
def get_git_commit(path: pathlib.Path):
return subprocess.check_output(["git", "-C", path, "rev-parse", "--short", "HEAD"]).decode().strip()
def validate_unique(projects: list[Project], attr: str):
seen = set()
for item in projects:
attr_value = getattr(item, attr)
if attr_value in seen:
raise Exception(f"Duplicate {attr}: {attr_value}")
seen.add(attr_value)
THIRD_PARTY = {
"third-party/appstream": "appstream-qt",
"third-party/cmark": "cmark",
"third-party/gpgme": "gpgme",
"third-party/kdsoap": "kdsoap",
"third-party/libaccounts-qt": "accounts-qt",
"third-party/libgpg-error": "libgpg-error",
"third-party/libquotient": "libquotient",
"third-party/packagekit-qt": "packagekit-qt",
"third-party/poppler": "poppler",
"third-party/qcoro": "qcoro",
"third-party/qmltermwidget": "qmltermwidget",
"third-party/qtkeychain": "qtkeychain",
"third-party/signond": "signond",
"third-party/taglib": "taglib",
"third-party/wayland-protocols": "wayland-protocols",
"third-party/wayland": "wayland",
"third-party/zxing-cpp": "zxing-cpp",
}
IGNORE = {
"kdesupport/phonon-directshow",
"kdesupport/phonon-mmf",
"kdesupport/phonon-mplayer",
"kdesupport/phonon-quicktime",
"kdesupport/phonon-waveout",
"kdesupport/phonon-xine"
}
WARNED = set()
@dataclasses.dataclass
class KDERepoMetadata:
version: str
projects: list[Project]
dep_graph: dict[Project, set[Project]]
@functools.cached_property
def projects_by_name(self):
return {p.name: p for p in self.projects}
@functools.cached_property
def projects_by_path(self):
return {p.project_path: p for p in self.projects}
def try_lookup_package(self, path):
if path in IGNORE:
return None
project = self.projects_by_path.get(path)
if project is None and path not in WARNED:
WARNED.add(path)
print(f"Warning: unknown project {path}")
return project
@classmethod
def from_repo_metadata_checkout(cls, repo_metadata: pathlib.Path):
projects = [
Project.from_yaml(metadata_file)
for metadata_file in repo_metadata.glob("projects-invent/**/metadata.yaml")
] + [
Project(id, None, project_path, None)
for project_path, id in THIRD_PARTY.items()
]
validate_unique(projects, "name")
validate_unique(projects, "project_path")
self = cls(
version=get_git_commit(repo_metadata),
projects=projects,
dep_graph={},
)
dep_specs = [
"dependency-data-common",
"dependency-data-kf6-qt6"
]
dep_graph = collections.defaultdict(set)
for spec in dep_specs:
spec_path = repo_metadata / "dependencies" / spec
for line in spec_path.open():
line = line.strip()
if line.startswith("#"):
continue
if not line:
continue
dependent, dependency = line.split(": ")
dependent = self.try_lookup_package(dependent)
if dependent is None:
continue
dependency = self.try_lookup_package(dependency)
if dependency is None:
continue
dep_graph[dependent].add(dependency)
self.dep_graph = dep_graph
return self
def write_json(self, root: pathlib.Path):
root.mkdir(parents=True, exist_ok=True)
with (root / "projects.json").open("w") as fd:
json.dump(self.projects_by_name, fd, cls=DataclassEncoder, sort_keys=True, indent=2)
with (root / "dependencies.json").open("w") as fd:
deps = {k.name: sorted(dep.name for dep in v) for k, v in self.dep_graph.items()}
json.dump({"version": self.version, "dependencies": deps}, fd, cls=DataclassEncoder, sort_keys=True, indent=2)
@classmethod
def from_json(cls, root: pathlib.Path):
projects = [
Project(**v) for v in json.load((root / "projects.json").open()).values()
]
deps = json.load((root / "dependencies.json").open())
self = cls(
version=deps["version"],
projects=projects,
dep_graph={},
)
dep_graph = collections.defaultdict(set)
for dependent, dependencies in deps["dependencies"].items():
for dependency in dependencies:
dep_graph[self.projects_by_name[dependent]].add(self.projects_by_name[dependency])
self.dep_graph = dep_graph
return self

View File

@ -52,6 +52,8 @@ In addition to numerous new and upgraded packages, this release has the followin
}
```
- Plasma 6 is now available and can be installed with `services.xserver.desktopManagers.plasma6.enable = true;`. Plasma 5 will likely be deprecated in the next release (24.11). Note that Plasma 6 runs as Wayland by default, and the X11 session needs to be explicitly selected if necessary.
## New Services {#sec-release-24.05-new-services}
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->

View File

@ -0,0 +1,46 @@
# This module defines a NixOS installation CD that contains Plasma 6.
{ pkgs, ... }:
{
imports = [ ./installation-cd-graphical-calamares.nix ];
isoImage.edition = "plasma6";
services.xserver = {
desktopManager.plasma6.enable = true;
# Automatically login as nixos.
displayManager = {
sddm.enable = true;
autoLogin = {
enable = true;
user = "nixos";
};
};
};
environment.systemPackages = [
# FIXME: using Qt5 builds of Maliit as upstream has not ported to Qt6 yet
pkgs.maliit-framework
pkgs.maliit-keyboard
];
system.activationScripts.installerDesktop = let
# Comes from documentation.nix when xserver and nixos.enable are true.
manualDesktopFile = "/run/current-system/sw/share/applications/nixos-manual.desktop";
homeDir = "/home/nixos/";
desktopDir = homeDir + "Desktop/";
in ''
mkdir -p ${desktopDir}
chown nixos ${homeDir} ${desktopDir}
ln -sfT ${manualDesktopFile} ${desktopDir + "nixos-manual.desktop"}
ln -sfT ${pkgs.gparted}/share/applications/gparted.desktop ${desktopDir + "gparted.desktop"}
ln -sfT ${pkgs.calamares-nixos}/share/applications/io.calamares.calamares.desktop ${desktopDir + "io.calamares.calamares.desktop"}
'';
}

View File

@ -15,6 +15,7 @@ let
defaultPinentryFlavor =
if xserverCfg.desktopManager.lxqt.enable
|| xserverCfg.desktopManager.plasma5.enable
|| xserverCfg.desktopManager.plasma6.enable
|| xserverCfg.desktopManager.deepin.enable then
"qt"
else if xserverCfg.desktopManager.xfce.enable then

View File

@ -96,6 +96,10 @@ let
pamOpts = { config, name, ... }: let cfg = config; in let config = parentConfig; in {
imports = [
(lib.mkRenamedOptionModule [ "enableKwallet" ] [ "kwallet" "enable" ])
];
options = {
name = mkOption {
@ -462,7 +466,8 @@ let
'';
};
enableKwallet = mkOption {
kwallet = {
enable = mkOption {
default = false;
type = types.bool;
description = lib.mdDoc ''
@ -472,6 +477,12 @@ let
password, KDE will prompt separately after login.
'';
};
package = mkPackageOption pkgs.plasma5Packages "kwallet-pam" {
pkgsText = "pkgs.plasma5Packages";
};
};
sssdStrictAccess = mkOption {
default = false;
type = types.bool;
@ -686,7 +697,7 @@ let
(config.security.pam.enableEcryptfs
|| config.security.pam.enableFscrypt
|| cfg.pamMount
|| cfg.enableKwallet
|| cfg.kwallet.enable
|| cfg.enableGnomeKeyring
|| config.services.intune.enable
|| cfg.googleAuthenticator.enable
@ -711,9 +722,7 @@ let
{ name = "mount"; enable = cfg.pamMount; control = "optional"; modulePath = "${pkgs.pam_mount}/lib/security/pam_mount.so"; settings = {
disable_interactive = true;
}; }
{ name = "kwallet5"; enable = cfg.enableKwallet; control = "optional"; modulePath = "${pkgs.plasma5Packages.kwallet-pam}/lib/security/pam_kwallet5.so"; settings = {
kwalletd = "${pkgs.plasma5Packages.kwallet.bin}/bin/kwalletd5";
}; }
{ name = "kwallet"; enable = cfg.kwallet.enable; control = "optional"; modulePath = "${cfg.kwallet.package}/lib/security/pam_kwallet5.so"; }
{ name = "gnome_keyring"; enable = cfg.enableGnomeKeyring; control = "optional"; modulePath = "${pkgs.gnome.gnome-keyring}/lib/security/pam_gnome_keyring.so"; }
{ name = "intune"; enable = config.services.intune.enable; control = "optional"; modulePath = "${pkgs.intune-portal}/lib/security/pam_intune.so"; }
{ name = "gnupg"; enable = cfg.gnupg.enable; control = "optional"; modulePath = "${pkgs.pam_gnupg}/lib/security/pam_gnupg.so"; settings = {
@ -848,9 +857,7 @@ let
order = "user,group,default";
debug = true;
}; }
{ name = "kwallet5"; enable = cfg.enableKwallet; control = "optional"; modulePath = "${pkgs.plasma5Packages.kwallet-pam}/lib/security/pam_kwallet5.so"; settings = {
kwalletd = "${pkgs.plasma5Packages.kwallet.bin}/bin/kwalletd5";
}; }
{ name = "kwallet"; enable = cfg.kwallet.enable; control = "optional"; modulePath = "${cfg.kwallet.package}/lib/security/pam_kwallet5.so"; }
{ name = "gnome_keyring"; enable = cfg.enableGnomeKeyring; control = "optional"; modulePath = "${pkgs.gnome.gnome-keyring}/lib/security/pam_gnome_keyring.so"; settings = {
auto_start = true;
}; }

View File

@ -18,7 +18,7 @@ in
# determines the default: later modules (if enabled) are preferred.
# E.g., if Plasma 5 is enabled, it supersedes xterm.
imports = [
./none.nix ./xterm.nix ./phosh.nix ./xfce.nix ./plasma5.nix ./lumina.nix
./none.nix ./xterm.nix ./phosh.nix ./xfce.nix ./plasma5.nix ./plasma6.nix ./lumina.nix
./lxqt.nix ./enlightenment.nix ./gnome.nix ./retroarch.nix ./kodi.nix
./mate.nix ./pantheon.nix ./surf-display.nix ./cde.nix
./cinnamon.nix ./budgie.nix ./deepin.nix

View File

@ -362,7 +362,7 @@ in
security.pam.services.kde = { allowNullPassword = true; };
security.pam.services.login.enableKwallet = true;
security.pam.services.login.kwallet.enable = true;
systemd.user.services = {
plasma-early-setup = mkIf cfg.runUsingSystemd {

View File

@ -0,0 +1,276 @@
{
config,
lib,
pkgs,
utils,
...
}: let
xcfg = config.services.xserver;
cfg = xcfg.desktopManager.plasma6;
inherit (pkgs) kdePackages;
inherit (lib) literalExpression mkDefault mkIf mkOption mkPackageOptionMD types;
in {
options = {
services.xserver.desktopManager.plasma6 = {
enable = mkOption {
type = types.bool;
default = false;
description = lib.mdDoc "Enable the Plasma 6 (KDE 6) desktop environment.";
};
enableQt5Integration = mkOption {
type = types.bool;
default = true;
description = lib.mdDoc "Enable Qt 5 integration (theming, etc). Disable for a pure Qt 6 system.";
};
notoPackage = mkPackageOptionMD pkgs "Noto fonts - used for UI by default" {
default = ["noto-fonts"];
example = "noto-fonts-lgc-plus";
};
};
environment.plasma6.excludePackages = mkOption {
description = lib.mdDoc "List of default packages to exclude from the configuration";
type = types.listOf types.package;
default = [];
example = literalExpression "[ pkgs.kdePackages.elisa ]";
};
};
config = mkIf cfg.enable {
assertions = [
{
assertion = cfg.enable -> !config.services.xserver.desktopManager.plasma5.enable;
message = "Cannot enable plasma5 and plasma6 at the same time!";
}
];
qt.enable = true;
environment.systemPackages = with kdePackages; let
requiredPackages = [
# Hack? To make everything run on Wayland
qtwayland
# Needed to render SVG icons
qtsvg
# Frameworks with globally loadable bits
frameworkintegration # provides Qt plugin
kauth # provides helper service
kcoreaddons # provides extra mime type info
kded # provides helper service
kfilemetadata # provides Qt plugins
kguiaddons # provides geo URL handlers
kiconthemes # provides Qt plugins
kimageformats # provides Qt plugins
kio # provides helper service + a bunch of other stuff
kpackage # provides kpackagetool tool
kservice # provides kbuildsycoca6 tool
kwallet # provides helper service
kwallet-pam # provides helper service
kwalletmanager # provides KCMs and stuff
plasma-activities # provides plasma-activities-cli tool
solid # provides solid-hardware6 tool
phonon-vlc # provides Phonon plugin
# Core Plasma parts
kwin
pkgs.xwayland
kscreen
libkscreen
kscreenlocker
kactivitymanagerd
kde-cli-tools
kglobalacceld
kwrited # wall message proxy, not to be confused with kwrite
milou
polkit-kde-agent-1
plasma-desktop
plasma-workspace
# Crash handler
drkonqi
# Application integration
libplasma # provides Kirigami platform theme
plasma-integration # provides Qt platform theme
kde-gtk-config
# Artwork + themes
breeze
breeze-icons
breeze-gtk
ocean-sound-theme
plasma-workspace-wallpapers
pkgs.hicolor-icon-theme # fallback icons
qqc2-breeze-style
qqc2-desktop-style
# misc Plasma extras
kdeplasma-addons
pkgs.xdg-user-dirs # recommended upstream
# Plasma utilities
kmenuedit
kinfocenter
plasma-systemmonitor
ksystemstats
libksysguard
spectacle
systemsettings
# Gear
baloo
dolphin
dolphin-plugins
ffmpegthumbs
kdegraphics-thumbnailers
kde-inotify-survey
kio-admin
kio-extras
kio-fuse
];
optionalPackages = [
plasma-browser-integration
konsole
(lib.getBin qttools) # Expose qdbus in PATH
ark
elisa
gwenview
okular
kate
khelpcenter
print-manager
];
in
requiredPackages
++ utils.removePackagesByName optionalPackages config.environment.plasma6.excludePackages
++ lib.optionals config.services.xserver.desktopManager.plasma6.enableQt5Integration [
breeze.qt5
plasma-integration.qt5
pkgs.plasma5Packages.kwayland-integration
kio-extras-kf5
]
# Optional hardware support features
++ lib.optionals config.hardware.bluetooth.enable [bluedevil bluez-qt pkgs.openobex pkgs.obexftp]
++ lib.optional config.networking.networkmanager.enable plasma-nm
++ lib.optional config.hardware.pulseaudio.enable plasma-pa
++ lib.optional config.services.pipewire.pulse.enable plasma-pa
++ lib.optional config.powerManagement.enable powerdevil
++ lib.optional config.services.colord.enable colord-kde
++ lib.optional config.services.hardware.bolt.enable plasma-thunderbolt
++ lib.optionals config.services.samba.enable [kdenetwork-filesharing pkgs.samba]
++ lib.optional config.services.xserver.wacom.enable wacomtablet
++ lib.optional config.services.flatpak.enable flatpak-kcm;
environment.pathsToLink = [
# FIXME: modules should link subdirs of `/share` rather than relying on this
"/share"
"/libexec" # for drkonqi
];
environment.etc."X11/xkb".source = xcfg.xkb.dir;
# Add ~/.config/kdedefaults to XDG_CONFIG_DIRS for shells, since Plasma sets that.
# FIXME: maybe we should append to XDG_CONFIG_DIRS in /etc/set-environment instead?
environment.sessionVariables.XDG_CONFIG_DIRS = ["$HOME/.config/kdedefaults"];
# Needed for things that depend on other store.kde.org packages to install correctly,
# notably Plasma look-and-feel packages (a.k.a. Global Themes)
#
# FIXME: this is annoyingly impure and should really be fixed at source level somehow,
# but kpackage is a library so we can't just wrap the one thing invoking it and be done.
# This also means things won't work for people not on Plasma, but at least this way it
# works for SOME people.
environment.sessionVariables.KPACKAGE_DEP_RESOLVERS_PATH = "${kdePackages.frameworkintegration.out}/libexec/kf6/kpackagehandlers";
# Enable GTK applications to load SVG icons
services.xserver.gdk-pixbuf.modulePackages = [pkgs.librsvg];
fonts.packages = [cfg.notoPackage pkgs.hack-font];
fonts.fontconfig.defaultFonts = {
monospace = ["Hack" "Noto Sans Mono"];
sansSerif = ["Noto Sans"];
serif = ["Noto Serif"];
};
programs.ssh.askPassword = mkDefault "${kdePackages.ksshaskpass.out}/bin/ksshaskpass";
# Enable helpful DBus services.
services.accounts-daemon.enable = true;
# when changing an account picture the accounts-daemon reads a temporary file containing the image which systemsettings5 may place under /tmp
systemd.services.accounts-daemon.serviceConfig.PrivateTmp = false;
services.power-profiles-daemon.enable = mkDefault true;
services.system-config-printer.enable = mkIf config.services.printing.enable (mkDefault true);
services.udisks2.enable = true;
services.upower.enable = config.powerManagement.enable;
services.xserver.libinput.enable = mkDefault true;
# Extra UDEV rules used by Solid
services.udev.packages = [
# libmtp has "bin", "dev", "out" outputs. UDEV rules file is in "out".
pkgs.libmtp.out
pkgs.media-player-info
];
# Set up Dr. Konqi as crash handler
systemd.packages = [kdePackages.drkonqi];
systemd.services."drkonqi-coredump-processor@".wantedBy = ["systemd-coredump@.service"];
xdg.portal.enable = true;
xdg.portal.extraPortals = [kdePackages.xdg-desktop-portal-kde];
xdg.portal.configPackages = mkDefault [kdePackages.xdg-desktop-portal-kde];
services.pipewire.enable = mkDefault true;
services.xserver.displayManager = {
sessionPackages = [kdePackages.plasma-workspace];
defaultSession = mkDefault "plasma";
};
services.xserver.displayManager.sddm = {
package = kdePackages.sddm;
theme = mkDefault "breeze";
extraPackages = with kdePackages; [
breeze-icons
kirigami
plasma5support
qtsvg
qtvirtualkeyboard
];
};
security.pam.services = {
login.kwallet = {
enable = true;
package = kdePackages.kwallet-pam;
};
kde.kwallet = {
enable = true;
package = kdePackages.kwallet-pam;
};
kde-fingerprint = lib.mkIf config.services.fprintd.enable { fprintAuth = true; };
kde-smartcard = lib.mkIf config.security.pam.p11.enable { p11Auth = true; };
};
programs.dconf.enable = true;
programs.firefox.nativeMessagingHosts.packages = [kdePackages.plasma-browser-integration];
programs.chromium = {
enablePlasmaBrowserIntegration = true;
plasmaBrowserIntegrationPackage = pkgs.kdePackages.plasma-browser-integration;
};
programs.kdeconnect.package = kdePackages.kdeconnect-kde;
};
}

View File

@ -7,7 +7,10 @@ let
cfg = dmcfg.sddm;
xEnv = config.systemd.services.display-manager.environment;
sddm = cfg.package;
sddm = cfg.package.override(old: {
withWayland = cfg.wayland.enable;
extraPackages = old.extraPackages or [] ++ cfg.extraPackages;
});
iniFmt = pkgs.formats.ini { };
@ -140,6 +143,15 @@ in
'';
};
extraPackages = mkOption {
type = types.listOf types.package;
default = [];
defaultText = "[]";
description = lib.mdDoc ''
Extra Qt plugins / QML libraries to add to the environment.
'';
};
autoNumlock = mkOption {
type = types.bool;
default = false;
@ -211,7 +223,7 @@ in
keymap_variant = xcfg.xkb.variant;
keymap_options = xcfg.xkb.options;
};
}; in "${pkgs.weston}/bin/weston --shell=fullscreen-shell.so -c ${westonIni}";
}; in "${pkgs.weston}/bin/weston --shell=kiosk -c ${westonIni}";
description = lib.mdDoc "Command used to start the selected compositor";
};
};
@ -235,15 +247,7 @@ in
}
];
services.xserver.displayManager.job = {
environment = {
# Load themes from system environment
QT_PLUGIN_PATH = "/run/current-system/sw/" + pkgs.qt5.qtbase.qtPluginPrefix;
QML2_IMPORT_PATH = "/run/current-system/sw/" + pkgs.qt5.qtbase.qtQmlPrefix;
};
execCmd = "exec /run/current-system/sw/bin/sddm";
};
services.xserver.displayManager.job.execCmd = "exec /run/current-system/sw/bin/sddm";
security.pam.services = {
sddm.text = ''

View File

@ -177,6 +177,12 @@ in rec {
inherit system;
});
iso_plasma6 = forMatchingSystems supportedSystems (system: makeIso {
module = ./modules/installer/cd-dvd/installation-cd-graphical-calamares-plasma6.nix;
type = "plasma6";
inherit system;
});
iso_gnome = forMatchingSystems supportedSystems (system: makeIso {
module = ./modules/installer/cd-dvd/installation-cd-graphical-calamares-gnome.nix;
type = "gnome";

View File

@ -695,6 +695,7 @@ in {
plantuml-server = handleTest ./plantuml-server.nix {};
plasma-bigscreen = handleTest ./plasma-bigscreen.nix {};
plasma5 = handleTest ./plasma5.nix {};
plasma6 = handleTest ./plasma6.nix {};
plasma5-systemd-start = handleTest ./plasma5-systemd-start.nix {};
plausible = handleTest ./plausible.nix {};
please = handleTest ./please.nix {};

64
nixos/tests/plasma6.nix Normal file
View File

@ -0,0 +1,64 @@
import ./make-test-python.nix ({ pkgs, ...} :
{
name = "plasma6";
meta = with pkgs.lib.maintainers; {
maintainers = [ k900 ];
};
nodes.machine = { ... }:
{
imports = [ ./common/user-account.nix ];
services.xserver.enable = true;
services.xserver.displayManager.sddm.enable = true;
# FIXME: this should be testing Wayland
services.xserver.displayManager.defaultSession = "plasmax11";
services.xserver.desktopManager.plasma6.enable = true;
environment.plasma6.excludePackages = [ pkgs.kdePackages.elisa ];
services.xserver.displayManager.autoLogin = {
enable = true;
user = "alice";
};
};
testScript = { nodes, ... }: let
user = nodes.machine.users.users.alice;
xdo = "${pkgs.xdotool}/bin/xdotool";
in ''
with subtest("Wait for login"):
start_all()
machine.wait_for_file("/tmp/xauth_*")
machine.succeed("xauth merge /tmp/xauth_*")
with subtest("Check plasmashell started"):
machine.wait_until_succeeds("pgrep plasmashell")
machine.wait_for_window("^Desktop ")
with subtest("Check that KDED is running"):
machine.succeed("pgrep kded6")
with subtest("Ensure Elisa is not installed"):
machine.fail("which elisa")
machine.succeed("su - ${user.name} -c 'xauth merge /tmp/xauth_*'")
with subtest("Run Dolphin"):
machine.execute("su - ${user.name} -c 'DISPLAY=:0.0 dolphin >&2 &'")
machine.wait_for_window(" Dolphin")
with subtest("Run Konsole"):
machine.execute("su - ${user.name} -c 'DISPLAY=:0.0 konsole >&2 &'")
machine.wait_for_window("Konsole")
with subtest("Run systemsettings"):
machine.execute("su - ${user.name} -c 'DISPLAY=:0.0 systemsettings >&2 &'")
machine.wait_for_window("Settings")
with subtest("Wait to get a screenshot"):
machine.execute(
"${xdo} key Alt+F1 sleep 10"
)
machine.screenshot("screen")
'';
})

View File

@ -1,82 +1,37 @@
{ stdenv, lib, fetchFromGitHub
, cmake, pkg-config, qttools
, libxcb, libXau, pam, qtbase, wrapQtAppsHook, qtdeclarative
, qtquickcontrols2 ? null, systemd, xkeyboardconfig
{
lib,
callPackage,
runCommand,
qtwayland,
wrapQtAppsHook,
unwrapped ? callPackage ./unwrapped.nix {},
withWayland ? false,
extraPackages ? [],
}:
let
isQt6 = lib.versions.major qtbase.version == "6";
in stdenv.mkDerivation {
pname = "sddm";
version = "0.20.0-unstable-2023-12-29";
runCommand "sddm-wrapped" {
inherit (unwrapped) version;
src = fetchFromGitHub {
owner = "sddm";
repo = "sddm";
rev = "501129294be1487f753482c29949fc1c19ef340e";
hash = "sha256-mLm987Ah0X9s0tBK2a45iERwYoh5JzWb3TFlSoxi8CA=";
buildInputs = unwrapped.buildInputs ++ extraPackages ++ lib.optional withWayland qtwayland;
nativeBuildInputs = [ wrapQtAppsHook ];
passthru = {
inherit unwrapped;
};
patches = [
./sddm-ignore-config-mtime.patch
./sddm-default-session.patch
];
meta = unwrapped.meta;
} ''
mkdir -p $out/bin
postPatch = ''
substituteInPlace src/greeter/waylandkeyboardbackend.cpp \
--replace "/usr/share/X11/xkb/rules/evdev.xml" "${xkeyboardconfig}/share/X11/xkb/rules/evdev.xml"
'';
cd ${unwrapped}
nativeBuildInputs = [ wrapQtAppsHook cmake pkg-config qttools ];
buildInputs = [
libxcb
libXau
pam
qtbase
qtdeclarative
qtquickcontrols2
systemd
];
cmakeFlags = [
(lib.cmakeBool "BUILD_WITH_QT6" isQt6)
"-DCONFIG_FILE=/etc/sddm.conf"
"-DCONFIG_DIR=/etc/sddm.conf.d"
# Set UID_MIN and UID_MAX so that the build script won't try
# to read them from /etc/login.defs (fails in chroot).
# The values come from NixOS; they may not be appropriate
# for running SDDM outside NixOS, but that configuration is
# not supported anyway.
"-DUID_MIN=1000"
"-DUID_MAX=29999"
# we still want to run the DM on VT 7 for the time being, as 1-6 are
# occupied by getties by default
"-DSDDM_INITIAL_VT=7"
"-DQT_IMPORTS_DIR=${placeholder "out"}/${qtbase.qtQmlPrefix}"
"-DCMAKE_INSTALL_SYSCONFDIR=${placeholder "out"}/etc"
"-DSYSTEMD_SYSTEM_UNIT_DIR=${placeholder "out"}/lib/systemd/system"
"-DSYSTEMD_SYSUSERS_DIR=${placeholder "out"}/lib/sysusers.d"
"-DSYSTEMD_TMPFILES_DIR=${placeholder "out"}/lib/tmpfiles.d"
"-DDBUS_CONFIG_DIR=${placeholder "out"}/share/dbus-1/system.d"
];
postInstall = ''
# remove empty scripts
rm "$out/share/sddm/scripts/Xsetup" "$out/share/sddm/scripts/Xstop"
for f in $out/share/sddm/themes/**/theme.conf ; do
substituteInPlace $f \
--replace 'background=' "background=$(dirname $f)/"
for i in *; do
if [ "$i" == "bin" ]; then
continue
fi
ln -s ${unwrapped}/$i $out/$i
done
'';
meta = with lib; {
description = "QML based X11 display manager";
homepage = "https://github.com/sddm/sddm";
maintainers = with maintainers; [ abbradar ttuegel ];
platforms = platforms.linux;
license = licenses.gpl2Plus;
};
}
for i in bin/*; do
makeQtWrapper ${unwrapped}/$i $out/$i --set SDDM_GREETER_DIR $out/bin
done
''

View File

@ -0,0 +1,14 @@
diff --git a/src/daemon/Greeter.cpp b/src/daemon/Greeter.cpp
index 07fccde..dd22a07 100644
--- a/src/daemon/Greeter.cpp
+++ b/src/daemon/Greeter.cpp
@@ -83,7 +83,8 @@ namespace SDDM {
QString Greeter::greeterPathForQt(int qtVersion)
{
const QString suffix = qtVersion == 5 ? QString() : QStringLiteral("-qt%1").arg(qtVersion);
- return QStringLiteral(BIN_INSTALL_DIR "/sddm-greeter%1").arg(suffix);
+ const QString greeterDir = qEnvironmentVariable("SDDM_GREETER_DIR", QStringLiteral(BIN_INSTALL_DIR));
+ return QStringLiteral("%1/sddm-greeter%2").arg(greeterDir).arg(suffix);
}
bool Greeter::start() {

View File

@ -0,0 +1,86 @@
{ stdenv, lib, fetchFromGitHub
, cmake, pkg-config, qttools
, libxcb, libXau, pam, qtbase, qtdeclarative
, qtquickcontrols2 ? null, systemd, xkeyboardconfig
}:
let
isQt6 = lib.versions.major qtbase.version == "6";
in stdenv.mkDerivation(finalAttrs: {
pname = "sddm-unwrapped";
version = "0.21.0";
src = fetchFromGitHub {
owner = "sddm";
repo = "sddm";
rev = "v${finalAttrs.version}";
hash = "sha256-r5mnEWham2WnoEqRh5tBj/6rn5mN62ENOCmsLv2Ht+w=";
};
patches = [
./greeter-path.patch
./sddm-ignore-config-mtime.patch
./sddm-default-session.patch
];
postPatch = ''
substituteInPlace src/greeter/waylandkeyboardbackend.cpp \
--replace "/usr/share/X11/xkb/rules/evdev.xml" "${xkeyboardconfig}/share/X11/xkb/rules/evdev.xml"
'';
nativeBuildInputs = [ cmake pkg-config qttools ];
buildInputs = [
libxcb
libXau
pam
qtbase
qtdeclarative
qtquickcontrols2
systemd
];
# We will wrap manually later
dontWrapQtApps = true;
cmakeFlags = [
(lib.cmakeBool "BUILD_WITH_QT6" isQt6)
"-DCONFIG_FILE=/etc/sddm.conf"
"-DCONFIG_DIR=/etc/sddm.conf.d"
# Set UID_MIN and UID_MAX so that the build script won't try
# to read them from /etc/login.defs (fails in chroot).
# The values come from NixOS; they may not be appropriate
# for running SDDM outside NixOS, but that configuration is
# not supported anyway.
"-DUID_MIN=1000"
"-DUID_MAX=29999"
# we still want to run the DM on VT 7 for the time being, as 1-6 are
# occupied by getties by default
"-DSDDM_INITIAL_VT=7"
"-DQT_IMPORTS_DIR=${placeholder "out"}/${qtbase.qtQmlPrefix}"
"-DCMAKE_INSTALL_SYSCONFDIR=${placeholder "out"}/etc"
"-DSYSTEMD_SYSTEM_UNIT_DIR=${placeholder "out"}/lib/systemd/system"
"-DSYSTEMD_SYSUSERS_DIR=${placeholder "out"}/lib/sysusers.d"
"-DSYSTEMD_TMPFILES_DIR=${placeholder "out"}/lib/tmpfiles.d"
"-DDBUS_CONFIG_DIR=${placeholder "out"}/share/dbus-1/system.d"
];
postInstall = ''
# remove empty scripts
rm "$out/share/sddm/scripts/Xsetup" "$out/share/sddm/scripts/Xstop"
for f in $out/share/sddm/themes/**/theme.conf ; do
substituteInPlace $f \
--replace 'background=' "background=$(dirname $f)/"
done
'';
meta = with lib; {
description = "QML based X11 display manager";
homepage = "https://github.com/sddm/sddm";
maintainers = with maintainers; [ abbradar ttuegel k900 ];
platforms = platforms.linux;
license = licenses.gpl2Plus;
};
})

View File

@ -13,7 +13,7 @@ IF YOUR PACKAGE IS NOT LISTED IN `./srcs.nix`, IT DOES NOT GO HERE.
Many of the packages released upstream are not yet built in Nixpkgs due to lack
of demand. To add a Nixpkgs build for an upstream package, copy one of the
existing packages here and modify it as necessary. A simple example package that
still shows most of the available features is in `./gwenview.nix`.
still shows most of the available features is in `./gwenview`.
# Updates
@ -92,7 +92,7 @@ let
ghostwriter = callPackage ./ghostwriter.nix {};
granatier = callPackage ./granatier.nix {};
grantleetheme = callPackage ./grantleetheme {};
gwenview = callPackage ./gwenview.nix {};
gwenview = callPackage ./gwenview {};
incidenceeditor = callPackage ./incidenceeditor.nix {};
itinerary = callPackage ./itinerary.nix {};
juk = callPackage ./juk.nix {};

View File

@ -16,6 +16,10 @@ mkDerivation {
maintainers = [ lib.maintainers.ttuegel ];
mainProgram = "gwenview";
};
# Fix build with versioned kImageAnnotator
patches = [./kimageannotator.patch];
nativeBuildInputs = [ extra-cmake-modules kdoctools ];
buildInputs = [
baloo kactivities kio kitemmodels kparts libkdcraw libkipi phonon

View File

@ -0,0 +1,56 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 01db0fb1..06319c54 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -166,12 +166,12 @@ if(NOT WITHOUT_X11)
endif()
if (QT_MAJOR_VERSION STREQUAL "5")
- find_package(kImageAnnotator)
- set_package_properties(kImageAnnotator PROPERTIES URL "https://github.com/ksnip/kImageAnnotator" DESCRIPTION "The kImageAnnotator library provides tools to annotate" TYPE REQUIRED)
- if(kImageAnnotator_FOUND)
+ find_package(kImageAnnotator-Qt5)
+ set_package_properties(kImageAnnotator-Qt5 PROPERTIES URL "https://github.com/ksnip/kImageAnnotator" DESCRIPTION "The kImageAnnotator library provides tools to annotate" TYPE REQUIRED)
+ if(kImageAnnotator-Qt5_FOUND)
set(KIMAGEANNOTATOR_FOUND 1)
- find_package(kColorPicker REQUIRED)
- if(NOT kImageAnnotator_VERSION VERSION_LESS 0.5.0)
+ find_package(kColorPicker-Qt5 REQUIRED)
+ if(NOT kImageAnnotator-Qt5_VERSION VERSION_LESS 0.5.0)
set(KIMAGEANNOTATOR_CAN_LOAD_TRANSLATIONS 1)
endif()
endif()
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index 8c136835..ef4cff74 100644
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -157,6 +157,6 @@ target_link_libraries(slideshowfileitemaction
KF${QT_MAJOR_VERSION}::KIOWidgets
KF${QT_MAJOR_VERSION}::Notifications)
-if(kImageAnnotator_FOUND)
+if(kImageAnnotator-Qt5_FOUND)
target_link_libraries(gwenview kImageAnnotator::kImageAnnotator)
endif()
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index 05a2ea67..4167a1bb 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -157,7 +157,7 @@ set(gwenviewlib_SRCS
touch/touch_helper.cpp
${GV_JPEG_DIR}/transupp.c
)
-if (kImageAnnotator_FOUND)
+if (kImageAnnotator-Qt5_FOUND)
set(gwenviewlib_SRCS ${gwenviewlib_SRCS}
annotate/annotatedialog.cpp
annotate/annotateoperation.cpp
@@ -338,7 +338,7 @@ if (GWENVIEW_SEMANTICINFO_BACKEND_BALOO)
)
endif()
-if(kImageAnnotator_FOUND)
+if(kImageAnnotator-Qt5_FOUND)
target_link_libraries(gwenviewlib kImageAnnotator::kImageAnnotator)
endif()

View File

@ -1,9 +1,8 @@
{ mkDerivation
, lib
{ lib
, stdenv
, fetchFromGitHub
, substituteAll
, qtbase
, qtsvg
, qtwebengine
, qtdeclarative
, extra-cmake-modules
@ -46,6 +45,7 @@ stdenv.mkDerivation (finalAttrs: {
buildInputs = [
qtbase
qtsvg
cpp-utilities
qtutilities
boost
@ -74,7 +74,7 @@ stdenv.mkDerivation (finalAttrs: {
doCheck = !stdenv.isDarwin;
preCheck = ''
export QT_QPA_PLATFORM=offscreen
export QT_PLUGIN_PATH="${qtbase.bin}/${qtbase.qtPluginPrefix}"
export QT_PLUGIN_PATH="${lib.getBin qtbase}/${qtbase.qtPluginPrefix}"
'';
# don't test --help on Darwin because output is .app
doInstallCheck = !stdenv.isDarwin;
@ -83,6 +83,8 @@ stdenv.mkDerivation (finalAttrs: {
'';
cmakeFlags = [
"-DQT_PACKAGE_PREFIX=Qt${lib.versions.major qtbase.version}"
"-DKF_PACKAGE_PREFIX=KF${lib.versions.major qtbase.version}"
"-DBUILD_TESTING=ON"
# See https://github.com/Martchus/syncthingtray/issues/208
"-DEXCLUDE_TESTS_FROM_ALL=OFF"

View File

@ -0,0 +1,87 @@
{
lib,
stdenv,
fetchFromGitHub,
fetchpatch,
cmake,
autoconf,
automake,
libtool,
pkg-config,
boost,
cairo,
fuse,
glib,
libarchive,
librsvg,
squashfuse,
xdg-utils-cxx,
zlib,
}:
stdenv.mkDerivation rec {
pname = "libappimage";
version = "1.0.4-5";
src = fetchFromGitHub {
owner = "AppImageCommunity";
repo = "libappimage";
rev = "v${version}";
hash = "sha256-V9Ilo0zFo9Urke+jCA4CSQB5tpzLC/S5jmon+bA+TEU=";
};
patches = [
# Fix build with GCC 13
# FIXME: remove in next release
(fetchpatch {
url = "https://github.com/AppImageCommunity/libappimage/commit/1e0515b23b90588ce406669134feca56ddcbbe43.patch";
hash = "sha256-WIMvXNqC1stgPiBTRpXHWq3edIRnQomtRSW2qO52TRo=";
})
];
postPatch = ''
substituteInPlace cmake/libappimage.pc.in \
--replace 'libdir=''${prefix}/@CMAKE_INSTALL_LIBDIR@' 'libdir=@CMAKE_INSTALL_FULL_LIBDIR@' \
--replace 'includedir=''${prefix}/@CMAKE_INSTALL_INCLUDEDIR@' 'includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@'
'';
cmakeFlags = [
"-DUSE_SYSTEM_BOOST=1"
"-DUSE_SYSTEM_LIBARCHIVE=1"
"-DUSE_SYSTEM_SQUASHFUSE=1"
"-DUSE_SYSTEM_XDGUTILS=1"
"-DUSE_SYSTEM_XZ=1"
];
nativeBuildInputs = [
cmake
autoconf
automake
libtool
pkg-config
];
buildInputs = [
boost
fuse
libarchive
squashfuse
xdg-utils-cxx
];
propagatedBuildInputs = [
cairo
glib
librsvg
zlib
];
strictDeps = true;
meta = with lib; {
description = "Implements functionality for dealing with AppImage files";
homepage = "https://github.com/AppImageCommunity/libappimage/";
license = licenses.mit;
maintainers = with maintainers; [ k900 ];
platforms = platforms.linux;
};
}

View File

@ -0,0 +1,30 @@
{
lib,
stdenv,
fetchFromGitHub,
cmake,
}:
stdenv.mkDerivation rec {
pname = "xdg-utils-cxx";
version = "1.0.1";
src = fetchFromGitHub {
owner = "azubieta";
repo = "xdg-utils-cxx";
rev = "v${version}";
hash = "sha256-hEN0xqZUNfMOIrw3q+x4kEFhYoqmyn7W3f2w8AGw2wI=";
};
nativeBuildInputs = [
cmake
];
meta = with lib; {
description = "Implementation of the FreeDesktop specifications to be used in c++ projects";
homepage = "https://github.com/azubieta/xdg-utils-cxx";
license = licenses.mit;
maintainers = with maintainers; [ k900 ];
mainProgram = "xdg-utils-cxx";
platforms = platforms.linux;
};
}

View File

@ -1,14 +1,15 @@
{ stdenv, lib, fetchFromGitLab, doxygen, glib, libaccounts-glib, pkg-config, qmake, qtbase, wrapQtAppsHook }:
stdenv.mkDerivation rec {
stdenv.mkDerivation {
pname = "accounts-qt";
version = "1.16";
version = "1.16-unstable-2023-11-24";
# pinned to fork with Qt6 support
src = fetchFromGitLab {
sha256 = "1vmpjvysm0ld8dqnx8msa15hlhrkny02cqycsh4k2azrnijg0xjz";
rev = "VERSION_${version}";
owner = "nicolasfella";
repo = "libaccounts-qt";
owner = "accounts-sso";
rev = "18557f7def9af8f4a9e0e93e9f575ae11e5066aa";
hash = "sha256-8FGZmg2ljSh1DYZfklMTrWN7Sdlk/Atw0qfpbb+GaBc=";
};
propagatedBuildInputs = [ glib libaccounts-glib ];

View File

@ -1,19 +1,29 @@
{ lib, mkDerivation, fetchFromGitHub, cmake, qtbase }:
{ lib, stdenv, fetchFromGitHub, cmake, qtbase }:
mkDerivation rec {
let
isQt6 = lib.versions.major qtbase.version == "6";
in stdenv.mkDerivation rec {
pname = "kcolorpicker";
version = "0.2.0";
version = "0.3.0";
src = fetchFromGitHub {
owner = "ksnip";
repo = "kColorPicker";
rev = "v${version}";
sha256 = "sha256-ahmMj/yzQiRP9oJwDuhJGxe849kxNsoGFDZ2CGQNhKs=";
hash = "sha256-gkjlIiLB3/074EEFrQUa0djvVt/C44O3afqqNis64P0=";
};
nativeBuildInputs = [ cmake ];
buildInputs = [ qtbase ];
cmakeFlags = [
(lib.cmakeBool "BUILD_WITH_QT6" isQt6)
(lib.cmakeBool "BUILD_SHARED_LIBS" true)
];
# Library only
dontWrapQtApps = true;
meta = with lib; {
description = "Qt based Color Picker with popup menu";
homepage = "https://github.com/ksnip/kColorPicker";

View File

@ -1,18 +1,29 @@
{ lib, mkDerivation, fetchFromGitHub, cmake, qtbase, kcolorpicker, qttools }:
{ lib, stdenv, fetchFromGitHub, cmake, qttools, qtbase, qtsvg, kcolorpicker }:
mkDerivation rec {
let
isQt6 = lib.versions.major qtbase.version == "6";
in stdenv.mkDerivation rec {
pname = "kimageannotator";
version = "0.6.1";
version = "0.7.0";
src = fetchFromGitHub {
owner = "ksnip";
repo = "kImageAnnotator";
rev = "v${version}";
sha256 = "sha256-lNoYAJ5yTC5H0gWPVkBGhLroRhFCPyC1DsVBy0IrqL4=";
hash = "sha256-Dq9CM/D3nA7MaY9rfwqF/UAw/+1ptKLf3P8jhFdngKk=";
};
nativeBuildInputs = [ cmake qttools ];
buildInputs = [ qtbase kcolorpicker ];
buildInputs = [ qtbase qtsvg ];
propagatedBuildInputs = [ kcolorpicker ];
cmakeFlags = [
(lib.cmakeBool "BUILD_WITH_QT6" isQt6)
(lib.cmakeBool "BUILD_SHARED_LIBS" true)
];
# Library only
dontWrapQtApps = true;
meta = with lib; {
description = "Tool for annotating images";

View File

@ -1,14 +1,15 @@
{ stdenv, lib, fetchFromGitLab, qmake, qtbase, wrapQtAppsHook, doxygen }:
stdenv.mkDerivation rec {
stdenv.mkDerivation {
pname = "signond";
version = "8.61";
version = "8.61-unstable-2023-11-24";
# pinned to fork with Qt6 support
src = fetchFromGitLab {
owner = "accounts-sso";
repo = pname;
rev = "VERSION_${version}";
sha256 = "sha256-d7JZmGpjIvSN9l1nvKbBZjF0OR5L5frPTGHF/pNEqHE=";
owner = "nicolasfella";
repo = "signond";
rev = "c8ad98249af541514ff7a81634d3295e712f1a39";
hash = "sha256-0FcSVF6cPuFEU9h7JIbanoosW/B4rQhFPOq7iBaOdKw=";
};
nativeBuildInputs = [

84
pkgs/kde/default.nix Normal file
View File

@ -0,0 +1,84 @@
{
lib,
generateSplicesForMkScope,
makeScopeWithSplicing',
fetchurl,
fetchFromGitLab,
libsForQt5,
qt6Packages,
cmark,
gpgme,
taglib,
wayland-protocols,
wayland,
zxing-cpp,
}: let
allPackages = self: let
frameworks = import ./frameworks {inherit (self) callPackage;};
gear = import ./gear {inherit (self) callPackage;};
plasma = import ./plasma {inherit (self) callPackage;};
sets = ["gear" "frameworks" "plasma"];
loadUrls = set: lib.importJSON (./generated/sources + "/${set}.json");
allUrls = lib.attrsets.mergeAttrsList (map loadUrls sets);
sources = lib.mapAttrs (_: v:
(fetchurl {
inherit (v) url hash;
})
// {inherit (v) version;})
allUrls;
in (
qt6Packages
// frameworks
// gear
// plasma
// {
inherit sources;
mkKdeDerivation = self.callPackage (import ./lib/mk-kde-derivation.nix self) {};
# THIRD PARTY
inherit
cmark
gpgme
taglib
wayland
wayland-protocols
zxing-cpp
;
# Alias to match metadata
kquickimageeditor = self.kquickimageedit;
# Alias because it's just data
plasma-wayland-protocols = libsForQt5.plasma-wayland-protocols;
selenium-webdriver-at-spi = null; # Used for integration tests that we don't run, stub
# Not ported to Qt6 yet
kdevelop-pg-qt = null;
okteta = null;
libmediawiki = null;
alpaka = self.callPackage ./misc/alpaka {};
kdiagram = self.callPackage ./misc/kdiagram {};
kdsoap-ws-discovery-client = self.callPackage ./misc/kdsoap-ws-discovery-client {};
kirigami-addons = self.callPackage ./misc/kirigami-addons {};
kio-fuse = self.callPackage ./misc/kio-fuse {};
ktextaddons = self.callPackage ./misc/ktextaddons {};
kunifiedpush = self.callPackage ./misc/kunifiedpush {};
kweathercore = self.callPackage ./misc/kweathercore {};
mpvqt = self.callPackage ./misc/mpvqt {};
oxygen-icons = self.callPackage ./misc/oxygen-icons {};
phonon = self.callPackage ./misc/phonon {};
phonon-vlc = self.callPackage ./misc/phonon-vlc {};
polkit-qt-1 = self.callPackage ./misc/polkit-qt-1 {};
pulseaudio-qt = self.callPackage ./misc/pulseaudio-qt {};
}
);
in
makeScopeWithSplicing' {
otherSplices = generateSplicesForMkScope "kdePackages";
f = allPackages;
}

View File

@ -0,0 +1,4 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "attica";
}

View File

@ -0,0 +1,10 @@
{
mkKdeDerivation,
qtdeclarative,
lmdb,
}:
mkKdeDerivation {
pname = "baloo";
extraBuildInputs = [qtdeclarative lmdb];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qtdeclarative,
}:
mkKdeDerivation {
pname = "bluez-qt";
extraBuildInputs = [qtdeclarative];
}

View File

@ -0,0 +1,16 @@
{
mkKdeDerivation,
python3,
libxml2,
}:
mkKdeDerivation {
pname = "breeze-icons";
extraNativeBuildInputs = [
(python3.withPackages (ps: [ps.lxml]))
libxml2
];
# lots of icons, takes forever, does absolutely nothing
dontStrip = true;
}

View File

@ -0,0 +1,74 @@
{callPackage}: {
attica = callPackage ./attica {};
baloo = callPackage ./baloo {};
bluez-qt = callPackage ./bluez-qt {};
breeze-icons = callPackage ./breeze-icons {};
extra-cmake-modules = callPackage ./extra-cmake-modules {};
frameworkintegration = callPackage ./frameworkintegration {};
kapidox = callPackage ./kapidox {};
karchive = callPackage ./karchive {};
kauth = callPackage ./kauth {};
kbookmarks = callPackage ./kbookmarks {};
kcalendarcore = callPackage ./kcalendarcore {};
kcmutils = callPackage ./kcmutils {};
kcodecs = callPackage ./kcodecs {};
kcolorscheme = callPackage ./kcolorscheme {};
kcompletion = callPackage ./kcompletion {};
kconfig = callPackage ./kconfig {};
kconfigwidgets = callPackage ./kconfigwidgets {};
kcontacts = callPackage ./kcontacts {};
kcoreaddons = callPackage ./kcoreaddons {};
kcrash = callPackage ./kcrash {};
kdav = callPackage ./kdav {};
kdbusaddons = callPackage ./kdbusaddons {};
kdeclarative = callPackage ./kdeclarative {};
kded = callPackage ./kded {};
kdesu = callPackage ./kdesu {};
kdnssd = callPackage ./kdnssd {};
kdoctools = callPackage ./kdoctools {};
kfilemetadata = callPackage ./kfilemetadata {};
kglobalaccel = callPackage ./kglobalaccel {};
kguiaddons = callPackage ./kguiaddons {};
kholidays = callPackage ./kholidays {};
ki18n = callPackage ./ki18n {};
kiconthemes = callPackage ./kiconthemes {};
kidletime = callPackage ./kidletime {};
kimageformats = callPackage ./kimageformats {};
kio = callPackage ./kio {};
kirigami = callPackage ./kirigami {};
kitemmodels = callPackage ./kitemmodels {};
kitemviews = callPackage ./kitemviews {};
kjobwidgets = callPackage ./kjobwidgets {};
knewstuff = callPackage ./knewstuff {};
knotifications = callPackage ./knotifications {};
knotifyconfig = callPackage ./knotifyconfig {};
kpackage = callPackage ./kpackage {};
kparts = callPackage ./kparts {};
kpeople = callPackage ./kpeople {};
kplotting = callPackage ./kplotting {};
kpty = callPackage ./kpty {};
kquickcharts = callPackage ./kquickcharts {};
krunner = callPackage ./krunner {};
kservice = callPackage ./kservice {};
kstatusnotifieritem = callPackage ./kstatusnotifieritem {};
ksvg = callPackage ./ksvg {};
ktexteditor = callPackage ./ktexteditor {};
ktexttemplate = callPackage ./ktexttemplate {};
ktextwidgets = callPackage ./ktextwidgets {};
kunitconversion = callPackage ./kunitconversion {};
kuserfeedback = callPackage ./kuserfeedback {};
kwallet = callPackage ./kwallet {};
kwidgetsaddons = callPackage ./kwidgetsaddons {};
kwindowsystem = callPackage ./kwindowsystem {};
kxmlgui = callPackage ./kxmlgui {};
modemmanager-qt = callPackage ./modemmanager-qt {};
networkmanager-qt = callPackage ./networkmanager-qt {};
prison = callPackage ./prison {};
purpose = callPackage ./purpose {};
qqc2-desktop-style = callPackage ./qqc2-desktop-style {};
solid = callPackage ./solid {};
sonnet = callPackage ./sonnet {};
syndication = callPackage ./syndication {};
syntax-highlighting = callPackage ./syntax-highlighting {};
threadweaver = callPackage ./threadweaver {};
}

View File

@ -0,0 +1,8 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "extra-cmake-modules";
outputs = ["out"];
setupHook = ./ecm-hook.sh;
}

View File

@ -0,0 +1,128 @@
# shellcheck shell=bash
# Variables we use here are set by the stdenv, no use complaining about them
# shellcheck disable=SC2164
ecmEnvHook() {
addToSearchPath XDG_DATA_DIRS "$1/share"
addToSearchPath XDG_CONFIG_DIRS "$1/etc/xdg"
}
addEnvHooks "$targetOffset" ecmEnvHook
ecmPostHook() {
# Because we need to use absolute paths here, we must set *all* the paths.
# Keep this in sync with https://github.com/KDE/extra-cmake-modules/blob/master/kde-modules/KDEInstallDirs6.cmake
if [ "$(uname)" = "Darwin" ]; then
cmakeFlags+=" -DKDE_INSTALL_BUNDLEDIR=${!outputBin}/Applications/KDE"
fi
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}/libexec"
cmakeFlags+=" -DKDE_INSTALL_CMAKEPACKAGEDIR=${!outputDev}/lib/cmake"
if [ -n "${qtPluginPrefix-}" ]; then
cmakeFlags+=" -DKDE_INSTALL_QTPLUGINDIR=${!outputBin}/$qtPluginPrefix"
cmakeFlags+=" -DKDE_INSTALL_PLUGINDIR=${!outputBin}/$qtPluginPrefix"
fi
if [ -n "${qtQmlPrefix-}" ]; then
cmakeFlags+=" -DKDE_INSTALL_QMLDIR=${!outputBin}/$qtQmlPrefix"
fi
cmakeFlags+=" -DKDE_INSTALL_INCLUDEDIR=${!outputInclude}/include"
cmakeFlags+=" -DKDE_INSTALL_LOCALSTATEDIR=/var"
cmakeFlags+=" -DKDE_INSTALL_SHAREDSTATEDIR=/com" # ???
cmakeFlags+=" -DKDE_INSTALL_DATAROOTDIR=${!outputBin}/share"
cmakeFlags+=" -DKDE_INSTALL_DATADIR=${!outputBin}/share"
cmakeFlags+=" -DKDE_INSTALL_DOCBUNDLEDIR=${!outputBin}/share/doc/HTML"
cmakeFlags+=" -DKDE_INSTALL_KCFGDIR=${!outputBin}/share/config.kcfg"
cmakeFlags+=" -DKDE_INSTALL_KCONFUPDATEDIR=${!outputBin}/share/kconf_update"
cmakeFlags+=" -DKDE_INSTALL_KAPPTEMPLATESDIR=${!outputDev}/share/kdevappwizard/templates"
cmakeFlags+=" -DKDE_INSTALL_KFILETEMPLATESDIR=${!outputDev}/share/kdevfiletemplates/templates"
cmakeFlags+=" -DKDE_INSTALL_KXMLGUIDIR=${!outputBin}/share/kxmlgui6"
cmakeFlags+=" -DKDE_INSTALL_KNOTIFYRCDIR=${!outputBin}/share/knotifications6"
cmakeFlags+=" -DKDE_INSTALL_ICONDIR=${!outputBin}/share/icons"
cmakeFlags+=" -DKDE_INSTALL_LOCALEDIR=${!outputLib}/share/locale"
cmakeFlags+=" -DKDE_INSTALL_SOUNDDIR=${!outputBin}/share/sounds"
cmakeFlags+=" -DKDE_INSTALL_TEMPLATEDIR=${!outputBin}/share/templates"
cmakeFlags+=" -DKDE_INSTALL_WALLPAPERDIR=${!outputBin}/share/wallpapers"
cmakeFlags+=" -DKDE_INSTALL_APPDIR=${!outputBin}/share/applications"
cmakeFlags+=" -DKDE_INSTALL_DESKTOPDIR=${!outputBin}/share/desktop-directories"
cmakeFlags+=" -DKDE_INSTALL_MIMEDIR=${!outputBin}/share/mime/packages"
cmakeFlags+=" -DKDE_INSTALL_METAINFODIR=${!outputBin}/share/appdata"
cmakeFlags+=" -DKDE_INSTALL_QTQCHDIR=${!outputLib}/share/doc/qch"
cmakeFlags+=" -DKDE_INSTALL_QCHDIR=${!outputLib}/share/doc/qch"
cmakeFlags+=" -DKDE_INSTALL_MANDIR=${!outputBin}/share/man"
cmakeFlags+=" -DKDE_INSTALL_INFODIR=${!outputBin}/share/info"
cmakeFlags+=" -DKDE_INSTALL_DBUSDIR=${!outputBin}/share/dbus-1"
cmakeFlags+=" -DKDE_INSTALL_DBUSINTERFACEDIR=${!outputBin}/share/dbus-1/interfaces"
cmakeFlags+=" -DKDE_INSTALL_DBUSSERVICEDIR=${!outputBin}/share/dbus-1/services"
cmakeFlags+=" -DKDE_INSTALL_DBUSSYSTEMSERVICEDIR=${!outputBin}/share/dbus-1/system-services"
cmakeFlags+=" -DKDE_INSTALL_SYSCONFDIR=${!outputBin}/etc"
cmakeFlags+=" -DKDE_INSTALL_CONFDIR=${!outputBin}/etc/xdg"
cmakeFlags+=" -DKDE_INSTALL_AUTOSTARTDIR=${!outputBin}/etc/xdg/autostart"
cmakeFlags+=" -DKDE_INSTALL_LOGGINGCATEGORIESDIR=${!outputLib}/share/qlogging-categories6"
cmakeFlags+=" -DKDE_INSTALL_SYSTEMDUNITDIR=${!outputBin}/lib/systemd"
cmakeFlags+=" -DKDE_INSTALL_SYSTEMDUSERUNITDIR=${!outputBin}/share/systemd/user"
}
postHooks+=(ecmPostHook)
xdgDataSubdirs=( \
"config.kcfg" "kconf_update" "knotifications6" "icons" "locale" "sounds" "templates" \
"wallpapers" "applications" "desktop-directories" "mime" "appdata" "dbus-1" \
)
# ecmHostPathsSeen is an associative array of the paths that have already been
# seen by ecmHostPathHook.
declare -gA ecmHostPathsSeen
ecmHostPathIsNotSeen() {
if [[ -n "${ecmHostPathsSeen["$1"]:-}" ]]; then
# The path has been seen before.
return 1
else
# The path has not been seen before.
# Now it is seen, so record it.
ecmHostPathsSeen["$1"]=1
return 0
fi
}
ecmHostPathHook() {
ecmHostPathIsNotSeen "$1" || return 0
local xdgConfigDir="$1/etc/xdg"
if [ -d "$xdgConfigDir" ]
then
qtWrapperArgs+=(--prefix XDG_CONFIG_DIRS : "$xdgConfigDir")
fi
for xdgDataSubdir in "${xdgDataSubdirs[@]}"
do
if [ -d "$1/share/$xdgDataSubdir" ]
then
qtWrapperArgs+=(--prefix XDG_DATA_DIRS : "$1/share")
break
fi
done
local manDir="$1/man"
if [ -d "$manDir" ]
then
qtWrapperArgs+=(--prefix MANPATH : "$manDir")
fi
local infoDir="$1/info"
if [ -d "$infoDir" ]
then
qtWrapperArgs+=(--prefix INFOPATH : "$infoDir")
fi
if [ -d "$1/dbus-1" ]
then
propagatedUserEnvPkgs+=" $1"
fi
}
addEnvHooks "$targetOffset" ecmHostPathHook

View File

@ -0,0 +1,11 @@
{
mkKdeDerivation,
pkg-config,
packagekit-qt,
}:
mkKdeDerivation {
pname = "frameworkintegration";
extraNativeBuildInputs = [pkg-config];
extraBuildInputs = [packagekit-qt];
}

View File

@ -0,0 +1,4 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "kapidox";
}

View File

@ -0,0 +1,12 @@
{
mkKdeDerivation,
qttools,
pkg-config,
xz,
}:
mkKdeDerivation {
pname = "karchive";
extraNativeBuildInputs = [qttools pkg-config];
extraBuildInputs = [xz];
}

View File

@ -0,0 +1,13 @@
{
mkKdeDerivation,
qttools,
}:
mkKdeDerivation {
pname = "kauth";
# Late resolve paths so things end up in their own prefix
# FIXME(later): discuss with upstream
patches = [./fix-paths.patch];
extraNativeBuildInputs = [qttools];
}

View File

@ -0,0 +1,17 @@
diff --git a/KF6AuthConfig.cmake.in b/KF6AuthConfig.cmake.in
index 4ee3f92..65a40d5 100644
--- a/KF6AuthConfig.cmake.in
+++ b/KF6AuthConfig.cmake.in
@@ -4,9 +4,9 @@ set(KAUTH_STUB_FILES_DIR "@PACKAGE_KDE_INSTALL_DATADIR_KF@/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_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}")
include(CMakeFindDependencyMacro)

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qttools,
}:
mkKdeDerivation {
pname = "kbookmarks";
extraNativeBuildInputs = [qttools];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
libical,
}:
mkKdeDerivation {
pname = "kcalendarcore";
extraBuildInputs = [libical];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qtdeclarative,
}:
mkKdeDerivation {
pname = "kcmutils";
extraPropagatedBuildInputs = [qtdeclarative];
}

View File

@ -0,0 +1,11 @@
{
mkKdeDerivation,
qttools,
gperf,
}:
mkKdeDerivation {
pname = "kcodecs";
extraNativeBuildInputs = [qttools];
extraBuildInputs = [gperf];
}

View File

@ -0,0 +1,4 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "kcolorscheme";
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qttools,
}:
mkKdeDerivation {
pname = "kcompletion";
extraNativeBuildInputs = [qttools];
}

View File

@ -0,0 +1,11 @@
{
mkKdeDerivation,
qttools,
qtdeclarative,
}:
mkKdeDerivation {
pname = "kconfig";
extraNativeBuildInputs = [qttools];
extraPropagatedBuildInputs = [qtdeclarative];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qttools,
}:
mkKdeDerivation {
pname = "kconfigwidgets";
extraBuildInputs = [qttools];
}

View File

@ -0,0 +1,4 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "kcontacts";
}

View File

@ -0,0 +1,12 @@
{
mkKdeDerivation,
qttools,
shared-mime-info,
qtdeclarative,
}:
mkKdeDerivation {
pname = "kcoreaddons";
extraNativeBuildInputs = [qttools shared-mime-info];
extraBuildInputs = [qtdeclarative];
}

View File

@ -0,0 +1,4 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "kcrash";
}

View File

@ -0,0 +1,4 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "kdav";
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qttools,
}:
mkKdeDerivation {
pname = "kdbusaddons";
extraNativeBuildInputs = [qttools];
}

View File

@ -0,0 +1,11 @@
{
mkKdeDerivation,
qtdeclarative,
spirv-tools,
}:
mkKdeDerivation {
pname = "kdeclarative";
extraNativeBuildInputs = [spirv-tools];
extraBuildInputs = [qtdeclarative];
}

View File

@ -0,0 +1,4 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "kded";
}

View File

@ -0,0 +1,7 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "kdesu";
# Look for NixOS SUID wrapper first
patches = [./kdesu-search-for-wrapped-daemon-first.patch];
}

View File

@ -0,0 +1,38 @@
From 01af4d2a098e5819c09bca37568941dcd4b89d0b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Romildo=20Malaquias?= <malaquias@gmail.com>
Date: Thu, 16 Jul 2020 13:21:42 -0300
Subject: [PATCH] Search for the daemon first in /run/wrappers/bin
If looking first in libexec, the eventually wrapped one in
/run/wrappers/bin can not be found.
---
src/client.cpp | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/client.cpp b/src/client.cpp
index 44fbacd..6b5abf5 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -384,11 +384,14 @@ int KDEsuClient::stopServer()
static QString findDaemon()
{
- QString daemon = QFile::decodeName(KDE_INSTALL_FULL_LIBEXECDIR_KF "/kdesud");
- if (!QFile::exists(daemon)) { // if not in libexec, find it in PATH
- daemon = QStandardPaths::findExecutable(QStringLiteral("kdesud"));
- if (daemon.isEmpty()) {
- qCWarning(KSU_LOG) << "kdesud daemon not found.";
+ QString daemon = QFile::decodeName("/run/wrappers/bin/kdesud");
+ if (!QFile::exists(daemon)) { // if not in wrappers
+ daemon = QFile::decodeName(KDE_INSTALL_FULL_LIBEXECDIR_KF "/kdesud");
+ if (!QFile::exists(daemon)) { // if not in libexec, find it in PATH
+ daemon = QStandardPaths::findExecutable(QStringLiteral("kdesud"));
+ if (daemon.isEmpty()) {
+ qCWarning(KSU_LOG) << "kdesud daemon not found.";
+ }
}
}
return daemon;
--
2.27.0

View File

@ -0,0 +1,11 @@
{
mkKdeDerivation,
qttools,
avahi,
}:
mkKdeDerivation {
pname = "kdnssd";
extraNativeBuildInputs = [qttools];
extraBuildInputs = [avahi];
}

View File

@ -0,0 +1,18 @@
{
mkKdeDerivation,
docbook_xml_dtd_45,
docbook-xsl-nons,
perl,
perlPackages,
}:
mkKdeDerivation {
pname = "kdoctools";
# lots of self-references, the output is pretty small (~5MB), not worth trying to untangle
outputs = ["out"];
# Perl could be used both at build time and at runtime.
extraNativeBuildInputs = [perl perlPackages.URI];
extraBuildInputs = [docbook_xml_dtd_45 docbook-xsl-nons];
extraPropagatedBuildInputs = [perl perlPackages.URI];
}

View File

@ -0,0 +1,14 @@
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 84cc68c..2e02194 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -85,7 +85,7 @@ install(TARGETS KF6FileMetaData EXPORT KF6FileMetaDataTargets ${KF_INSTALL_TARGE
install(EXPORT KF6FileMetaDataTargets
NAMESPACE KF6::
- DESTINATION ${KDE_INSTALL_LIBDIR}/cmake/KF6FileMetaData
+ DESTINATION ${KDE_INSTALL_FULL_CMAKEPACKAGEDIR}/KF6FileMetaData
FILE KF6FileMetaDataTargets.cmake)
install(FILES

View File

@ -0,0 +1,21 @@
{
mkKdeDerivation,
pkg-config,
attr,
ebook_tools,
exiv2,
ffmpeg,
kconfig,
kdegraphics-mobipocket,
libappimage,
}:
mkKdeDerivation {
pname = "kfilemetadata";
# Fix installing cmake files into wrong directory
# FIXME(later): upstream
patches = [./cmake-install-paths.patch];
extraNativeBuildInputs = [pkg-config];
extraBuildInputs = [attr ebook_tools exiv2 ffmpeg kconfig kdegraphics-mobipocket libappimage];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qttools,
}:
mkKdeDerivation {
pname = "kglobalaccel";
extraNativeBuildInputs = [qttools];
}

View File

@ -0,0 +1,12 @@
{
mkKdeDerivation,
qtwayland,
pkg-config,
wayland,
}:
mkKdeDerivation {
pname = "kguiaddons";
extraNativeBuildInputs = [pkg-config];
extraBuildInputs = [qtwayland wayland];
}

View File

@ -0,0 +1,11 @@
{
mkKdeDerivation,
qttools,
qtdeclarative,
}:
mkKdeDerivation {
pname = "kholidays";
extraNativeBuildInputs = [qttools];
extraBuildInputs = [qtdeclarative];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qtdeclarative,
}:
mkKdeDerivation {
pname = "ki18n";
extraBuildInputs = [qtdeclarative];
}

View File

@ -0,0 +1,15 @@
{
mkKdeDerivation,
qtdeclarative,
qtsvg,
qttools,
}:
mkKdeDerivation {
pname = "kiconthemes";
extraBuildInputs = [
qtdeclarative
qtsvg
qttools
];
}

View File

@ -0,0 +1,13 @@
{
mkKdeDerivation,
qtwayland,
pkg-config,
wayland-protocols,
xorg,
}:
mkKdeDerivation {
pname = "kidletime";
extraNativeBuildInputs = [pkg-config];
extraBuildInputs = [qtwayland xorg.libXScrnSaver wayland-protocols];
}

View File

@ -0,0 +1,16 @@
{
mkKdeDerivation,
pkg-config,
libheif,
libjxl,
libavif,
libraw,
openexr_3,
}:
mkKdeDerivation {
pname = "kimageformats";
extraCmakeFlags = ["-DKIMAGEFORMATS_HEIF=1"];
extraNativeBuildInputs = [pkg-config];
extraBuildInputs = [libheif libjxl libavif libraw openexr_3];
}

View File

@ -0,0 +1,25 @@
From af54a2a37655df26a33bc6783cb472c38f65322f Mon Sep 17 00:00:00 2001
From: Thomas Tuegel <ttuegel@mailbox.org>
Date: Sun, 28 Mar 2021 10:31:12 -0500
Subject: [PATCH 1/2] Remove impure smbd search path
---
src/core/ksambashare.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/core/ksambashare.cpp b/src/core/ksambashare.cpp
index e810ce4..7cfb4e6 100644
--- a/src/core/ksambashare.cpp
+++ b/src/core/ksambashare.cpp
@@ -61,7 +61,7 @@ KSambaSharePrivate::~KSambaSharePrivate()
bool KSambaSharePrivate::isSambaInstalled()
{
const bool daemonExists =
- !QStandardPaths::findExecutable(QStringLiteral("smbd"), {QStringLiteral("/usr/sbin/"), QStringLiteral("/usr/local/sbin/")}).isEmpty();
+ !QStandardPaths::findExecutable(QStringLiteral("smbd")).isEmpty();
if (!daemonExists) {
qCDebug(KIO_CORE_SAMBASHARE) << "KSambaShare: Could not find smbd";
}
--
2.30.1

View File

@ -0,0 +1,18 @@
{
mkKdeDerivation,
qt5compat,
qttools,
acl,
attr,
}:
mkKdeDerivation {
pname = "kio";
patches = [
# Remove hardcoded smbd search path
# FIXME(later): discuss with upstream?
./0001-Remove-impure-smbd-search-path.patch
];
extraBuildInputs = [qt5compat qttools acl attr];
}

View File

@ -0,0 +1,14 @@
{
mkKdeDerivation,
qtsvg,
qttools,
qtdeclarative,
qt5compat,
}:
mkKdeDerivation {
pname = "kirigami";
extraNativeBuildInputs = [qtsvg qttools];
extraBuildInputs = [qtdeclarative];
extraPropagatedBuildInputs = [qt5compat];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qtdeclarative,
}:
mkKdeDerivation {
pname = "kitemmodels";
extraBuildInputs = [qtdeclarative];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qttools,
}:
mkKdeDerivation {
pname = "kitemviews";
extraNativeBuildInputs = [qttools];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qttools,
}:
mkKdeDerivation {
pname = "kjobwidgets";
extraNativeBuildInputs = [qttools];
}

View File

@ -0,0 +1,16 @@
{
mkKdeDerivation,
qtdeclarative,
qttools,
kcmutils,
}:
mkKdeDerivation {
pname = "knewstuff";
# Late resolve knsrcdir so other things install to their own prefix
# FIXME(later): upstream
patches = [./delay-resolving-knsrcdir.patch];
extraBuildInputs = [qtdeclarative qttools];
extraPropagatedBuildInputs = [kcmutils];
}

View File

@ -0,0 +1,14 @@
diff --git a/KF6NewStuffCoreConfig.cmake.in b/KF6NewStuffCoreConfig.cmake.in
index d70f7132..f75e9fce 100644
--- a/KF6NewStuffCoreConfig.cmake.in
+++ b/KF6NewStuffCoreConfig.cmake.in
@@ -20,7 +20,7 @@ if (NOT @BUILD_SHARED_LIBS@)
endif()
endif()
-set(KDE_INSTALL_KNSRCDIR "@KDE_INSTALL_DATADIR@/knsrcfiles")
+set(KDE_INSTALL_KNSRCDIR "${KDE_INSTALL_DATADIR}/knsrcfiles")
include("${CMAKE_CURRENT_LIST_DIR}/KF6NewStuffCoreTargets.cmake")
@PACKAGE_INCLUDE_CORE_QCHTARGETS@

View File

@ -0,0 +1,12 @@
{
mkKdeDerivation,
qttools,
qtdeclarative,
libcanberra,
}:
mkKdeDerivation {
pname = "knotifications";
extraNativeBuildInputs = [qttools];
extraBuildInputs = [qtdeclarative libcanberra];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
libcanberra,
}:
mkKdeDerivation {
pname = "knotifyconfig";
extraBuildInputs = [libcanberra];
}

View File

@ -0,0 +1,8 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "kpackage";
# Follow symlinks when resolving packages
# FIXME(later): upstream
patches = [./follow-symlinks.patch];
}

View File

@ -0,0 +1,13 @@
diff --git a/src/kpackage/packageloader.cpp b/src/kpackage/packageloader.cpp
index 9dbd1f6..c50a6e5 100644
--- a/src/kpackage/packageloader.cpp
+++ b/src/kpackage/packageloader.cpp
@@ -128,7 +128,7 @@ QList<KPluginMetaData> PackageLoader::listPackages(const QString &packageFormat,
}
for (auto const &plugindir : std::as_const(paths)) {
- QDirIterator it(plugindir, QStringList{QStringLiteral("metadata.json")}, QDir::Files, QDirIterator::Subdirectories);
+ QDirIterator it(plugindir, QStringList{QStringLiteral("metadata.json")}, QDir::Files, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
std::unordered_set<QString> dirs;
while (it.hasNext()) {
it.next();

View File

@ -0,0 +1,4 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "kparts";
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qtdeclarative,
}:
mkKdeDerivation {
pname = "kpeople";
extraBuildInputs = [qtdeclarative];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qttools,
}:
mkKdeDerivation {
pname = "kplotting";
extraBuildInputs = [qttools];
}

View File

@ -0,0 +1,4 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "kpty";
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qtdeclarative,
}:
mkKdeDerivation {
pname = "kquickcharts";
extraBuildInputs = [qtdeclarative];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
plasma-activities,
}:
mkKdeDerivation {
pname = "krunner";
extraBuildInputs = [plasma-activities];
}

View File

@ -0,0 +1,10 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "kservice";
patches = [
# follow symlinks when generating sycoca
# FIXME(later): upstream
./qdiriterator-follow-symlinks.patch
];
}

View File

@ -0,0 +1,13 @@
diff --git a/src/sycoca/kbuildsycoca.cpp b/src/sycoca/kbuildsycoca.cpp
index b125299..0682b90 100644
--- a/src/sycoca/kbuildsycoca.cpp
+++ b/src/sycoca/kbuildsycoca.cpp
@@ -207,7 +207,7 @@ bool KBuildSycoca::build()
const QStringList dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, m_resourceSubdir, QStandardPaths::LocateDirectory);
qCDebug(SYCOCA) << "Looking for subdir" << m_resourceSubdir << "=>" << dirs;
for (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...

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qttools,
}:
mkKdeDerivation {
pname = "kstatusnotifieritem";
extraNativeBuildInputs = [qttools];
}

View File

@ -0,0 +1,10 @@
{
mkKdeDerivation,
qtdeclarative,
qtsvg,
}:
mkKdeDerivation {
pname = "ksvg";
extraBuildInputs = [qtdeclarative qtsvg];
}

View File

@ -0,0 +1,11 @@
{
mkKdeDerivation,
qtdeclarative,
qtspeech,
editorconfig-core-c,
}:
mkKdeDerivation {
pname = "ktexteditor";
extraBuildInputs = [qtdeclarative qtspeech editorconfig-core-c];
}

View File

@ -0,0 +1,9 @@
{
mkKdeDerivation,
qtdeclarative,
}:
mkKdeDerivation {
pname = "ktexttemplate";
extraBuildInputs = [qtdeclarative];
}

View File

@ -0,0 +1,13 @@
{
mkKdeDerivation,
qtspeech,
qttools,
}:
mkKdeDerivation {
pname = "ktextwidgets";
extraBuildInputs = [
qtspeech
qttools
];
}

View File

@ -0,0 +1,4 @@
{mkKdeDerivation}:
mkKdeDerivation {
pname = "kunitconversion";
}

View File

@ -0,0 +1,12 @@
{
mkKdeDerivation,
qttools,
qtsvg,
}:
mkKdeDerivation {
pname = "kuserfeedback";
# Disable server-side stuff we don't care about
extraCmakeFlags = ["-DENABLE_CONSOLE=0" "-DENABLE_CLI=0"];
extraNativeBuildInputs = [qttools qtsvg];
}

Some files were not shown because too many files have changed in this diff Show More