Compare commits

...

19 commits

Author SHA1 Message Date
7ebfaa1de8 WIP: flake: home-manager: export NixOS homes
All checks were successful
ci/woodpecker/push/check Pipeline was successful
WIP: this does not take into account the `profiles` which *also* setup
home-manager modules...

And here is what the last few commits were building up to.

This is neat, but won't be useful *very* often.
2024-01-03 17:56:53 +00:00
7bd06002de flake: home-manager: refactor 'mkHome'
This will allow making a similar function for NixOS homes.
2024-01-03 17:56:53 +00:00
d6e3f20208 flake: home-manager: use 'hosts' option 2024-01-03 17:55:36 +00:00
437b8b8b17 flake: nixos: use 'hosts' option 2024-01-03 17:55:35 +00:00
9b68905c26 flake: add hosts
This will allow other modules to cross-reference which hosts exist on
which system.

My main use-case is to automatically declare home-manager configuration
for the home configuration of NixOS hosts.

I also include Darwin in case I ever want to use that in the future,
though that is unlikely for the moment.
2024-01-03 17:55:35 +00:00
f5e24b5db8 hosts: nixos: porthos: add profiles 2024-01-03 17:55:35 +00:00
37cfcadfc6 fixup! nixos: home: forward profile configurations 2024-01-03 17:50:47 +00:00
fefd405e08 fixup! nixos: home: import common modules 2024-01-03 17:48:44 +00:00
2d3add3536 nixos: home: forward profile configurations
Now that we migrated them all
2024-01-03 17:48:44 +00:00
198b8e7e0a common: profiles: migrate X 2024-01-03 17:48:44 +00:00
e4b7d562a4 common: profiles: migrate wm 2024-01-03 17:36:19 +00:00
7884ef1047 common: profiles: migrate laptop 2024-01-03 17:29:18 +00:00
6088f85bec common: profiles: migrate gtk 2024-01-03 17:29:18 +00:00
1d888f68e3 common: profiles: migrate devices 2024-01-03 17:29:18 +00:00
42cbe79cae common: profiles: migrate bluetooth 2024-01-03 17:29:18 +00:00
ef55541337 common: add profiles
I will be migrating each sub-module one by one.
2024-01-03 17:28:01 +00:00
8dcbd6e850 flake: nixos: import common modules 2024-01-03 16:54:05 +00:00
e9abcb0307 flake: home-manager: import common modules 2024-01-03 16:54:05 +00:00
c27b83652a nixos: home: import common modules 2024-01-03 16:51:38 +00:00
22 changed files with 243 additions and 145 deletions

View file

