{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/release-24.11"; nixos-unstable.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; nixos-master.url = "github:NixOS/nixpkgs/master"; local-unstable.url = "path:///home/giulio/dev/nixpkgs"; teslamate-flake.url = "github:teslamate-org/teslamate/v1.32.0"; agenix-flake.url = "github:ryantm/agenix"; home-manager = { url = "github:nix-community/home-manager/release-24.11"; inputs.nixpkgs.follows = "nixpkgs"; }; nvidia-patch = { url = "github:icewind1991/nvidia-patch-nixos"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self , nixpkgs , nixos-unstable , nixos-master , local-unstable , home-manager , teslamate-flake , nvidia-patch , agenix-flake }: let sysLinuxX64 = "x86_64-linux"; sysDarwin = "aarch64-darwin"; sysLinuxAarch = "aarch64-linux"; wrapPkgsSystem = { system, cudaSupport ? false }: let config = { inherit cudaSupport; allowUnfree = true; }; cachixOverlay = final: prev: { nixosModules = (prev.nixosModules or { }) // { cachixConfig = import ./cachix.nix; }; }; extOverlays = [ (nvidia-patch.overlays.default) cachixOverlay ]; importNixpkgs = { flake }: import flake { inherit system config; overlays = extOverlays; }; unstablePkgs = importNixpkgs { flake = nixos-unstable; }; masterPkgs = importNixpkgs { flake = nixos-master; }; localPkgs = importNixpkgs { flake = local-unstable; }; teslamatePkgs = importNixpkgs { flake = teslamate-flake; }; agenixPkgs = importNixpkgs { flake = agenix-flake; }; additionalOverlays = [ (final: prev: { inherit unstablePkgs; }) (final: prev: { inherit localPkgs; }) (final: prev: { inherit teslamatePkgs; }) (final: prev: { inherit agenixPkgs; }) (final: prev: { inherit masterPkgs; }) ]; in import nixpkgs { inherit system config; overlays = additionalOverlays ++ extOverlays ++ [ (final: prev: { ctranslate2 = prev.ctranslate2.override { withCUDA = true; withCuDNN = true; }; }) ]; }; wrapUtils = { pkgs }: 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 { pkgs = pkgsLinuxX64Cuda; }; pkgsLinuxAarch = wrapPkgsSystem { system = sysLinuxAarch; }; utilsLinuxAarch = wrapUtils { pkgs = pkgsLinuxAarch; }; pkgsDarwin = wrapPkgsSystem { system = sysDarwin; }; utilsDarwin = wrapUtils { pkgs = pkgsDarwin; }; in { nixosConfigurations = { architect = utilsLinuxX64Cuda.host.mkHost { name = "architect"; users = [{ user = "giulio"; roles = [ ]; }]; imports = [ teslamate-flake.nixosModules.default agenix-flake.nixosModules.default ]; }; }; 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"; }; }; }; }