{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/release-24.05"; nixos-unstable.url = "github:NixOS/nixpkgs/master"; local-unstable.url = "path:///home/giulio/dev/nixpkgs"; home-manager = { url = "github:nix-community/home-manager/release-24.05"; inputs.nixpkgs.follows = "nixpkgs"; }; nvidia-patch = { url = "github:icewind1991/nvidia-patch-nixos"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, nixos-unstable, local-unstable, home-manager, nvidia-patch }: let sysLinuxX64 = "x86_64-linux"; sysDarwin = "aarch64-darwin"; sysLinuxAarch = "aarch64-linux"; wrapPkgsSystem = { system, cudaSupport ? false }: let config = { inherit cudaSupport; allowUnfree = true; }; in import nixpkgs rec { inherit system config; unstablePkgs = import nixos-unstable { inherit system config; }; localPkgs = import local-unstable { inherit system config; }; overlays = [ (final: prev: { inherit unstablePkgs; }) (final: prev: { inherit localPkgs; }) (nvidia-patch.overlays.default) ]; }; wrapUtils = { pkgs, system }: let inherit (pkgs.lib) makeScope; inherit (pkgs) newScope; in makeScope newScope (self: rec { inherit nixpkgs home-manager nixos-unstable; inherit (self.callPackage ./lib/utils.nix { }) mkSysRole mkHomeRole; inherit (user) mkUser; user = self.callPackage ./lib/user.nix { }; host = self.callPackage ./lib/host.nix { }; }); pkgsLinuxX64Cuda = wrapPkgsSystem { system = sysLinuxX64; }; utilsLinuxX64Cuda = wrapUtils { system = sysLinuxX64; pkgs = pkgsLinuxX64Cuda; }; pkgsLinuxAarch = wrapPkgsSystem { system = sysLinuxAarch; }; utilsLinuxAarch = wrapUtils { system = sysLinuxAarch; pkgs = pkgsLinuxAarch; }; pkgsDarwin = wrapPkgsSystem { system = sysDarwin; }; utilsDarwin = wrapUtils { system = sysDarwin; pkgs = pkgsDarwin; }; in { nixosConfigurations = { architect = utilsLinuxX64Cuda.host.mkHost { name = "architect"; users = [{ user = "giulio"; roles = [ ]; }]; }; }; homeConfigurations = { giulioMac = utilsDarwin.user.mkHMUser { name = "giulio"; roles = [ "ssh" ]; }; giulioAarch = utilsLinuxAarch.user.mkHMUser { name = "giulio"; roles = [ "ssh" ]; }; giulioX64 = utilsLinuxX64Cuda.user.mkHMUser { name = "giulio"; roles = [ "ssh" "go" ]; }; giulioX64NoSSH = utilsLinuxX64Cuda.user.mkHMUser { name = "giulio"; roles = [ "go" ]; }; }; defaultTemplate = self.templates.basicShell; templates = { basicShell = { path = ./templates/basicShell; description = "A barebone shell with custom defined packages"; }; }; }; }