@ -13,6 +13,7 @@ flake-parts.lib.mkFlake { inherit inputs; } {
./checks.nix
./dev-shells.nix
./home-manager.nix
./hosts.nix
./lib.nix
./nixos.nix
./overlays.nix

View file

@ -1,5 +1,7 @@
{ self, inputs, lib, ... }:
{ self, config, inputs, lib, ... }:
let
inherit (config) hosts;
defaultModules = [
# Include generic settings
"${self}/modules/home"
@ -14,9 +16,11 @@ let
# Enable home-manager
programs.home-manager.enable = true;
}
# Import common modules
"${self}/modules/common"
];
mkHome = name: system: inputs.home-manager.lib.homeManagerConfiguration {
mkHomeCommon = mainModules: system: inputs.home-manager.lib.homeManagerConfiguration {
# Work-around for home-manager
# * not letting me set `lib` as an extraSpecialArgs
# * not respecting `nixpkgs.overlays` [1]
@ -29,34 +33,51 @@ let
];
};
modules = defaultModules ++ [
"${self}/hosts/homes/${name}"
];
modules = defaultModules ++ mainModules;
extraSpecialArgs = {
# Inject inputs to use them in global registry
inherit inputs;
# For consumption by common modules
type = "home";
};
};
homes = {
mkHome = name: mkHomeCommon [ "${self}/hosts/homes/${name}" ];
mkNixosHome = name: mkHomeCommon [
"${self}/hosts/nixos/${name}/home.nix"
"${self}/hosts/nixos/${name}/profiles.nix"
];
in
{
hosts.homes = {
"ambroisie@bazin" = "x86_64-linux";
"ambroisie@mousqueton" = "x86_64-linux";
};
in
{
perSystem = { system, ... }: {
# Work-around for https://github.com/nix-community/home-manager/issues/3075
legacyPackages = {
homeConfigurations =
let
filteredHomes = lib.filterAttrs (_: v: v == system) homes;
filteredHomes = lib.filterAttrs (_: v: v == system) hosts.homes;
allHomes = filteredHomes // {
# Default configuration
ambroisie = system;
};
homeManagerHomes = lib.mapAttrs mkHome allHomes;
filteredNixosHosts = lib.filterAttrs (_: v: v == system) hosts.nixos;
nixosHomes' = lib.mapAttrs mkNixosHome filteredNixosHosts;
nixosHomeUsername = (host: self.nixosConfigurations.${host}.config.my.user.name);
nixosHomes = lib.mapAttrs' (host: lib.nameValuePair "${nixosHomeUsername host}@${host}") nixosHomes';
in
lib.mapAttrs mkHome allHomes;
lib.foldl' lib.mergeAttrs { }
[
homeManagerHomes
nixosHomes
];
};
};
}

21
flake/hosts.nix Normal file
View file

@ -0,0 +1,21 @@
# Define `hosts.{darwin,home,nixos}` options for consumption in other modules
{ lib, ... }:
let
mkHostsOption = description: lib.mkOption {
inherit description;
type = with lib.types; attrsOf str;
default = { };
example = { name = "x86_64-linux"; };
};
in
{
options = {
hosts = {
darwin = mkHostsOption "Darwin hosts";
homes = mkHostsOption "Home Manager hosts";
nixos = mkHostsOption "NixOS hosts";
};
};
}

View file

@ -1,4 +1,4 @@
{ self, inputs, lib, ... }:
{ self, config, inputs, lib, ... }:
let
defaultModules = [
{
@ -12,6 +12,8 @@ let
}
# Include generic settings
"${self}/modules/nixos"
# Import common modules
"${self}/modules/common"
];
buildHost = name: system: lib.nixosSystem {
@ -24,12 +26,18 @@ let
inherit (self) lib;
# Inject inputs to use them in global registry
inherit inputs;
# For consumption by common modules
type = "nixos";
};
};
in
{
flake.nixosConfigurations = lib.mapAttrs buildHost {
aramis = "x86_64-linux";
porthos = "x86_64-linux";
config = {
hosts.nixos = {
aramis = "x86_64-linux";
porthos = "x86_64-linux";
};
flake.nixosConfigurations = lib.mapAttrs buildHost config.hosts.nixos;
};
}

View file

@ -7,6 +7,7 @@
./hardware.nix
./home.nix
./networking.nix
./profiles.nix
./secrets
./services.nix
./system.nix

View file

@ -0,0 +1,4 @@
{ ... }:
{
# Nothing
}

View file

@ -3,14 +3,18 @@
{ lib, type ? null, ... }:
let
allowedTypes = [
"nixos"
"home"
"darwin"
"home"
"nixos"
];
allowedTypesString = lib.concatStringSep ", " (builtins.map lib.escapeNixString allowedTypes);
in
{
imports = [
./profiles
];
config = {
assertions = [
{

View file

@ -0,0 +1,19 @@
{ config, lib, type, ... }:
let
cfg = config.my.profiles.bluetooth;
in
{
options.my.profiles.bluetooth = with lib; {
enable = mkEnableOption "bluetooth profile";
};
config = lib.mkIf cfg.enable (lib.mkMerge [
(lib.optionalAttrs (type == "home") {
my.home.bluetooth.enable = true;
})
(lib.optionalAttrs (type == "nixos") {
my.hardware.bluetooth.enable = true;
})
]);
}

View file

@ -0,0 +1,22 @@
{ config, lib, type, ... }:
let
cfg = config.my.profiles.devices;
in
{
options.my.profiles.devices = with lib; {
enable = mkEnableOption "devices profile";
};
config = lib.mkIf cfg.enable (lib.mkMerge [
(lib.optionalAttrs (type == "nixos") {
my.hardware = {
ergodox.enable = true;
mx-ergo.enable = true;
};
# MTP devices auto-mount via file explorers
services.gvfs.enable = true;
})
]);
}

View file

@ -0,0 +1,21 @@
{ config, lib, type, ... }:
let
cfg = config.my.profiles.gtk;
in
{
options.my.profiles.gtk = with lib; {
enable = mkEnableOption "gtk profile";
};
config = lib.mkIf cfg.enable (lib.mkMerge [
(lib.optionalAttrs (type == "home") {
# GTK theme configuration
my.home.gtk.enable = true;
})
(lib.optionalAttrs (type == "nixos") {
# Allow setting GTK configuration using home-manager
programs.dconf.enable = true;
})
]);
}

View file

@ -0,0 +1,27 @@
{ config, lib, type, ... }:
let
cfg = config.my.profiles.laptop;
in
{
options.my.profiles.laptop = with lib; {
enable = mkEnableOption "laptop profile";
};
config = lib.mkIf cfg.enable (lib.mkMerge [
(lib.optionalAttrs (type == "home") {
# Enable battery notifications
my.home.power-alert.enable = true;
})
(lib.optionalAttrs (type == "nixos") {
# Enable touchpad support
services.xserver.libinput.enable = true;
# Enable TLP power management
my.services.tlp.enable = true;
# Enable upower power management
my.hardware.upower.enable = true;
})
]);
}

View file

@ -0,0 +1,36 @@
{ config, lib, type, ... }:
let
cfg = config.my.profiles.wm;
applyWm = wm: configs: lib.mkIf (cfg.windowManager == wm) (lib.my.merge configs);
in
{
options.my.profiles.wm = with lib; {
windowManager = mkOption {
type = with types; nullOr (enum [ "i3" ]);
default = null;
example = "i3";
description = "Which window manager to use";
};
};
config = lib.mkMerge [
(applyWm "i3" [
(lib.optionalAttrs (type == "home") {
# i3 settings
my.home.wm.windowManager = "i3";
# Screenshot tool
my.home.flameshot.enable = true;
# Auto disk mounter
my.home.udiskie.enable = true;
})
(lib.optionalAttrs (type == "nixos") {
# Enable i3
services.xserver.windowManager.i3.enable = true;
# udiskie fails if it can't find this dbus service
services.udisks2.enable = true;
})
])
];
}

View file

@ -0,0 +1,27 @@
{ config, lib, pkgs, type, ... }:
let
cfg = config.my.profiles.x;
in
{
options.my.profiles.x = with lib; {
enable = mkEnableOption "X profile";
};
config = lib.mkIf cfg.enable (lib.mkMerge [
(lib.optionalAttrs (type == "home") {
# X configuration
my.home.x.enable = true;
})
(lib.optionalAttrs (type == "nixos") {
# Enable the X11 windowing system.
services.xserver.enable = true;
# Nice wallpaper
services.xserver.displayManager.lightdm.background =
let
wallpapers = "${pkgs.plasma5Packages.plasma-workspace-wallpapers}/share/wallpapers";
in
"${wallpapers}/summer_1am/contents/images/2560x1600.jpg";
})
]);
}

View file

@ -5,7 +5,6 @@
imports = [
./hardware
./home
./profiles
./programs
./secrets
./services

View file

@ -14,7 +14,19 @@ in
config = lib.mkIf cfg.enable {
home-manager = {
# Not a fan of out-of-directory imports, but this is a good exception
users.${config.my.user.name} = import "${inputs.self}/modules/home";
users.${config.my.user.name} = {
imports = [
"${inputs.self}/modules/common"
"${inputs.self}/modules/home"
];
config = {
my = {
# Transparently enable home-manager profiles as well
inherit (config.my) profiles;
};
};
};
# Nix Flakes compatibility
useGlobalPkgs = true;
@ -23,6 +35,8 @@ in
# Forward inputs to home-manager configuration
extraSpecialArgs = {
inherit inputs;
# For consumption by common modules
type = "home";
};
};
};

View file

@ -1,15 +0,0 @@
{ config, lib, ... }:
let
cfg = config.my.profiles.bluetooth;
in
{
options.my.profiles.bluetooth = with lib; {
enable = mkEnableOption "bluetooth profile";
};
config = lib.mkIf cfg.enable {
my.hardware.bluetooth.enable = true;
my.home.bluetooth.enable = true;
};
}

View file

@ -1,20 +0,0 @@
{ config, lib, ... }:
let
cfg = config.my.profiles.devices;
in
{
options.my.profiles.devices = with lib; {
enable = mkEnableOption "devices profile";
};
config = lib.mkIf cfg.enable {
my.hardware = {
ergodox.enable = true;
mx-ergo.enable = true;
};
# MTP devices auto-mount via file explorers
services.gvfs.enable = true;
};
}

View file

@ -1,17 +0,0 @@
{ config, lib, ... }:
let
cfg = config.my.profiles.gtk;
in
{
options.my.profiles.gtk = with lib; {
enable = mkEnableOption "gtk profile";
};
config = lib.mkIf cfg.enable {
# Allow setting GTK configuration using home-manager
programs.dconf.enable = true;
# GTK theme configuration
my.home.gtk.enable = true;
};
}

View file

@ -1,23 +0,0 @@
{ config, lib, ... }:
let
cfg = config.my.profiles.laptop;
in
{
options.my.profiles.laptop = with lib; {
enable = mkEnableOption "laptop profile";
};
config = lib.mkIf cfg.enable {
# Enable touchpad support
services.xserver.libinput.enable = true;
# Enable TLP power management
my.services.tlp.enable = true;
# Enable upower power management
my.hardware.upower.enable = true;
# Enable battery notifications
my.home.power-alert.enable = true;
};
}

View file

@ -1,29 +0,0 @@
{ config, lib, ... }:
let
cfg = config.my.profiles.wm;
in
{
options.my.profiles.wm = with lib; {
windowManager = mkOption {
type = with types; nullOr (enum [ "i3" ]);
default = null;
example = "i3";
description = "Which window manager to use";
};
};
config = lib.mkMerge [
(lib.mkIf (cfg.windowManager == "i3") {
# Enable i3
services.xserver.windowManager.i3.enable = true;
# i3 settings
my.home.wm.windowManager = "i3";
# Screenshot tool
my.home.flameshot.enable = true;
# Auto disk mounter
my.home.udiskie.enable = true;
# udiskie fails if it can't find this dbus service
services.udisks2.enable = true;
})
];
}

View file

@ -1,23 +0,0 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.profiles.x;
in
{
options.my.profiles.x = with lib; {
enable = mkEnableOption "X profile";
};
config = lib.mkIf cfg.enable {
# Enable the X11 windowing system.
services.xserver.enable = true;
# Nice wallpaper
services.xserver.displayManager.lightdm.background =
let
wallpapers = "${pkgs.plasma5Packages.plasma-workspace-wallpapers}/share/wallpapers";
in
"${wallpapers}/summer_1am/contents/images/2560x1600.jpg";
# X configuration
my.home.x.enable = true;
};
}