diff --git a/darwin/darwin.nix b/darwin/darwin.nix new file mode 100644 index 0000000..dcd784c --- /dev/null +++ b/darwin/darwin.nix @@ -0,0 +1,37 @@ +{ pkgs, system, ... }: { + # List packages installed in system profile. To search by name, run: + # $ nix-env -qaP | grep wget + environment.systemPackages = [ + pkgs.vim + ]; + + # Auto upgrade nix package and the daemon service. + services.nix-daemon.enable = true; + nix.package = pkgs.nix; + + # Necessary for using flakes on this system. + nix.settings.experimental-features = "nix-command flakes"; + + # Create /etc/zshrc that loads the nix-darwin environment. + programs.zsh.enable = true; + + # Used for backwards compatibility, please read the changelog before changing. + # $ darwin-rebuild changelog + system.stateVersion = 4; + + nixpkgs = { + # TODO(spotlightishere): Make this configurable beyond a singular device. + hostPlatform = "aarch64-darwin"; + + # Custom packages. + # TODO(spotlightishere): Why does this need to be specified in both home-manager and globally? + overlays = [ (import ../pkgs/default.nix) ]; + }; + + # Our singular user! + users.users.spot = { + description = "Spotlight Deveaux"; + home = "/Users/spot"; + shell = pkgs.zsh; + }; +} diff --git a/flake.lock b/flake.lock index 310bf3e..673afec 100644 --- a/flake.lock +++ b/flake.lock @@ -65,6 +65,26 @@ "type": "github" } }, + "nix-darwin": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1711763326, + "narHash": "sha256-sXcesZWKXFlEQ8oyGHnfk4xc9f2Ip0X/+YZOq3sKviI=", + "owner": "LnL7", + "repo": "nix-darwin", + "rev": "36524adc31566655f2f4d55ad6b875fb5c1a4083", + "type": "github" + }, + "original": { + "owner": "LnL7", + "repo": "nix-darwin", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1712608508, @@ -87,6 +107,7 @@ "darwin-systems": "darwin-systems", "home-manager": "home-manager", "linux-systems": "linux-systems", + "nix-darwin": "nix-darwin", "nixpkgs": "nixpkgs" } } diff --git a/flake.nix b/flake.nix index 90b1273..4e99d65 100644 --- a/flake.nix +++ b/flake.nix @@ -12,17 +12,21 @@ url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; + nix-darwin = { + url = "github:LnL7/nix-darwin"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; - outputs = { nixpkgs, home-manager, linux-systems, darwin-systems, all-systems, ... }: + outputs = inputs@{ nixpkgs, home-manager, nix-darwin, ... }: let # TODO(spotlightishere): Is there a better way to approach this that doesn't # involve importing so many separate flakes? # # (We could manually merge Darwin and Linux themselves, but this is primarily for readability.) - allSystems = nixpkgs.lib.genAttrs (import all-systems); - darwinSystems = nixpkgs.lib.genAttrs (import darwin-systems); - linuxSystems = nixpkgs.lib.genAttrs (import linux-systems); + allSystems = nixpkgs.lib.genAttrs (import inputs.all-systems); + darwinSystems = nixpkgs.lib.genAttrs (import inputs.darwin-systems); + linuxSystems = nixpkgs.lib.genAttrs (import inputs.linux-systems); homeManager = { system, specialArgs ? { } }: home-manager.lib.homeManagerConfiguration { @@ -49,10 +53,6 @@ # For now, this is effectively true, sans a few specific configurations :) spotlight = homeManager { system = system; - specialArgs = { - desktop = false; - gpg = false; - }; }; # For a special case: with the Steam Deck, we have to assume the user @@ -88,12 +88,29 @@ # (Again, we assume a default name of `spotlight` under Linux.) nixosModules.default = { imports = [ - home-manager.nixosModules.home-manager { + home-manager.nixosModules.home-manager + { home-manager = { useGlobalPkgs = true; useUserPackages = true; users.spotlight = import ./home/home.nix; - extraSpecialArgs = { desktop = false; gpg = false; }; + }; + } + ]; + }; + + # We define a default Darwin configuration via nix-darwin. + darwinConfigurations."spotlights-macbook-air" = nix-darwin.lib.darwinSystem { + modules = [ + # System-wide configuration + ./darwin/darwin.nix + # Our provided home-manager configuration + home-manager.darwinModules.home-manager { + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + users.spot = import ./home/home.nix; + extraSpecialArgs = { desktop = true; gpg = true; }; }; } ];