From 499f13a63482e5fcbd86ded3b74ee1362ab0ae3b Mon Sep 17 00:00:00 2001 From: r0chd Date: Wed, 9 Sep 2026 01:51:29 +0200 Subject: [PATCH 1/2] chore: add nix --- default.nix | 37 +++++++++++++++ flake.lock | 45 ++++++++++++++++++ flake.nix | 84 ++++++++++++++++++++++++++++++++++ nix/flake-parse.nix | 12 +++++ nix/formatter.nix | 17 +++++++ nix/package.nix | 108 ++++++++++++++++++++++++++++++++++++++++++++ nix/shell.nix | 31 +++++++++++++ 7 files changed, 334 insertions(+) create mode 100644 default.nix create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 nix/flake-parse.nix create mode 100644 nix/formatter.nix create mode 100644 nix/package.nix create mode 100644 nix/shell.nix diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..e613104 --- /dev/null +++ b/default.nix @@ -0,0 +1,37 @@ +{ + rust-overlay ? import (import ./nix/flake-parse.nix "rust-overlay"), + pkgs ? import (import ./nix/flake-parse.nix "nixpkgs") { + system = builtins.currentSystem; + overlays = [ rust-overlay ]; + }, +}: +let + rustToolchain = pkgs.rust-bin.stable.latest.default.override { + extensions = [ + "rust-analyzer" + "rust-src" + "llvm-tools" + ]; + }; +in +{ + shell = import ./nix/shell.nix { + inherit pkgs rustToolchain; + }; + + formatter = import ./nix/formatter.nix { inherit pkgs rustToolchain; }; + + packages = + let + rustPlatform = pkgs.makeRustPlatform { + cargo = rustToolchain; + rustc = rustToolchain; + }; + in + rec { + default = pkgs.callPackage ./nix/package.nix { + inherit rustPlatform; + }; + sessiond-seat = default; + }; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..014c16f --- /dev/null +++ b/flake.lock @@ -0,0 +1,45 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1788881743, + "narHash": "sha256-151taSq/21cxagiIu7hyMVl68+FbHfwBP4lh6TB6KOM=", + "rev": "d6524aaca2ff07876657ae2b323f24be4874944b", + "type": "tarball", + "url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1069856.d6524aaca2ff/nixexprs.tar.xz" + }, + "original": { + "type": "tarball", + "url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1788851328, + "narHash": "sha256-YOwlUD0Lt/3SulKhZ7z0Jmgbq/DWh8SjnGwUlFSw+YM=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "6ae57a71bcb0bebc7a66cc2bd76942c4cf649167", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..8a12faa --- /dev/null +++ b/flake.nix @@ -0,0 +1,84 @@ +{ + inputs = { + nixpkgs.url = "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz"; + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = + { + self, + nixpkgs, + rust-overlay, + ... + }: + let + systems = [ + "x86_64-linux" + "aarch64-linux" + ]; + + pkgsFor = + system: + import nixpkgs { + inherit system; + overlays = [ rust-overlay.overlays.default ]; + }; + + forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f (pkgsFor system)); + in + { + devShells = forAllSystems (pkgs: { + default = + let + rustToolchain = pkgs.rust-bin.stable.latest.default.override { + extensions = [ + "rust-analyzer" + "rust-src" + "llvm-tools" + ]; + }; + in + import ./nix/shell.nix { inherit pkgs rustToolchain; }; + }); + + packages = forAllSystems ( + pkgs: + let + rustToolchain = pkgs.rust-bin.stable.latest.default.override { + extensions = [ + "rust-analyzer" + "rust-src" + "llvm-tools" + ]; + }; + rustPlatform = pkgs.makeRustPlatform { + cargo = rustToolchain; + rustc = rustToolchain; + }; + in + { + cosmic-greeter = pkgs.callPackage ./nix/package.nix { + inherit rustPlatform; + }; + default = self.packages.${pkgs.stdenv.hostPlatform.system}.cosmic-greeter; + } + ); + + formatter = forAllSystems ( + pkgs: + let + rustToolchain = pkgs.rust-bin.stable.latest.default.override { + extensions = [ + "rust-analyzer" + "rust-src" + "llvm-tools" + ]; + }; + in + import ./nix/formatter.nix { inherit pkgs rustToolchain; } + ); + }; +} diff --git a/nix/flake-parse.nix b/nix/flake-parse.nix new file mode 100644 index 0000000..45799f4 --- /dev/null +++ b/nix/flake-parse.nix @@ -0,0 +1,12 @@ +inputName: +let + lock = builtins.fromJSON (builtins.readFile ../flake.lock); + namedNode = lock.nodes.${lock.nodes.root.inputs.${inputName}}.locked; + githubTarball = fetchTarball { + url = + namedNode.url + or "https://github.com/${namedNode.owner}/${namedNode.repo}/archive/${namedNode.rev}.tar.gz"; + sha256 = namedNode.narHash; + }; +in +githubTarball diff --git a/nix/formatter.nix b/nix/formatter.nix new file mode 100644 index 0000000..c5039e8 --- /dev/null +++ b/nix/formatter.nix @@ -0,0 +1,17 @@ +{ pkgs, rustToolchain }: +pkgs.writeShellApplication { + name = "nix3-fmt-wrapper"; + runtimeInputs = builtins.attrValues { + inherit (pkgs) + nixfmt + taplo + fd + ; + inherit rustToolchain; + }; + text = '' + fd "$@" -t f -e nix -x nixfmt -q '{}' + fd "$@" -t f -e toml -x taplo format '{}' + cargo fmt + ''; +} diff --git a/nix/package.nix b/nix/package.nix new file mode 100644 index 0000000..5dbad01 --- /dev/null +++ b/nix/package.nix @@ -0,0 +1,108 @@ +{ + lib, + stdenv, + fetchFromGitHub, + rustPlatform, + libcosmicAppHook, + cmake, + just, + cosmic-randr, + dav1d, + libinput, + linux-pam, + udev, + coreutils, + xkeyboard_config, + nixosTests, + orca, + withLogind ? true, + withUpower ? true, + withNetworkManager ? true, +}: + +rustPlatform.buildRustPackage (finalAttrs: { + pname = "cosmic-greeter"; + version = "1.6.0"; + + src = fetchFromGitHub { + owner = "pop-os"; + repo = "cosmic-greeter"; + tag = "epoch-${finalAttrs.version}"; + hash = "sha256-hDVdl2+7NVLA+YxO2HToni57IEr0i4OGTsYDc3YGTuw="; + }; + + postPatch = '' + substituteInPlace src/greeter.rs --replace-fail '/usr/bin/env' '${lib.getExe' coreutils "env"}' + substituteInPlace src/greeter.rs --replace-fail '/usr/bin/orca' '${lib.getExe orca}' + ''; + + cargoHash = "sha256-vHR9go8/iVUT7oBV8h+mmBvhi2oSKNBKtV0uoDOr6go="; + + buildNoDefaultFeatures = true; + + buildFeatures = + lib.optionals withLogind [ "logind" ] + ++ lib.optionals withUpower [ "upower" ] + ++ lib.optionals withNetworkManager [ "networkmanager" ]; + + separateDebugInfo = true; + __structuredAttrs = true; + + env.VERGEN_GIT_SHA = finalAttrs.src.tag; + + nativeBuildInputs = [ + rustPlatform.bindgenHook + cmake + just + libcosmicAppHook + ]; + + buildInputs = [ + cosmic-randr + dav1d + libinput + linux-pam + udev + orca + ]; + + dontUseJustBuild = true; + dontUseJustCheck = true; + + justFlags = [ + "--set" + "prefix" + (placeholder "out") + "--set" + "cargo-target-dir" + "target/${stdenv.hostPlatform.rust.cargoShortTarget}" + ]; + + preFixup = '' + libcosmicAppWrapperArgs+=( + --prefix PATH : ${lib.makeBinPath [ cosmic-randr ]} + --set-default X11_BASE_RULES_XML ${xkeyboard_config}/share/X11/xkb/rules/base.xml + --set-default X11_BASE_EXTRA_RULES_XML ${xkeyboard_config}/share/X11/xkb/rules/extra.xml + ) + ''; + + passthru = { + tests = { + inherit (nixosTests) + cosmic + cosmic-autologin + cosmic-noxwayland + cosmic-autologin-noxwayland + ; + }; + }; + + meta = { + homepage = "https://github.com/pop-os/cosmic-greeter"; + description = "Greeter for the COSMIC Desktop Environment"; + mainProgram = "cosmic-greeter"; + license = lib.licenses.gpl3Only; + teams = [ lib.teams.cosmic ]; + platforms = lib.platforms.linux; + }; +}) diff --git a/nix/shell.nix b/nix/shell.nix new file mode 100644 index 0000000..e188f12 --- /dev/null +++ b/nix/shell.nix @@ -0,0 +1,31 @@ +{ pkgs, rustToolchain }: +pkgs.mkShell { + name = "cosmic-greeter-devshell"; + packages = builtins.attrValues { + inherit + rustToolchain + ; + inherit (pkgs) + rust-analyzer-unwrapped + nixd + libxkbcommon + dav1d + libinput + linux-pam + gcc + glibc + cmake + ; + inherit (pkgs.llvmPackages) + libclang + llvm + ; + }; + + nativeBuildInputs = [ pkgs.pkg-config ]; + + RUST_SRC_PATH = "${rustToolchain}/lib/rustlib/src/rust/library"; + LLVM_CONFIG_PATH = "${pkgs.llvmPackages.llvm}/bin/llvm-config"; + LIBCLANG_PATH = "${pkgs.llvmPackages.libclang.lib}/lib"; + BINDGEN_EXTRA_CLANG_ARGS = "-I${pkgs.linux-pam}/include -I${pkgs.glibc.dev}/include"; +} From 14cc125fcde876f4e4cfd56321933fc7d6a6dfcc Mon Sep 17 00:00:00 2001 From: r0chd Date: Wed, 9 Sep 2026 02:24:24 +0200 Subject: [PATCH 2/2] fix: compile without the `logind` feature --- src/greeter.rs | 7 ++++--- src/locker.rs | 10 ++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/greeter.rs b/src/greeter.rs index b5d24b7..01ebad1 100644 --- a/src/greeter.rs +++ b/src/greeter.rs @@ -279,8 +279,6 @@ pub fn main() -> Result<(), Box> { sessions }; - let logind_available = cfg!(feature = "logind") && crate::logind::is_available(); - let flags = Flags { user_icons: user_datas .iter_mut() @@ -290,7 +288,10 @@ pub fn main() -> Result<(), Box> { sessions, greeter_config, greeter_config_handler, - logind_available, + #[cfg(feature = "logind")] + logind_available: crate::logind::is_available(), + #[cfg(not(feature = "logind"))] + logind_available: false, }; let settings = Settings::default().no_main_window(true); diff --git a/src/locker.rs b/src/locker.rs index c59e38e..74d0273 100644 --- a/src/locker.rs +++ b/src/locker.rs @@ -79,8 +79,6 @@ pub fn main(user: pwd::Passwd) -> Result<(), Box> { // We are already the user at this point user_data.load_config_as_user(); - let logind_available = cfg!(feature = "logind") && crate::logind::is_available(); - let flags = Flags { user_icon: user_data .icon_opt @@ -88,7 +86,10 @@ pub fn main(user: pwd::Passwd) -> Result<(), Box> { .map(widget::image::Handle::from_bytes), user_data, lockfile_opt: lockfile_opt(), - logind_available, + #[cfg(feature = "logind")] + logind_available: crate::logind::is_available(), + #[cfg(not(feature = "logind"))] + logind_available: false, }; let settings = Settings::default().no_main_window(true); @@ -1226,7 +1227,8 @@ impl cosmic::Application for App { }), ); - if cfg!(feature = "logind") && self.flags.logind_available { + #[cfg(feature = "logind")] + if self.flags.logind_available { subscriptions.push(crate::logind::subscription()); }