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,16 +466,23 @@ let
'';
};
enableKwallet = mkOption {
default = false;
type = types.bool;
description = lib.mdDoc ''
If enabled, pam_wallet will attempt to automatically unlock the
user's default KDE wallet upon login. If the user has no wallet named
"kdewallet", or the login password does not match their wallet
password, KDE will prompt separately after login.
'';
kwallet = {
enable = mkOption {
default = false;
type = types.bool;
description = lib.mdDoc ''
If enabled, pam_wallet will attempt to automatically unlock the
user's default KDE wallet upon login. If the user has no wallet named
"kdewallet", or the login password does not match their wallet
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 ];
for i in *; do
if [ "$i" == "bin" ]; then
continue
fi
ln -s ${unwrapped}/$i $out/$i
done
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)/"
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