Skip to content

Commit

Permalink
Nix: corrections for overlays, overrideable systems (#2929)
Browse files Browse the repository at this point in the history
* nix: overlays: move waybar-hyprland to own overlay

* flake: use legacyPackages for formatter

Run `nix fmt` for all files.

* flake: move default overlay to nix/overlays.nix

* nix: lib: remove lib

* nix: overlays: extras: explicitly include xdph overlays

* nix: use interpolation for versions

* nix: overlays: include deps with hyprland-packages

* flake: make systems overrideable

* flake: packages: inherit from overlaid pkgsFor
  • Loading branch information
spikespaz committed Aug 12, 2023
1 parent 3f7f420 commit d20837b
Show file tree
Hide file tree
Showing 6 changed files with 143 additions and 107 deletions.
34 changes: 28 additions & 6 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

73 changes: 39 additions & 34 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";

# <https://github.com/nix-systems/nix-systems>
systems.url = "github:nix-systems/default-linux";

wlroots = {
type = "gitlab";
host = "gitlab.freedesktop.org";
Expand All @@ -16,68 +19,70 @@
hyprland-protocols = {
url = "github:hyprwm/hyprland-protocols";
inputs.nixpkgs.follows = "nixpkgs";
inputs.systems.follows = "systems";
};

xdph = {
url = "github:hyprwm/xdg-desktop-portal-hyprland";
inputs.nixpkgs.follows = "nixpkgs";
inputs.systems.follows = "systems";
inputs.hyprland-protocols.follows = "hyprland-protocols";
};
};

outputs = inputs @ {
self,
nixpkgs,
systems,
...
}: let
lib = nixpkgs.lib.extend (import ./nix/lib.nix);
genSystems = lib.genAttrs [
# Add more systems if they are supported
"aarch64-linux"
"x86_64-linux"
];

pkgsFor = genSystems (system:
inherit (nixpkgs) lib;
eachSystem = lib.genAttrs (import systems);
pkgsFor = eachSystem (system:
import nixpkgs {
inherit system;
overlays = [
self.overlays.hyprland-packages
self.overlays.wlroots-hyprland
inputs.hyprland-protocols.overlays.default
localSystem = system;
overlays = with self.overlays; [
hyprland-packages
hyprland-extras
];
});
in {
overlays =
(import ./nix/overlays.nix {inherit self lib inputs;})
// {
default =
lib.mkJoinedOverlays
(with self.overlays; [
hyprland-packages
hyprland-extras
wlroots-hyprland
inputs.hyprland-protocols.overlays.default
]);
};
overlays = import ./nix/overlays.nix {inherit self lib inputs;};

checks = genSystems (system:
checks = eachSystem (system:
(lib.filterAttrs
(n: _: (lib.hasPrefix "hyprland" n) && !(lib.hasSuffix "debug" n))
self.packages.${system})
// {
inherit (self.packages.${system}) xdg-desktop-portal-hyprland;
});

packages = genSystems (system:
(self.overlays.default pkgsFor.${system} pkgsFor.${system})
// {
default = self.packages.${system}.hyprland;
});
packages = eachSystem (system: {
default = self.packages.${system}.hyprland;
inherit
(pkgsFor.${system})
# hyprland-packages
hyprland
hyprland-unwrapped
hyprland-debug
hyprland-hidpi
hyprland-nvidia
hyprland-no-hidpi
# hyprland-extras
xdg-desktop-portal-hyprland
hyprland-share-picker
waybar-hyprland
# dependencies
hyprland-protocols
wlroots-hyprland
udis86
;
});

devShells = genSystems (system: {
devShells = eachSystem (system: {
default = pkgsFor.${system}.mkShell {
name = "hyprland-shell";
nativeBuildInputs = with pkgsFor.${system}; [ cmake python3 ];
nativeBuildInputs = with pkgsFor.${system}; [cmake python3];
buildInputs = [self.packages.${system}.wlroots-hyprland];
inputsFrom = [
self.packages.${system}.wlroots-hyprland
Expand All @@ -86,7 +91,7 @@
};
});

formatter = genSystems (system: pkgsFor.${system}.alejandra);
formatter = eachSystem (system: nixpkgs.legacyPackages.${system}.alejandra);

nixosModules.default = import ./nix/module.nix inputs;
homeManagerModules.default = import ./nix/hm-module.nix self;
Expand Down
2 changes: 1 addition & 1 deletion nix/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ in
ln -s ${wlroots}/include/wlr $dev/include/hyprland/wlroots
${lib.optionalString wrapRuntimeDeps ''
wrapProgram $out/bin/Hyprland \
--suffix PATH : ${lib.makeBinPath [ binutils pciutils ]}
--suffix PATH : ${lib.makeBinPath [binutils pciutils]}
''}
'';

Expand Down
26 changes: 19 additions & 7 deletions nix/hm-module.nix
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,14 @@ in {

config = lib.mkIf cfg.enable {
warnings =
if (cfg.systemdIntegration || cfg.plugins != []) && cfg.extraConfig == null then
[ ''You have enabled hyprland.systemdIntegration or listed plugins in hyprland.plugins.
Your Hyprland config will be linked by home manager.
Set hyprland.extraConfig or unset hyprland.systemdIntegration and hyprland.plugins to remove this warning.'' ]
if (cfg.systemdIntegration || cfg.plugins != []) && cfg.extraConfig == null
then [
''
You have enabled hyprland.systemdIntegration or listed plugins in hyprland.plugins.
Your Hyprland config will be linked by home manager.
Set hyprland.extraConfig or unset hyprland.systemdIntegration and hyprland.plugins to remove this warning.
''
]
else [];

home.packages =
Expand All @@ -138,9 +142,17 @@ in {
exec-once=${pkgs.dbus}/bin/dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY HYPRLAND_INSTANCE_SIGNATURE XDG_CURRENT_DESKTOP && systemctl --user start hyprland-session.target
'')
+ lib.concatStrings (builtins.map (entry: let
plugin = if lib.types.package.check entry then "${entry}/lib/lib${entry.pname}.so" else entry;
in "plugin = ${plugin}\n") cfg.plugins)
+ (if cfg.extraConfig != null then cfg.extraConfig else "");
plugin =
if lib.types.package.check entry
then "${entry}/lib/lib${entry.pname}.so"
else entry;
in "plugin = ${plugin}\n")
cfg.plugins)
+ (
if cfg.extraConfig != null
then cfg.extraConfig
else ""
);

onChange = let
hyprlandPackage =
Expand Down
8 changes: 0 additions & 8 deletions nix/lib.nix

This file was deleted.

107 changes: 56 additions & 51 deletions nix/overlays.nix
Original file line number Diff line number Diff line change
Expand Up @@ -10,70 +10,75 @@
(builtins.substring 4 2 longDate)
(builtins.substring 6 2 longDate)
]);

mkJoinedOverlays = overlays: final: prev:
lib.foldl' (attrs: overlay: attrs // (overlay final prev)) {} overlays;
in {
# Packages for variations of Hyprland, and its dependencies.
hyprland-packages = final: prev: {
hyprland = final.callPackage ./default.nix {
version =
props.version
+ "+date="
+ (mkDate (self.lastModifiedDate or "19700101"))
+ "_"
+ (self.shortRev or "dirty");
wlroots = final.wlroots-hyprland;
commit = self.rev or "";
inherit (final) udis86 hyprland-protocols;
};
# Contains what a user is most likely to care about:
# Hyprland itself, XDPH, the Share Picker, and patched Waybar.
default = mkJoinedOverlays (with self.overlays; [
hyprland-packages
hyprland-extras
]);

hyprland-unwrapped = final.hyprland.override {wrapRuntimeDeps = false;};
hyprland-debug = final.hyprland.override {debug = true;};
hyprland-hidpi = final.hyprland.override {hidpiXWayland = true;};
hyprland-nvidia = final.hyprland.override {nvidiaPatches = true;};
hyprland-no-hidpi =
builtins.trace
"hyprland-no-hidpi was removed. Please use the default package."
final.hyprland;
# Packages for variations of Hyprland, dependencies included.
hyprland-packages = mkJoinedOverlays [
# Dependencies
inputs.hyprland-protocols.overlays.default
self.overlays.wlroots-hyprland
self.overlays.udis86
# Hyprland packages themselves
(final: prev: {
hyprland = final.callPackage ./default.nix {
version = "${props.version}+date=${mkDate (self.lastModifiedDate or "19700101")}_${self.shortRev or "dirty"}";
wlroots = final.wlroots-hyprland;
commit = self.rev or "";
inherit (final) udis86 hyprland-protocols;
};

udis86 = final.callPackage ./udis86.nix {};
};
hyprland-unwrapped = final.hyprland.override {wrapRuntimeDeps = false;};
hyprland-debug = final.hyprland.override {debug = true;};
hyprland-hidpi = final.hyprland.override {hidpiXWayland = true;};
hyprland-nvidia = final.hyprland.override {nvidiaPatches = true;};
hyprland-no-hidpi =
builtins.trace
"hyprland-no-hidpi was removed. Please use the default package."
final.hyprland;
})
];

# Packages for extra software recommended for usage with Hyprland,
# including forked or patched packages for compatibility.
hyprland-extras = lib.mkJoinedOverlays [
# Include any inputs' specific overlays whose attributes should
# be re-exported by the Hyprland flake.
#
inputs.xdph.overlays.default
# Provides:
# - xdg-desktop-portal-hyprland
# - hyprland-share-picker
#
# Attributes for `hyprland-extras` defined by this flake can
# go in the oberlay below.
(final: prev: {
waybar-hyprland = prev.waybar.overrideAttrs (old: {
postPatch = ''
# use hyprctl to switch workspaces
sed -i 's/zext_workspace_handle_v1_activate(workspace_handle_);/const std::string command = "hyprctl dispatch workspace " + name_;\n\tsystem(command.c_str());/g' src/modules/wlr/workspace_manager.cpp
'';
postFixup = ''
wrapProgram $out/bin/waybar \
--suffix PATH : ${lib.makeBinPath [final.hyprland]}
'';
mesonFlags = old.mesonFlags ++ ["-Dexperimental=true"];
});
})
hyprland-extras = mkJoinedOverlays [
inputs.xdph.overlays.xdg-desktop-portal-hyprland
inputs.xdph.overlays.hyprland-share-picker
self.overlays.waybar-hyprland
];

waybar-hyprland = final: prev: {
waybar-hyprland = prev.waybar.overrideAttrs (old: {
postPatch = ''
# use hyprctl to switch workspaces
sed -i 's/zext_workspace_handle_v1_activate(workspace_handle_);/const std::string command = "hyprctl dispatch workspace " + name_;\n\tsystem(command.c_str());/g' src/modules/wlr/workspace_manager.cpp
'';
postFixup = ''
wrapProgram $out/bin/waybar \
--suffix PATH : ${lib.makeBinPath [final.hyprland]}
'';
mesonFlags = old.mesonFlags ++ ["-Dexperimental=true"];
});
};

udis86 = final: prev: {
udis86 = final.callPackage ./udis86.nix {};
};

# Patched version of wlroots for Hyprland.
# It is under a new package name so as to not conflict with
# the standard version in nixpkgs.
wlroots-hyprland = final: prev: {
wlroots-hyprland = final.callPackage ./wlroots.nix {
version =
mkDate (inputs.wlroots.lastModifiedDate or "19700101")
+ "_"
+ (inputs.wlroots.shortRev or "dirty");
version = "${mkDate (inputs.wlroots.lastModifiedDate or "19700101")}_${inputs.wlroots.shortRev or "dirty"}";
src = inputs.wlroots;
libdisplay-info = prev.libdisplay-info.overrideAttrs (old: {
version = "0.1.1+date=2023-03-02";
Expand Down

0 comments on commit d20837b

Please sign in to comment.