From a86f8b5d503ee03bc93a853bbabae3a22a9e1668 Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Wed, 17 Apr 2024 21:38:51 +0100 Subject: [PATCH 1/4] build(nix): update substituters to use garnix cache --- flake.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index 25655d7..31ce218 100644 --- a/flake.nix +++ b/flake.nix @@ -209,7 +209,7 @@ }; }; nixConfig = { - extra-substituters = ["https://jakestanger.cachix.org"]; - extra-trusted-public-keys = ["jakestanger.cachix.org-1:VWJE7AWNe5/KOEvCQRxoE8UsI2Xs2nHULJ7TEjYm7mM="]; + extra-substituters = ["https://cache.garnix.io"]; + extra-trusted-public-keys = ["cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g="]; }; } From 80f16c50378827e21ebd58a7507f6a0bbf967fd3 Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Wed, 17 Apr 2024 21:43:46 +0100 Subject: [PATCH 2/4] style(nix): format --- flake.nix | 384 +++++++++++++++++++++++++----------------------- nix/default.nix | 78 +++++----- 2 files changed, 237 insertions(+), 225 deletions(-) diff --git a/flake.nix b/flake.nix index 31ce218..9cd34df 100644 --- a/flake.nix +++ b/flake.nix @@ -1,215 +1,225 @@ { description = "Nix Flake for ironbar"; + inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + rust-overlay = { url = "github:oxalica/rust-overlay"; inputs.nixpkgs.follows = "nixpkgs"; }; + crane = { url = "github:ipetkov/crane"; inputs.nixpkgs.follows = "nixpkgs"; }; + naersk.url = "github:nix-community/naersk"; }; - outputs = { - self, - nixpkgs, - rust-overlay, - crane, - naersk, - ... - }: let - inherit (nixpkgs) lib; - genSystems = lib.genAttrs [ - "aarch64-linux" - "x86_64-linux" - ]; - pkgsFor = system: - import nixpkgs { - inherit system; - overlays = [ - self.overlays.default - rust-overlay.overlays.default - ]; - }; - mkRustToolchain = pkgs: - pkgs.rust-bin.stable.latest.default.override { - extensions = ["rust-src"]; - }; - in { - overlays.default = final: prev: let - rust = mkRustToolchain final; - craneLib = (crane.mkLib final).overrideToolchain rust; - naersk' = prev.callPackage naersk { - cargo = rust; - rustc = rust; - }; + outputs = { self, nixpkgs, rust-overlay, crane, naersk, ... }: + let + inherit (nixpkgs) lib; + + genSystems = lib.genAttrs [ "aarch64-linux" "x86_64-linux" ]; + + pkgsFor = system: + import nixpkgs { + inherit system; + + overlays = [ self.overlays.default rust-overlay.overlays.default ]; + }; + + mkRustToolchain = pkgs: + pkgs.rust-bin.stable.latest.default.override { + extensions = [ "rust-src" ]; + }; - rustPlatform = prev.makeRustPlatform { - cargo = rust; - rustc = rust; - }; - props = builtins.fromTOML (builtins.readFile ./Cargo.toml); - mkDate = longDate: (lib.concatStringsSep "-" [ - (builtins.substring 0 4 longDate) - (builtins.substring 4 2 longDate) - (builtins.substring 6 2 longDate) - ]); - builder = "naersk"; in { - ironbar = let - version = props.package.version + "+date=" + (mkDate (self.lastModifiedDate or "19700101")) + "_" + (self.shortRev or "dirty"); - in - if builder == "crane" - then - prev.callPackage ./nix/default.nix { - inherit version; - inherit rustPlatform; - builderName = builder; - builder = craneLib; - } - else if builder == "naersk" - then - prev.callPackage ./nix/default.nix { - inherit version; - inherit rustPlatform; - builderName = builder; - builder = naersk'; - } - else - prev.callPackage ./nix/default.nix { - inherit version; - inherit rustPlatform; - builderName = builder; + overlays.default = final: prev: + let + rust = mkRustToolchain final; + + craneLib = (crane.mkLib final).overrideToolchain rust; + + naersk' = prev.callPackage naersk { + cargo = rust; + rustc = rust; }; - }; - packages = genSystems ( - system: let - pkgs = pkgsFor system; - in - (self.overlays.default pkgs pkgs) - // { + + rustPlatform = prev.makeRustPlatform { + cargo = rust; + rustc = rust; + }; + + props = builtins.fromTOML (builtins.readFile ./Cargo.toml); + + mkDate = longDate: + (lib.concatStringsSep "-" [ + (builtins.substring 0 4 longDate) + (builtins.substring 4 2 longDate) + (builtins.substring 6 2 longDate) + ]); + + builder = "naersk"; + in { + ironbar = let + version = props.package.version + "+date=" + + (mkDate (self.lastModifiedDate or "19700101")) + "_" + + (self.shortRev or "dirty"); + in if builder == "crane" then + prev.callPackage ./nix/default.nix { + inherit version; + inherit rustPlatform; + builderName = builder; + builder = craneLib; + } + else if builder == "naersk" then + prev.callPackage ./nix/default.nix { + inherit version; + inherit rustPlatform; + builderName = builder; + builder = naersk'; + } + else + prev.callPackage ./nix/default.nix { + inherit version; + inherit rustPlatform; + builderName = builder; + }; + }; + + packages = genSystems (system: + let pkgs = pkgsFor system; + in (self.overlays.default pkgs pkgs) // { default = self.packages.${system}.ironbar; - } - ); - apps = genSystems (system: let - pkgs = pkgsFor system; - in { - default = { - type = "app"; - program = "${pkgs.ironbar}/bin/ironbar"; - }; - ironbar = { - type = "app"; - program = "${pkgs.ironbar}/bin/ironbar"; - }; - }); + }); - devShells = genSystems (system: let - pkgs = pkgsFor system; - rust = mkRustToolchain pkgs; - - in { - default = pkgs.mkShell { - packages = with pkgs; [ - rust - rust-analyzer-unwrapped - gcc - gtk3 - gtk-layer-shell - pkg-config - openssl - gdk-pixbuf - glib - glib-networking - shared-mime-info - gnome.adwaita-icon-theme - hicolor-icon-theme - gsettings-desktop-schemas - libxkbcommon - libpulseaudio - luajit - luajitPackages.lgi - ]; - - RUST_SRC_PATH = "${rust}/lib/rustlib/src/rust/library"; - }; - - }); - - homeManagerModules.default = { - config, - lib, - pkgs, - ... - }: let - cfg = config.programs.ironbar; - defaultIronbarPackage = self.packages.${pkgs.hostPlatform.system}.default; - jsonFormat = pkgs.formats.json {}; - in { - options.programs.ironbar = { - enable = lib.mkEnableOption "ironbar status bar"; - package = lib.mkOption { - type = with lib.types; package; - default = defaultIronbarPackage; - description = "The package for ironbar to use."; - }; - systemd = lib.mkOption { - type = lib.types.bool; - default = pkgs.stdenv.isLinux; - description = "Whether to enable to systemd service for ironbar."; - }; - style = lib.mkOption { - type = lib.types.lines; - default = ""; - description = "The stylesheet to apply to ironbar."; - }; - config = lib.mkOption { - type = jsonFormat.type; - default = {}; - description = "The config to pass to ironbar."; - }; - features = lib.mkOption { - type = lib.types.listOf lib.types.nonEmptyStr; - default = []; - description = "The features to be used."; - }; - }; - config = let - pkg = cfg.package.override {features = cfg.features;}; - in - lib.mkIf cfg.enable { - home.packages = [pkg]; - xdg.configFile = { - "ironbar/config.json" = lib.mkIf (cfg.config != "") { - source = jsonFormat.generate "ironbar-config" cfg.config; - }; - "ironbar/style.css" = lib.mkIf (cfg.style != "") { - text = cfg.style; - }; + apps = genSystems (system: + let pkgs = pkgsFor system; + in { + default = { + type = "app"; + program = "${pkgs.ironbar}/bin/ironbar"; }; - systemd.user.services.ironbar = lib.mkIf cfg.systemd { - Unit = { - Description = "Systemd service for Ironbar"; - Requires = ["graphical-session.target"]; - }; - Service = { - Type = "simple"; - ExecStart = "${pkg}/bin/ironbar"; - }; - Install.WantedBy = [ - (lib.mkIf config.wayland.windowManager.hyprland.systemd.enable "hyprland-session.target") - (lib.mkIf config.wayland.windowManager.sway.systemd.enable "sway-session.target") - (lib.mkIf config.wayland.windowManager.river.systemd.enable "river-session.target") + + ironbar = { + type = "app"; + program = "${pkgs.ironbar}/bin/ironbar"; + }; + }); + + devShells = genSystems (system: + let + pkgs = pkgsFor system; + rust = mkRustToolchain pkgs; + + in { + default = pkgs.mkShell { + packages = with pkgs; [ + rust + rust-analyzer-unwrapped + gcc + gtk3 + gtk-layer-shell + pkg-config + openssl + gdk-pixbuf + glib + glib-networking + shared-mime-info + gnome.adwaita-icon-theme + hicolor-icon-theme + gsettings-desktop-schemas + libxkbcommon + libpulseaudio + luajit + luajitPackages.lgi ]; + + RUST_SRC_PATH = "${rust}/lib/rustlib/src/rust/library"; + }; + + }); + + homeManagerModules.default = { config, lib, pkgs, ... }: + let + cfg = config.programs.ironbar; + defaultIronbarPackage = + self.packages.${pkgs.hostPlatform.system}.default; + jsonFormat = pkgs.formats.json { }; + in { + options.programs.ironbar = { + enable = lib.mkEnableOption "ironbar status bar"; + + package = lib.mkOption { + type = with lib.types; package; + default = defaultIronbarPackage; + description = "The package for ironbar to use."; + }; + + systemd = lib.mkOption { + type = lib.types.bool; + default = pkgs.stdenv.isLinux; + description = "Whether to enable to systemd service for ironbar."; + }; + + style = lib.mkOption { + type = lib.types.lines; + default = ""; + description = "The stylesheet to apply to ironbar."; + }; + + config = lib.mkOption { + type = jsonFormat.type; + default = { }; + description = "The config to pass to ironbar."; + }; + + features = lib.mkOption { + type = lib.types.listOf lib.types.nonEmptyStr; + default = [ ]; + description = "The features to be used."; + }; + + }; + config = let pkg = cfg.package.override { features = cfg.features; }; + in lib.mkIf cfg.enable { + home.packages = [ pkg ]; + + xdg.configFile = { + "ironbar/config.json" = lib.mkIf (cfg.config != "") { + source = jsonFormat.generate "ironbar-config" cfg.config; + }; + + "ironbar/style.css" = + lib.mkIf (cfg.style != "") { text = cfg.style; }; + }; + + systemd.user.services.ironbar = lib.mkIf cfg.systemd { + Unit = { + Description = "Systemd service for Ironbar"; + Requires = [ "graphical-session.target" ]; + }; + + Service = { + Type = "simple"; + ExecStart = "${pkg}/bin/ironbar"; + }; + + Install.WantedBy = with config.wayland.windowManager; [ + (lib.mkIf hyprland.systemd.enable "hyprland-session.target") + (lib.mkIf sway.systemd.enable "sway-session.target") + (lib.mkIf river.systemd.enable "river-session.target") + ]; + }; }; }; }; - }; + nixConfig = { - extra-substituters = ["https://cache.garnix.io"]; - extra-trusted-public-keys = ["cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g="]; + extra-substituters = [ "https://cache.garnix.io" ]; + extra-trusted-public-keys = + [ "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" ]; }; } diff --git a/nix/default.nix b/nix/default.nix index f013470..a769c02 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -27,12 +27,19 @@ }: let basePkg = rec { inherit version; + pname = "ironbar"; + src = builtins.path { name = "ironbar"; path = lib.cleanSource ../.; }; - nativeBuildInputs = [ pkg-config wrapGAppsHook gobject-introspection ]; + + nativeBuildInputs = [ + pkg-config + wrapGAppsHook + gobject-introspection + ]; buildInputs = [ gtk3 @@ -50,7 +57,7 @@ luajit ]; - propagatedBuildInputs = [ gtk3 ]; + propagatedBuildInputs = [ gtk3 ]; lgi = luajitPackages.lgi; @@ -70,53 +77,48 @@ --prefix LUA_CPATH : "./?.so;${lgi}/lib/lua/5.1/?.so;${luajit}/lib/lua/5.1/?.so;${luajit}/lib/lua/5.1/loadall.so" ) ''; + passthru = { updateScript = gnome.updateScript { packageName = pname; attrPath = "gnome.${pname}"; }; }; + meta = with lib; { homepage = "https://github.com/JakeStanger/ironbar"; - description = "Customisable gtk-layer-shell wlroots/sway bar written in rust."; + description = + "Customisable gtk-layer-shell wlroots/sway bar written in rust."; license = licenses.mit; platforms = platforms.linux; mainProgram = "ironbar"; }; + }; + flags = let - noDefault = - if features == [] - then "" - else "--no-default-features"; - featuresStr = - if features == [] - then "" - else ''-F "${builtins.concatStringsSep "," features}"''; - in [noDefault featuresStr]; -in - if builderName == "naersk" - then - builder.buildPackage (basePkg - // { - cargoBuildOptions = old: old ++ flags; - }) - else if builderName == "crane" - then - builder.buildPackage (basePkg - // { - cargoExtraArgs = builtins.concatStringsSep " " flags; - doCheck = false; - }) - else - rustPlatform.buildRustPackage (basePkg - // { - buildNoDefaultFeatures = - if features == [] - then false - else true; - buildFeatures = features; - cargoDeps = rustPlatform.importCargoLock {lockFile = ../Cargo.lock;}; - cargoLock.lockFile = ../Cargo.lock; - cargoLock.outputHashes."stray-0.1.3" = "sha256-7mvsWZFmPWti9AiX67h6ZlWiVVRZRWIxq3pVaviOUtc="; - }) + noDefault = if features == [ ] then "" else "--no-default-features"; + + featuresStr = if features == [ ] then + "" + else + ''-F "${builtins.concatStringsSep "," features}"''; + + in [ noDefault featuresStr ]; +in if builderName == "naersk" then + builder.buildPackage (basePkg // { cargoBuildOptions = old: old ++ flags; }) +else if builderName == "crane" then + builder.buildPackage (basePkg // { + cargoExtraArgs = builtins.concatStringsSep " " flags; + doCheck = false; + }) +else + rustPlatform.buildRustPackage (basePkg // { + buildNoDefaultFeatures = features != [ ]; + + buildFeatures = features; + cargoDeps = rustPlatform.importCargoLock { lockFile = ../Cargo.lock; }; + cargoLock.lockFile = ../Cargo.lock; + cargoLock.outputHashes."stray-0.1.3" = + "sha256-7mvsWZFmPWti9AiX67h6ZlWiVVRZRWIxq3pVaviOUtc="; + }) From 314bfe7abecec66692d138b49186865c9132c6ef Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Wed, 17 Apr 2024 22:04:19 +0100 Subject: [PATCH 3/4] refactor(nix): simplify flake --- flake.nix | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/flake.nix b/flake.nix index 9cd34df..ac2a5ea 100644 --- a/flake.nix +++ b/flake.nix @@ -97,16 +97,13 @@ apps = genSystems (system: let pkgs = pkgsFor system; - in { - default = { - type = "app"; - program = "${pkgs.ironbar}/bin/ironbar"; - }; - + in rec { ironbar = { type = "app"; program = "${pkgs.ironbar}/bin/ironbar"; }; + + default = ironbar; }); devShells = genSystems (system: From ee1ade0f345aa8ec91b3737c746452111d840530 Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Wed, 17 Apr 2024 22:04:43 +0100 Subject: [PATCH 4/4] build(nix): do not include unused inputs when using feature subset --- nix/default.nix | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/nix/default.nix b/nix/default.nix index a769c02..db1e3b8 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -25,6 +25,8 @@ builderName ? "nix", builder ? {}, }: let + hasFeature = f: features == [ ] || builtins.elem f features; + basePkg = rec { inherit version; @@ -51,30 +53,33 @@ gnome.adwaita-icon-theme hicolor-icon-theme gsettings-desktop-schemas - libxkbcommon - libpulseaudio - openssl - luajit - ]; + libxkbcommon ] + ++ (if hasFeature "http" then [ openssl ] else []) + ++ (if hasFeature "volume" then [ libpulseaudio ] else []) + ++ (if hasFeature "cairo" then [ luajit ] else []); propagatedBuildInputs = [ gtk3 ]; lgi = luajitPackages.lgi; - preFixup = '' - gappsWrapperArgs+=( + gappsWrapperArgs = '' # Thumbnailers - --prefix XDG_DATA_DIRS : "${gdk-pixbuf}/share" - --prefix XDG_DATA_DIRS : "${librsvg}/share" - --prefix XDG_DATA_DIRS : "${webp-pixbuf-loader}/share" - --prefix XDG_DATA_DIRS : "${shared-mime-info}/share" + --prefix XDG_DATA_DIRS : "${gdk-pixbuf}/share" + --prefix XDG_DATA_DIRS : "${librsvg}/share" + --prefix XDG_DATA_DIRS : "${webp-pixbuf-loader}/share" + --prefix XDG_DATA_DIRS : "${shared-mime-info}/share" - # gtk-launch - --suffix PATH : "${lib.makeBinPath [ gtk3 ]}" - - # cairo + # gtk-launch + --suffix PATH : "${lib.makeBinPath [ gtk3 ]}" + '' + + (if hasFeature "cairo" then '' --prefix LUA_PATH : "./?.lua;${lgi}/share/lua/5.1/?.lua;${lgi}/share/lua/5.1/?/init.lua;${luajit}/share/lua/5.1/\?.lua;${luajit}/share/lua/5.1/?/init.lua" --prefix LUA_CPATH : "./?.so;${lgi}/lib/lua/5.1/?.so;${luajit}/lib/lua/5.1/?.so;${luajit}/lib/lua/5.1/loadall.so" + '' else ""); + + preFixup = '' + gappsWrapperArgs+=( + ${gappsWrapperArgs} ) '';