diff --git a/doc/concepts/extern.md b/doc/concepts/extern.md index 3b26912..45d8dcb 100644 --- a/doc/concepts/extern.md +++ b/doc/concepts/extern.md @@ -1,45 +1,42 @@ # External Art When you need to use a module, overlay, or pass a value from one of your inputs -to the rest of your NixOS configuration, [extern][extern] is where you do it. +to the rest of your NixOS configuration, you can make use of a couple arguments. +It is encouraged to add external art directly in your `flake.nix` so the file +represents a complete dependency overview of your flake. -Modules and overlays are self explanatory, and the `specialArgs` attribute is -used to extend the arguments passed to all NixOS modules, allowing for -arbitrary values to be passed from flake inputs to the rest of your -configuration. +## Overlays +External overlays can directly be added to a channel's `overlays` list. -## Home Manager -There is also an `hmModules` attribute set for pulling home-manager modules in -from the outside world: - -### Declare: flake.nix: ```nix { - inputs.doom-emacs.url = "github:vlaci/nix-doom-emacs"; + channels.nixos.overlays = [ inputs.agenix.overlay ]; } ``` +Upon exporting overlays, these overlays will be automatically filtered out by inspecting the `inputs` argument. -extern/default.nix: +## Modules +There is a dedicated `nixos.hostDefaults.externalModules` argument for external +modules. + +flake.nix: ```nix -with inputs; { - hmModules = { - doom-emacs = doom-emacs.hmModule; - }; + nixos.hostDefaults.externalModules = [ inputs.agenix.nixosModules.age ]; } ``` -### Use: -users/nixos/default.nix: +## Home Manager +Since there isn't a `hosts` concept for home-manager, externalModules is just a +top-level argument in the `home` namespace. + +flake.nix: ```nix -{ hmModules, ... }: { - home-manager.users.nixos = { - imports = [ hmModules.doom-emacs ] ; - - programs.doom-emacs.enable = true; - }; + home.externalModules = [ doom-emacs = doom-emacs.hmModule ]; } ``` -[extern]: https://github.com/divnix/devos/tree/core/extern/default.nix +> ##### Note: +> To avoid declaring "external" modules separately, which is obvious since they come from `inputs`, the optimal solution would be to automatically export modules that were created in +> your flake. But this is not possible due to NixOS/nix#4740. diff --git a/doc/concepts/hosts.md b/doc/concepts/hosts.md index 0a74dd1..1fa9028 100644 --- a/doc/concepts/hosts.md +++ b/doc/concepts/hosts.md @@ -15,6 +15,11 @@ attribute to the name of the file minus the _.nix_ extension. This is for convenience, since `nixos-rebuild` automatically searches for a configuration matching the current systems hostname if one is not specified explicitly. +You can set channels, systems, and add extra modules to each host by editing the +`nixos.hosts` argument in flake.nix. This is the perfect place to import +host specific modules from external sources, such as the +[nixos-hardware][nixos-hardware] repository. + It is recommended that the host modules only contain configuration information specific to a particular piece of hardware. Anything reusable across machines is best saved for [profile modules](./profiles.md). @@ -22,20 +27,29 @@ is best saved for [profile modules](./profiles.md). This is a good place to import sets of profiles, called [suites](./suites.md), that you intend to use on your machine. -Additionally, this is the perfect place to import anything you might need from -the [nixos-hardware][nixos-hardware] repository. - -> ##### _Note:_ -> Set `nixpkgs.system` to the architecture of this host, default is "x86_64-linux". -> Keep in mind that not all packages are available for all architectures. ## Example +flake.nix: +```nix +{ + nixos.hosts = mkMerge [ + (devos.lib.importHosts ./hosts) + { + librem = { + channelName = "latest"; + modules = [ hardware.purism-librem-13v3 ]; + }; + } + ]; +} +``` + hosts/librem.nix: ```nix -{ suites, hardware, ... }: +{ suites, ... }: { - imports = suites.laptop ++ [ hardware.purism-librem-13v3 ]; + imports = suites.laptop; boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; diff --git a/doc/concepts/overrides.md b/doc/concepts/overrides.md index 28194cd..303108c 100644 --- a/doc/concepts/overrides.md +++ b/doc/concepts/overrides.md @@ -1,47 +1,41 @@ # Overrides -By default, the NixOS systems are based on unstable. While it is trivial to -change this to a stable release, or any other branch of nixpkgs by -changing the flake url, sometimes all we want is a single package from another -branch. +Each NixOS host follows one channel. But many times it is useful to get packages +or modules from different channels. -This is what the overrides are for. By default, they are pulled directly from -nixpkgs/master, but you can change the `override` flake input url to -nixos-unstable, or even a specific sha revision. +## Packages +You can make use of `overlays/overrides.nix` to override specific packages in the +default channel to be pulled from other channels. That file is simply an example +of how any overlay can get `channels` as their first argument. -They are defined in the `extern/overrides.nix` file. +You can add overlays to any channel to override packages from other channels. -## Example - -### Packages -The override packages are defined as a regular overlay with an extra arguement -`pkgs`. This refers to the packages built from the `override` flake. - -Pulling the manix package from the override flake: +Pulling the manix package from the `latest` channel: ```nix -{ - packages = pkgs: final: prev: { - inherit (pkgs) manix; - }; +channels: final: prev: { + __dontExport = true; + inherit (pkgs.latest) manix; } ``` -### Modules +It is recommended to set the `__dontExport` property for override specific +overlays. `overlays/overrides.nix` is the best place to consolidate all package +overrides and the property is already set for you. -You can also pull modules from override. Simply specify their path relative to -the nixpkgs [modules][nixpkgs-modules] directory. The old version will be added -to `disabledModules` and the new version imported into the configuration. +## Modules -Pulling the zsh module from the override flake: +You can also pull modules from other channels. All modules have access to the +`modulesPath` for each channel as `ModulesPath`. And you can use +`disabledModules` to remove modules from the current channel. + +Pulling the zsh module from the `latest` channel: ```nix -{ - modules = [ "programs/zsh/zsh.nix" ]; +{ latestModulesPath }: { + modules = [ "${latestModulesPath}/programs/zsh/zsh.nix" ]; + disabledModules = [ "programs/zsh/zsh.nix" ]; } ``` > ##### _Note:_ -> Sometimes a modules name will change from one branch to another. This is what -> the `disabledModules` list is for. If the module name changes, the old -> version will not automatically be disabled, so simply put it's old name in -> this list to disable it. +> Sometimes a modules name will change from one branch to another. [nixpkgs-modules]: https://github.com/NixOS/nixpkgs/tree/master/nixos/modules diff --git a/doc/concepts/suites.md b/doc/concepts/suites.md index e6a8bff..5c0d590 100644 --- a/doc/concepts/suites.md +++ b/doc/concepts/suites.md @@ -6,7 +6,13 @@ profiles. For good examples, check out the suites defined in the community In the future, we will use suites as a mechanism for deploying various machine types which don't depend on hardware, such as vm's and containers. -They are defined in `profiles/suites.nix`. +They are defined with the `suites` argument in either `home` or `nixos` namespace. +Suites should be passed as a function that take profiles as an argument. + +The profiles are passed based on the folder names and list passed to the relevant +`profiles` argument. In the template's flake.nix `profiles` is set as +`[ ./profiles ./users ]` and that corresponds to the `{ profiles, users }` argument +pattern. ## Definition ```nix diff --git a/doc/lib.md b/doc/lib.md index ed19b1a..ee402eb 100644 --- a/doc/lib.md +++ b/doc/lib.md @@ -3,8 +3,7 @@ The lib directory mirrors the upstream concepts of [`nixpkgs:./lib`][nixpkgs-lib [`nixpkgs:./nixos/lib`][nixpkgs-nixos-lib] and [`nixpkgs:./pkgs/pkgs-lib`][nixpkgs-pkgs-lib], but also occasionally [`nixpkgs:./pkgs/build-support`][nixpkgs-pkgs-build-support]. -It comes with functions necesary to declutter `devos` itself, but you are -welcome to extend it to your needs. +All functions defined in lib can be accessed in modules and packages as `ourlib`. For example: diff --git a/doc/mkFlakeOptions.md b/doc/mkFlakeOptions.md new file mode 100644 index 0000000..90719ba --- /dev/null +++ b/doc/mkFlakeOptions.md @@ -0,0 +1,407 @@ +## channels +nixpkgs channels to create + + +*_Type_*: +attribute set of submodules + + +*_Default_* +``` +{} +``` + + + + +## channels.\.config +nixpkgs config for this channel + + +*_Type_*: +attribute set or path convertible to it + + +*_Default_* +``` +{} +``` + + + + +## channels.\.input +nixpkgs flake input to use for this channel + + +*_Type_*: +nix flake + + +*_Default_* +``` +"inputs." +``` + + + + +## channels.\.overlays +overlays to apply to this channel +these will get exported under the 'overlays' flake output +as \/\ and any overlay pulled from ${inputs} +will be filtered out + + +*_Type_*: +list of valid Nixpkgs overlay or path convertible to its or anything convertible to it + + +*_Default_* +``` +[] +``` + + + + +## channelsConfig +nixpkgs config for all channels + + +*_Type_*: +attribute set or path convertible to it + + +*_Default_* +``` +{} +``` + + + + +## home +hosts, modules, suites, and profiles for home-manager + + +*_Type_*: +submodule + + +*_Default_* +``` +{} +``` + + + + +## home.externalModules +modules to include that won't be exported +meant importing modules from external flakes + + +*_Type_*: +list of valid module or path convertible to its + + +*_Default_* +``` +[] +``` + + + + +## home.modules +modules to include in all hosts and export to homeModules output + + +*_Type_*: +list of path to a modules or anything convertible to it or path convertible to it + + +*_Default_* +``` +[] +``` + + + + +## home.profiles +profile folders that can be collected into suites +the name of the argument passed to suites is based +on the folder name. +[ ./profiles ] => { profiles }: + + +*_Type_*: +list of paths + + +*_Default_* +``` +[] +``` + + + + +## home.suites +Function that takes profiles and returns suites for this config system +These can be accessed through the 'suites' special argument. + + +*_Type_*: +function that evaluates to a(n) attrs or path convertible to it + + +*_Default_* +``` +"" +``` + + + + +## inputs +inputs for this flake +used to set channel defaults and create registry + + +*_Type_*: +attribute set of nix flakes + + + + + + +## nixos +hosts, modules, suites, and profiles for nixos + + +*_Type_*: +submodule + + +*_Default_* +``` +{} +``` + + + + +## nixos.hostDefaults +Defaults for all hosts. +the modules passed under hostDefaults will be exported +to the 'nixosModules' flake output. +They will also be added to all hosts. + + +*_Type_*: +submodule + + +*_Default_* +``` +{} +``` + + + + +## nixos.hostDefaults.channelName +Channel this host should follow + + +*_Type_*: +a channel defined in `channels` + + +*_Default_* +``` +null +``` + + + + +## nixos.hostDefaults.externalModules +modules to include that won't be exported +meant importing modules from external flakes + + +*_Type_*: +list of valid module or path convertible to its + + +*_Default_* +``` +[] +``` + + + + +## nixos.hostDefaults.modules +modules to include in all hosts and export to nixosModules output + + +*_Type_*: +list of path to a modules or anything convertible to it or path convertible to it + + +*_Default_* +``` +[] +``` + + + + +## nixos.hostDefaults.system +system for this host + + +*_Type_*: +system defined in `supportedSystems` + + +*_Default_* +``` +null +``` + + + + +## nixos.hosts +configurations to include in the nixosConfigurations output + + +*_Type_*: +attribute set of submodules + + +*_Default_* +``` +{} +``` + + + + +## nixos.hosts.\.channelName +Channel this host should follow + + +*_Type_*: +a channel defined in `channels` + + +*_Default_* +``` +null +``` + + + + +## nixos.hosts.\.modules +modules to include + + +*_Type_*: +list of valid module or path convertible to its or anything convertible to it + + +*_Default_* +``` +[] +``` + + + + +## nixos.hosts.\.system +system for this host + + +*_Type_*: +system defined in `supportedSystems` + + +*_Default_* +``` +null +``` + + + + +## nixos.profiles +profile folders that can be collected into suites +the name of the argument passed to suites is based +on the folder name. +[ ./profiles ] => { profiles }: + + +*_Type_*: +list of paths + + +*_Default_* +``` +[] +``` + + + + +## nixos.suites +Function that takes profiles and returns suites for this config system +These can be accessed through the 'suites' special argument. + + +*_Type_*: +function that evaluates to a(n) attrs or path convertible to it + + +*_Default_* +``` +"" +``` + + + + +## self +The flake to create the devos outputs for + +*_Type_*: +nix flake + + + + + + +## supportedSystems +The systems supported by this flake + + +*_Type_*: +list of strings + + +*_Default_* +``` +["aarch64-linux","i686-linux","x86_64-darwin","x86_64-linux"] +``` + + + diff --git a/doc/outputs/overlays.md b/doc/outputs/overlays.md index d71b459..f463d1a 100644 --- a/doc/outputs/overlays.md +++ b/doc/outputs/overlays.md @@ -4,7 +4,7 @@ we want to keep the process as simple and straightforward as possible. Any _.nix_ files declared in this directory will be assumed to be a valid overlay, and will be automatically imported into all [hosts](../concepts/hosts.md), and -exported via `overlays.` _as well as_ +exported via `overlays./` _as well as_ `packages..` (for valid systems), so all you have to do is write it. diff --git a/doc/start/from-nixos.md b/doc/start/from-nixos.md index 3e9a28e..0e1d48c 100644 --- a/doc/start/from-nixos.md +++ b/doc/start/from-nixos.md @@ -10,10 +10,18 @@ flk up This will make a new file `hosts/up-$(hostname).nix`, which you can edit to your liking. +You must then add a host to `nixos.hosts` in flake.nix: +```nix +{ + nixos.hosts = { + modules = hosts/NixOS.nix; + }; +} +``` + Make sure your `i18n.defaultLocale` and `time.timeZone` are set properly for -your region. Keep in mind that `networking.hostName` with be automatically -set to the filename of your hosts file, so `hosts/my-host.nix` will have the -hostname `my-host`. +your region. Keep in mind that `networking.hostName` will be automatically +set to the name of your host; Now might be a good time to read the docs on [suites](../concepts/suites.md) and [profiles](../concepts/profiles.md) and add or create any that you need. @@ -44,4 +52,3 @@ This calls `nixos-rebuild` with sudo to build and install your configuration. > simply `sudo nixos-rebuild switch` from anywhere on the system, but it is > not required. - diff --git a/doc/tests.md b/doc/tests.md index 033d75a..f6fd7fe 100644 --- a/doc/tests.md +++ b/doc/tests.md @@ -7,7 +7,7 @@ configuration, and, optionally, run them in ## Lib Tests You can easily write tests for your own library functions in the -___tests/lib.nix___ file and they will be run on every `nix flake check` or +lib/___tests/lib.nix___ file and they will be run on every `nix flake check` or during a CI run. ## Unit Tests diff --git a/extern/default.nix b/extern/default.nix deleted file mode 100644 index 4ca9df6..0000000 --- a/extern/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ inputs }: with inputs; -{ - modules = [ - home.nixosModules.home-manager - ci-agent.nixosModules.agent-profile - ]; - - overlays = [ - nur.overlay - devshell.overlay - (final: prev: { - deploy-rs = deploy.packages.${prev.system}.deploy-rs; - }) - pkgs.overlay - ]; - - # passed to all nixos modules - specialArgs = { - overrideModulesPath = "${override}/nixos/modules"; - hardware = nixos-hardware.nixosModules; - }; - - # added to home-manager - userModules = [ - ]; - - # passed to all home-manager modules - userSpecialArgs = { }; -} diff --git a/extern/overrides.nix b/extern/overrides.nix deleted file mode 100644 index 78e6ee8..0000000 --- a/extern/overrides.nix +++ /dev/null @@ -1,33 +0,0 @@ -# override defaults to nixpkgs/master -{ - # modules to pull from override, stable version is automatically disabled - modules = [ ]; - - # if a modules name changed in override, add the old name here - disabledModules = [ ]; - - # packages pulled from override - packages = pkgs: final: prev: { - inherit (pkgs) - cachix - dhall - discord - element-desktop - manix - nixpkgs-fmt - qutebrowser - signal-desktop - starship; - - haskellPackages = prev.haskellPackages.override { - overrides = hfinal: hprev: - let version = prev.lib.replaceChars [ "." ] [ "" ] prev.ghc.version; - in - { - # same for haskell packages, matching ghc versions - inherit (pkgs.haskell.packages."ghc${version}") - haskell-language-server; - }; - }; - }; -} diff --git a/flake.lock b/flake.lock index a20aca5..2195b9a 100644 --- a/flake.lock +++ b/flake.lock @@ -2,9 +2,7 @@ "nodes": { "ci-agent": { "inputs": { - "flake-compat": [ - "flake-compat" - ], + "flake-compat": "flake-compat", "nix-darwin": [ "darwin" ], @@ -12,16 +10,16 @@ "nixos" ], "nixos-unstable": [ - "override" + "latest" ], "pre-commit-hooks-nix": "pre-commit-hooks-nix" }, "locked": { - "lastModified": 1615131736, - "narHash": "sha256-z4Er9Cj3WpBDO/saLxqb7IypEvVP0/1AnO6rY5NB03Y=", + "lastModified": 1619088868, + "narHash": "sha256-l9db+HpNIkY41MonGE8z4pbkjBa5BdzJTG5AxV7V7Lw=", "owner": "hercules-ci", "repo": "hercules-ci-agent", - "rev": "a1513a51e8efb96e990a562e6e724e17f2789978", + "rev": "08f953a263518a3af0ca28cd887020ff3465bdf5", "type": "github" }, "original": { @@ -33,7 +31,7 @@ "darwin": { "inputs": { "nixpkgs": [ - "override" + "latest" ] }, "locked": { @@ -52,25 +50,17 @@ }, "deploy": { "inputs": { - "flake-compat": [ - "flake-compat" - ], - "naersk": [ - "naersk" - ], - "nixpkgs": [ - "override" - ], - "utils": [ - "utils" - ] + "flake-compat": "flake-compat_2", + "naersk": "naersk", + "nixpkgs": "nixpkgs", + "utils": "utils" }, "locked": { - "lastModified": 1614654775, - "narHash": "sha256-3mLxoxIXSWUuKE8YgIuqM5AZzXFd1aWxkTlplEDeXIA=", + "lastModified": 1616406726, + "narHash": "sha256-n9zmgxR03QNrvs9/fHewqE0j3SjL7Y+cglBCFu3U3rg=", "owner": "serokell", "repo": "deploy-rs", - "rev": "6278b9bef5ad624676a565980417cbbef42d5227", + "rev": "9e405fbc5ab5bacbd271fd78c6b6b6877c4d9f8d", "type": "github" }, "original": { @@ -81,11 +71,11 @@ }, "devshell": { "locked": { - "lastModified": 1613641255, - "narHash": "sha256-iSvjFK4WYAKhuXCCtkY7uy/cFQTzS3D3Ml5WZqjEfL0=", + "lastModified": 1618523768, + "narHash": "sha256-Gev9da35pHUey3kGz/zrJFc/9ICs++vPCho7qB1mqd8=", "owner": "numtide", "repo": "devshell", - "rev": "ff6cffba08600f5b7b43f398fcb58bef023bc4c4", + "rev": "709fe4d04a9101c9d224ad83f73416dce71baf21", "type": "github" }, "original": { @@ -94,20 +84,72 @@ "type": "github" } }, - "flake-compat": { - "flake": false, + "digga": { + "inputs": { + "deploy": "deploy", + "devshell": "devshell", + "nixlib": "nixlib", + "nixpkgs": "nixpkgs_2", + "utils": "utils_2" + }, "locked": { - "lastModified": 1611461076, - "narHash": "sha256-ad++dTtMNeitUIKi1c66aTrVJOSf+mdZTrGrXzjDr6Q=", - "owner": "BBBSnowball", - "repo": "flake-compat", - "rev": "a565cb46bee9fa856a6c15bc9c3bb947fbb784ec", + "lastModified": 1621027569, + "narHash": "sha256-ugwMMfZagrWnt6yw+k1YGbydoMQ0OTYJ3WJ1kncsKCg=", + "owner": "divnix", + "repo": "digga", + "rev": "c162f5f46206346f431f3905642a8a9f17d42217", "type": "github" }, "original": { - "owner": "BBBSnowball", - "ref": "pr-1", + "owner": "divnix", + "repo": "digga", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1606424373, + "narHash": "sha256-oq8d4//CJOrVj+EcOaSXvMebvuTkmBJuT5tzlfewUnQ=", + "owner": "edolstra", "repo": "flake-compat", + "rev": "99f1c2157fba4bfe6211a321fd0ee43199025dbf", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1606424373, + "narHash": "sha256-oq8d4//CJOrVj+EcOaSXvMebvuTkmBJuT5tzlfewUnQ=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "99f1c2157fba4bfe6211a321fd0ee43199025dbf", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1620759905, + "narHash": "sha256-WiyWawrgmyN0EdmiHyG2V+fqReiVi8bM9cRdMaKQOFg=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b543720b25df6ffdfcf9227afafc5b8c1fabfae8", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, @@ -131,10 +173,45 @@ "type": "github" } }, + "latest": { + "locked": { + "lastModified": 1619400530, + "narHash": "sha256-7ZO7B+b9i1wFbHw62EFT+iwuBBpXeA/fcHlR63Z4J0w=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e8dc8adab655eb27957859c62bef11484b53f639", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, "naersk": { "inputs": { "nixpkgs": [ - "override" + "latest" + ] + }, + "locked": { + "lastModified": 1610392286, + "narHash": "sha256-3wFl5y+4YZO4SgRYK8WE7JIS3p0sxbgrGaQ6RMw+d98=", + "owner": "nmattia", + "repo": "naersk", + "rev": "d7bfbad3304fd768c0f93a4c3b50976275e6d4be", + "type": "github" + }, + "original": { + "owner": "nmattia", + "ref": "master", + "repo": "naersk", + "type": "github" + } + }, + "naersk_2": { + "inputs": { + "nixpkgs": [ + "latest" ] }, "locked": { @@ -151,6 +228,21 @@ "type": "github" } }, + "nixlib": { + "locked": { + "lastModified": 1620519687, + "narHash": "sha256-+6Dd72b2CASuXm2W7KRxZIE7AOy/dj4mU28vaF+zxcs=", + "owner": "divnix", + "repo": "nixpkgs.lib", + "rev": "c7b6169809c5f74dd0c34f3d69e9d12ba4d448de", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "nixpkgs.lib", + "type": "github" + } + }, "nixos": { "locked": { "lastModified": 1615797423, @@ -181,6 +273,37 @@ "type": "github" } }, + "nixpkgs": { + "locked": { + "lastModified": 1610942247, + "narHash": "sha256-PKo1ATAlC6BmfYSRmX0TVmNoFbrec+A5OKcabGEu2yU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "7d71001b796340b219d1bfa8552c81995017544a", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1620962350, + "narHash": "sha256-9ASW4d4/Z8HmRvuJI8rxbEOTbXTBpQ8y+CmFYBwtXzE=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "5d4a430472cafada97888cc80672fab255231f57", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "type": "github" + } + }, "nur": { "locked": { "lastModified": 1615921934, @@ -195,20 +318,6 @@ "type": "indirect" } }, - "override": { - "locked": { - "lastModified": 1615926763, - "narHash": "sha256-yeq8A3EPNuQVlsxlEQrIRsklfJwJK0Us6jtcG/u8wNs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "b702a56d417647de4090ac56c0f18bdc7e646610", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, "pkgs": { "inputs": { "nixpkgs": [ @@ -228,11 +337,11 @@ "pre-commit-hooks-nix": { "flake": false, "locked": { - "lastModified": 1603721622, - "narHash": "sha256-tUgyf5eYK5+0A/dvLzbbm4W7icxbpORuFMXiFe5yz+I=", + "lastModified": 1617783930, + "narHash": "sha256-SigoU2LWM1fMggqfM9H8XEIvjOjBVQ/wj/zrn02J28c=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "efdbd6d28f7f44db3d9f8cf0e0b4cb9db0d259e1", + "rev": "2d169bb1b23f3b71a894a66ea81f45c788943248", "type": "github" }, "original": { @@ -245,26 +354,23 @@ "inputs": { "ci-agent": "ci-agent", "darwin": "darwin", - "deploy": "deploy", - "devshell": "devshell", - "flake-compat": "flake-compat", + "digga": "digga", "home": "home", - "naersk": "naersk", + "latest": "latest", + "naersk": "naersk_2", "nixos": "nixos", "nixos-hardware": "nixos-hardware", "nur": "nur", - "override": "override", - "pkgs": "pkgs", - "utils": "utils" + "pkgs": "pkgs" } }, "utils": { "locked": { - "lastModified": 1614513358, - "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=", + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", "owner": "numtide", "repo": "flake-utils", - "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", "type": "github" }, "original": { @@ -272,6 +378,25 @@ "repo": "flake-utils", "type": "github" } + }, + "utils_2": { + "inputs": { + "flake-utils": "flake-utils" + }, + "locked": { + "lastModified": 1620801141, + "narHash": "sha256-XPJ+/nP/s218E11R+4LJyvkrQXvdT3D6TzNjfWVYZnI=", + "owner": "gytis-ivaskevicius", + "repo": "flake-utils-plus", + "rev": "1a742047f3f7c97b22768ba7738ac5a01052099e", + "type": "github" + }, + "original": { + "owner": "gytis-ivaskevicius", + "ref": "staging", + "repo": "flake-utils-plus", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index a9551d8..6b6860f 100644 --- a/flake.nix +++ b/flake.nix @@ -4,51 +4,94 @@ inputs = { nixos.url = "nixpkgs/nixos-unstable"; - override.url = "nixpkgs"; + latest.url = "nixpkgs"; + digga.url = "github:divnix/digga"; + ci-agent = { url = "github:hercules-ci/hercules-ci-agent"; - inputs = { nix-darwin.follows = "darwin"; flake-compat.follows = "flake-compat"; nixos-20_09.follows = "nixos"; nixos-unstable.follows = "override"; }; + inputs = { nix-darwin.follows = "darwin"; nixos-20_09.follows = "nixos"; nixos-unstable.follows = "latest"; }; }; darwin.url = "github:LnL7/nix-darwin"; - darwin.inputs.nixpkgs.follows = "override"; - deploy = { - url = "github:serokell/deploy-rs"; - inputs = { flake-compat.follows = "flake-compat"; naersk.follows = "naersk"; nixpkgs.follows = "override"; utils.follows = "utils"; }; - }; - devshell.url = "github:numtide/devshell"; - flake-compat.url = "github:BBBSnowball/flake-compat/pr-1"; - flake-compat.flake = false; + darwin.inputs.nixpkgs.follows = "latest"; home.url = "github:nix-community/home-manager"; home.inputs.nixpkgs.follows = "nixos"; naersk.url = "github:nmattia/naersk"; - naersk.inputs.nixpkgs.follows = "override"; + naersk.inputs.nixpkgs.follows = "latest"; nixos-hardware.url = "github:nixos/nixos-hardware"; - utils.url = "github:numtide/flake-utils"; + pkgs.url = "path:./pkgs"; pkgs.inputs.nixpkgs.follows = "nixos"; }; - outputs = inputs@{ deploy, nixos, nur, self, utils, ... }: - let - lib = import ./lib { inherit self nixos utils inputs; }; - in - lib.mkFlake - { - inherit self; - hosts = ./hosts; - packages = import ./pkgs; - suites = import ./profiles/suites.nix; - extern = import ./extern; - overrides = import ./extern/overrides.nix; - overlays = ./overlays; - profiles = ./profiles; - userProfiles = ./users/profiles; - modules = import ./modules/module-list.nix; - userModules = import ./users/modules/module-list.nix; - } // { - inherit lib; - defaultTemplate = self.templates.flk; + outputs = inputs@{ self, pkgs, digga, nixos, ci-agent, home, nixos-hardware, nur, ... }: + digga.lib.mkFlake { + inherit self inputs; + + channelsConfig = { allowUnfree = true; }; + + channels = { + nixos = { + imports = [ (digga.lib.importers.overlays ./overlays) ]; + overlays = [ + ./pkgs/default.nix + pkgs.overlay # for `srcs` + nur.overlay + ]; + }; + latest = { }; + }; + + lib = import ./lib { lib = digga.lib // nixos.lib; }; + + sharedOverlays = [ + (final: prev: { + lib = prev.lib.extend (lfinal: lprev: { + our = self.lib; + }); + }) + ]; + + nixos = { + hostDefaults = { + system = "x86_64-linux"; + channelName = "nixos"; + modules = ./modules/module-list.nix; + externalModules = [ + { _module.args.ourLib = self.lib; } + ci-agent.nixosModules.agent-profile + home.nixosModules.home-manager + ./modules/customBuilds.nix + ]; + }; + + imports = [ (digga.lib.importers.hosts ./hosts) ]; + hosts = { + /* set host specific properties here */ + NixOS = { }; + }; + profiles = [ ./profiles ./users ]; + suites = { profiles, users, ... }: with profiles; { + base = [ core users.nixos users.root ]; + }; + }; + + home = { + modules = ./users/modules/module-list.nix; + externalModules = [ ]; + profiles = [ ./users/profiles ]; + suites = { profiles, ... }: with profiles; { + base = [ direnv git ]; + }; + }; + + homeConfigurations = digga.lib.mkHomeConfigurations self.nixosConfigurations; + + deploy.nodes = digga.lib.mkDeployNodes self.nixosConfigurations { }; + + #defaultTemplate = self.templates.flk; templates.flk.path = ./.; templates.flk.description = "flk template"; - }; + + } + ; } diff --git a/lib/attrs.nix b/lib/attrs.nix deleted file mode 100644 index 50c72d2..0000000 --- a/lib/attrs.nix +++ /dev/null @@ -1,45 +0,0 @@ -{ lib, ... }: -rec { - # mapFilterAttrs :: - # (name -> value -> bool ) - # (name -> value -> { name = any; value = any; }) - # attrs - mapFilterAttrs = seive: f: attrs: - lib.filterAttrs - seive - (lib.mapAttrs' f attrs); - - # Generate an attribute set by mapping a function over a list of values. - genAttrs' = values: f: lib.listToAttrs (map f values); - - # Convert a list of file paths to attribute set where - # the key is the folder or filename stripped of nix - # extension and imported content of the file as value. - # - pathsToImportedAttrs = paths: - let - paths' = lib.filter - (path: lib.hasSuffix ".nix" path - || lib.pathExists "${path}/default.nix") - paths; - in - genAttrs' paths' (path: { - name = lib.removeSuffix ".nix" - # Safe as long this is just used as a name - (builtins.unsafeDiscardStringContext (baseNameOf path)); - value = import path; - }); - - concatAttrs = lib.fold (attr: sum: lib.recursiveUpdate sum attr) { }; - - # Filter out packages that support given system and follow flake check requirements - filterPackages = system: packages: - let - # Everything that nix flake check requires for the packages output - filter = (n: v: with v; let platforms = meta.hydraPlatforms or meta.platforms or [ ]; in - lib.isDerivation v && !meta.broken && builtins.elem system platforms); - in - lib.filterAttrs filter packages; - - safeReadDir = path: lib.optionalAttrs (builtins.pathExists path) (builtins.readDir path); -} diff --git a/lib/compat/default.nix b/lib/compat/default.nix index 0a63b0b..9d0c283 100644 --- a/lib/compat/default.nix +++ b/lib/compat/default.nix @@ -1,12 +1,10 @@ let - inherit (lock.nodes.flake-compat.locked) rev narHash; - - lock = builtins.fromJSON (builtins.readFile "${../..}/flake.lock"); + rev = "e7e5d481a0e15dcd459396e55327749989e04ce0"; flake = (import ( fetchTarball { url = "https://github.com/edolstra/flake-compat/archive/${rev}.tar.gz"; - sha256 = narHash; + sha256 = "0zd3x46fswh5n6faq4x2kkpy6p3c6j593xbdlbsl40ppkclwc80x"; } ) { diff --git a/lib/default.nix b/lib/default.nix index ee06a3c..2356e1f 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -1,28 +1,2 @@ -args@{ nixos, self, ... }: -let inherit (nixos) lib; in -lib.makeExtensible (final: - let callLibs = file: import file - ({ - inherit lib; - - dev = final; - } // args); - in - with final; - { - inherit callLibs; - - attrs = callLibs ./attrs.nix; - os = callLibs ./devos; - lists = callLibs ./lists.nix; - strings = callLibs ./strings.nix; - - mkFlake = callLibs ./mkFlake; - - pkgs-lib = callLibs ./pkgs-lib; - - inherit (attrs) mapFilterAttrs genAttrs' safeReadDir - pathsToImportedAttrs concatAttrs filterPackages; - inherit (lists) pathsIn; - inherit (strings) rgxToString; - }) +{ lib }: +lib.makeExtensible (self: { }) diff --git a/lib/devos/default.nix b/lib/devos/default.nix deleted file mode 100644 index bac5b13..0000000 --- a/lib/devos/default.nix +++ /dev/null @@ -1,30 +0,0 @@ -{ lib, nixos, dev, ... }: -{ - # pkgImport :: Nixpkgs -> Overlays -> System -> Pkgs - pkgImport = nixpkgs: overlays: system: - import nixpkgs { - inherit system overlays; - config = { allowUnfree = true; }; - }; - - profileMap = list: map (profile: profile.default) (lib.flatten list); - - mkNodes = dev.callLibs ./mkNodes.nix; - - mkHosts = dev.callLibs ./mkHosts.nix; - - mkSuites = dev.callLibs ./mkSuites.nix; - - mkProfileAttrs = dev.callLibs ./mkProfileAttrs.nix; - - mkPkgs = dev.callLibs ./mkPkgs.nix; - - recImport = dev.callLibs ./recImport.nix; - - devosSystem = dev.callLibs ./devosSystem.nix; - - mkHomeConfigurations = dev.callLibs ./mkHomeConfigurations.nix; - - mkPackages = dev.callLibs ./mkPackages.nix; -} - diff --git a/lib/devos/devosSystem.nix b/lib/devos/devosSystem.nix deleted file mode 100644 index f194f3b..0000000 --- a/lib/devos/devosSystem.nix +++ /dev/null @@ -1,102 +0,0 @@ -{ lib, nixos, self, inputs, ... }: - -{ modules, ... } @ args: -lib.nixosSystem (args // { - modules = - let - moduleList = builtins.attrValues modules; - modpath = "nixos/modules"; - - fullHostConfig = (lib.nixosSystem (args // { modules = moduleList; })).config; - - isoConfig = (lib.nixosSystem - (args // { - modules = moduleList ++ [ - - "${nixos}/${modpath}/installer/cd-dvd/installation-cd-minimal-new-kernel.nix" - - ({ config, suites, ... }: { - - # avoid unwanted systemd service startups - # all strings in disabledModules get appended to modulesPath - # so convert each to list which can be coerced to string - disabledModules = map lib.singleton suites.allProfiles; - - nix.registry = lib.mapAttrs (n: v: { flake = v; }) inputs; - - isoImage.isoBaseName = "nixos-" + config.networking.hostName; - isoImage.contents = [{ - source = self; - target = "/devos/"; - }]; - isoImage.storeContents = [ - self.devShell.${config.nixpkgs.system} - # include also closures that are "switched off" by the - # above profile filter on the local config attribute - fullHostConfig.system.build.toplevel - ]; - # still pull in tools of deactivated profiles - environment.systemPackages = fullHostConfig.environment.systemPackages; - - # confilcts with networking.wireless which might be slightly - # more useful on a stick - networking.networkmanager.enable = lib.mkForce false; - # confilcts with networking.wireless - networking.wireless.iwd.enable = lib.mkForce false; - - # Set up a link-local boostrap network - # See also: https://github.com/NixOS/nixpkgs/issues/75515#issuecomment-571661659 - networking.usePredictableInterfaceNames = lib.mkForce true; # so prefix matching works - networking.useNetworkd = lib.mkForce true; - networking.useDHCP = lib.mkForce false; - networking.dhcpcd.enable = lib.mkForce false; - systemd.network = { - # https://www.freedesktop.org/software/systemd/man/systemd.network.html - networks."boostrap-link-local" = { - matchConfig = { - Name = "en* wl* ww*"; - }; - networkConfig = { - Description = "Link-local host bootstrap network"; - MulticastDNS = true; - LinkLocalAddressing = "ipv6"; - DHCP = "yes"; - }; - address = [ - # fall back well-known link-local for situations where MulticastDNS is not available - "fe80::47" # 47: n=14 i=9 x=24; n+i+x - ]; - extraConfig = '' - # Unique, yet stable. Based off the MAC address. - IPv6LinkLocalAddressGenerationMode = "eui64" - ''; - }; - }; - }) - ]; - })).config; - hmConfig = (lib.nixosSystem - (args // { - modules = moduleList ++ [ - ({ config, ... }: { - home-manager.useUserPackages = lib.mkForce false; - home-manager.sharedModules = [ - { - home.sessionVariables = { - inherit (config.environment.sessionVariables) NIX_PATH; - }; - xdg.configFile."nix/registry.json".text = - config.environment.etc."nix/registry.json".text; - } - ]; - }) - ]; - })).config; - in - moduleList ++ [{ - system.build = { - iso = isoConfig.system.build.isoImage; - homes = hmConfig.home-manager.users; - }; - }]; -}) diff --git a/lib/devos/mkHomeConfigurations.nix b/lib/devos/mkHomeConfigurations.nix deleted file mode 100644 index 490975a..0000000 --- a/lib/devos/mkHomeConfigurations.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ lib, self, ... }: - -with lib; -let - mkHomes = host: config: - mapAttrs' (user: v: nameValuePair "${user}@${host}" v.home) - config.config.system.build.homes; - - hmConfigs = mapAttrs mkHomes self.nixosConfigurations; - -in -foldl recursiveUpdate { } (attrValues hmConfigs) diff --git a/lib/devos/mkHosts.nix b/lib/devos/mkHosts.nix deleted file mode 100644 index cb3c316..0000000 --- a/lib/devos/mkHosts.nix +++ /dev/null @@ -1,109 +0,0 @@ -{ lib, dev, nixos, inputs, self, ... }: - -{ dir, extern, suites, overrides, multiPkgs, ... }: -let - defaultSystem = "x86_64-linux"; - - experimentalFeatures = [ - "flakes" - "nix-command" - "ca-references" - "ca-derivations" - ]; - - modules = { - modOverrides = { config, overrideModulesPath, ... }: - let - inherit (overrides) modules disabledModules; - in - { - disabledModules = modules ++ disabledModules; - imports = map - (path: "${overrideModulesPath}/${path}") - modules; - }; - - global = { config, pkgs, ... }: { - home-manager = { - useGlobalPkgs = true; - useUserPackages = true; - - extraSpecialArgs = extern.userSpecialArgs // { suites = suites.user; }; - sharedModules = extern.userModules ++ (builtins.attrValues self.homeModules); - }; - users.mutableUsers = lib.mkDefault false; - - hardware.enableRedistributableFirmware = lib.mkDefault true; - - nix.nixPath = [ - "nixpkgs=${nixos}" - "nixos-config=${self}/lib/compat/nixos" - "home-manager=${inputs.home}" - ]; - - nixpkgs.pkgs = lib.mkDefault multiPkgs.${config.nixpkgs.system}; - - nix.registry = { - devos.flake = self; - nixos.flake = nixos; - override.flake = inputs.override; - }; - - nix.package = pkgs.nixFlakes; - - nix.extraOptions = '' - experimental-features = ${lib.concatStringsSep " " - experimentalFeatures - } - ''; - - system.configurationRevision = lib.mkIf (self ? rev) self.rev; - }; - - # Everything in `./modules/list.nix`. - flakeModules = { imports = builtins.attrValues self.nixosModules ++ extern.modules; }; - - cachix = let rootCachix = ../../cachix.nix; in - if builtins.pathExists rootCachix - then rootCachix - else { } - ; - }; - - specialArgs = extern.specialArgs // { suites = suites.system; }; - - mkHostConfig = hostName: - let - local = { - require = [ - "${dir}/${hostName}.nix" - ]; - - networking = { inherit hostName; }; - - _module.args = { - inherit self; - hosts = builtins.mapAttrs (_: host: host.config) - (removeAttrs hosts [ hostName ]); - }; - }; - lib = { - lib = { inherit specialArgs; }; - lib.testModule = { - imports = [ local ] ++ builtins.attrValues modules; - }; - }; - in - dev.os.devosSystem { - inherit specialArgs; - system = defaultSystem; - modules = modules // { inherit local lib; }; - }; - - hosts = dev.os.recImport - { - inherit dir; - _import = mkHostConfig; - }; -in -hosts diff --git a/lib/devos/mkNodes.nix b/lib/devos/mkNodes.nix deleted file mode 100644 index 7892506..0000000 --- a/lib/devos/mkNodes.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ lib, ... }: - -/** - Synopsis: mkNodes _nixosConfigurations_ - - Generate the `nodes` attribute expected by deploy-rs - where _nixosConfigurations_ are `nodes`. - **/ -deploy: lib.mapAttrs (_: config: { - hostname = config.config.networking.hostName; - - profiles.system = { - user = "root"; - path = deploy.lib.x86_64-linux.activate.nixos config; - }; -}) diff --git a/lib/devos/mkPackages.nix b/lib/devos/mkPackages.nix deleted file mode 100644 index a876ea0..0000000 --- a/lib/devos/mkPackages.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ lib, dev, self, ... }: - -{ pkgs }: -let - inherit (self) overlay overlays; - packagesNames = lib.attrNames (overlay null null) - ++ lib.attrNames (dev.concatAttrs - (lib.attrValues - (lib.mapAttrs (_: v: v null null) overlays) - ) - ); -in -lib.fold - (key: sum: lib.recursiveUpdate sum { - ${key} = pkgs.${key}; - }) -{ } - packagesNames diff --git a/lib/devos/mkPkgs.nix b/lib/devos/mkPkgs.nix deleted file mode 100644 index f3126ea..0000000 --- a/lib/devos/mkPkgs.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ lib, dev, nixos, self, inputs, ... }: - -{ extern, overrides }: -(inputs.utils.lib.eachDefaultSystem - (system: - let - overridePkgs = dev.os.pkgImport inputs.override [ ] system; - overridesOverlay = overrides.packages; - - overlays = [ - (final: prev: { - lib = prev.lib.extend (lfinal: lprev: { - inherit dev; - inherit (lib) nixosSystem; - - utils = inputs.utils.lib; - }); - }) - (overridesOverlay overridePkgs) - self.overlay - ] - ++ extern.overlays - ++ (lib.attrValues self.overlays); - in - { pkgs = dev.os.pkgImport nixos overlays system; } - ) -).pkgs diff --git a/lib/devos/mkProfileAttrs.nix b/lib/devos/mkProfileAttrs.nix deleted file mode 100644 index d89c6ba..0000000 --- a/lib/devos/mkProfileAttrs.nix +++ /dev/null @@ -1,35 +0,0 @@ -{ lib, dev, ... }: - -let mkProfileAttrs = - /** - Synopsis: mkProfileAttrs _path_ - - Recursively collect the subdirs of _path_ containing a default.nix into attrs. - This sets a contract, eliminating ambiguity for _default.nix_ living under the - profile directory. - - Example: - let profiles = mkProfileAttrs ./profiles; in - assert profiles ? core.default; 0 - **/ - dir: - let - imports = - let - files = dev.safeReadDir dir; - - p = n: v: - v == "directory" - && n != "profiles"; - in - lib.filterAttrs p files; - - f = n: _: - lib.optionalAttrs - (lib.pathExists "${dir}/${n}/default.nix") - { default = "${dir}/${n}"; } - // mkProfileAttrs "${dir}/${n}"; - in - lib.mapAttrs f imports; -in mkProfileAttrs - diff --git a/lib/devos/mkSuites.nix b/lib/devos/mkSuites.nix deleted file mode 100644 index a3a3294..0000000 --- a/lib/devos/mkSuites.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ lib, dev, ... }: - -{ users, profiles, userProfiles, suites } @ args: -let - inherit (dev) os; - - definedSuites = suites { - inherit (args) users profiles userProfiles; - }; - - allProfiles = - let defaults = lib.collect (x: x ? default) profiles; - in map (x: x.default) defaults; - - allUsers = - let defaults = lib.collect (x: x ? default) users; - in map (x: x.default) defaults; - - createSuites = _: suites: lib.mapAttrs (_: v: os.profileMap v) suites // { - inherit allProfiles allUsers; - }; - -in -lib.mapAttrs createSuites definedSuites diff --git a/lib/devos/recImport.nix b/lib/devos/recImport.nix deleted file mode 100644 index d7f2aa8..0000000 --- a/lib/devos/recImport.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ lib, dev, ... }: - -{ dir, _import ? base: import "${dir}/${base}.nix" }: -dev.mapFilterAttrs - (_: v: v != null) - (n: v: - if n != "default.nix" && lib.hasSuffix ".nix" n && v == "regular" - then - let name = lib.removeSuffix ".nix" n; in lib.nameValuePair (name) (_import name) - else - lib.nameValuePair ("") (null)) - (dev.safeReadDir dir) diff --git a/lib/lists.nix b/lib/lists.nix deleted file mode 100644 index b6530f1..0000000 --- a/lib/lists.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ lib, dev, ... }: -{ - pathsIn = dir: - let - fullPath = name: "${toString dir}/${name}"; - in - map fullPath (lib.attrNames (dev.safeReadDir dir)); -} diff --git a/lib/mkFlake/default.nix b/lib/mkFlake/default.nix deleted file mode 100644 index 700773f..0000000 --- a/lib/mkFlake/default.nix +++ /dev/null @@ -1,55 +0,0 @@ -{ dev, nixos, inputs, ... }: -let - inherit (dev) os; - inherit (inputs) utils deploy; - evalFlakeArgs = dev.callLibs ./evalArgs.nix; -in - -{ self, ... } @ args: -let - - cfg = (evalFlakeArgs { inherit args; }).config; - - multiPkgs = os.mkPkgs { inherit (cfg) extern overrides; }; - - outputs = { - nixosConfigurations = os.mkHosts { - inherit self multiPkgs; - inherit (cfg) extern suites overrides; - dir = cfg.hosts; - }; - - homeConfigurations = os.mkHomeConfigurations; - - nixosModules = cfg.modules; - - homeModules = cfg.userModules; - - overlay = cfg.packages; - inherit (cfg) overlays; - - deploy.nodes = os.mkNodes deploy self.nixosConfigurations; - }; - - systemOutputs = utils.lib.eachDefaultSystem (system: - let - pkgs = multiPkgs.${system}; - pkgs-lib = dev.pkgs-lib.${system}; - # all packages that are defined in ./pkgs - legacyPackages = os.mkPackages { inherit pkgs; }; - in - { - checks = pkgs-lib.tests.mkChecks { - inherit (self.deploy) nodes; - hosts = self.nixosConfigurations; - homes = self.homeConfigurations; - }; - - inherit legacyPackages; - packages = dev.filterPackages system legacyPackages; - - devShell = pkgs-lib.shell; - }); -in -outputs // systemOutputs - diff --git a/lib/mkFlake/evalArgs.nix b/lib/mkFlake/evalArgs.nix deleted file mode 100644 index 29d04bc..0000000 --- a/lib/mkFlake/evalArgs.nix +++ /dev/null @@ -1,154 +0,0 @@ -{ self, dev, nixos, inputs, ... }: - -{ args }: -let - argOpts = with nixos.lib; { config, options, ... }: - let - inherit (dev) os; - - inherit (config) self; - - inputAttrs = with types; functionTo attrs; - moduleType = with types; anything // { - inherit (submodule { }) check; - description = "valid module"; - }; - in - { - options = with types; { - self = mkOption { - type = addCheck attrs nixos.lib.isStorePath; - description = "The flake to create the devos outputs for"; - }; - hosts = mkOption { - type = path; - default = "${self}/hosts"; - defaultText = "\${self}/hosts"; - apply = toString; - description = '' - Path to directory containing host configurations that will be exported - to the 'nixosConfigurations' output. - ''; - }; - packages = mkOption { - # functionTo changes arg names which breaks flake check - type = types.anything // { - check = builtins.isFunction; - description = "Nixpkgs overlay"; - }; - default = (final: prev: { }); - defaultText = "(final: prev: {})"; - description = '' - Overlay for custom packages that will be included in treewide 'pkgs'. - This should follow the standard nixpkgs overlay format - two argument function - that returns an attrset. - These packages will be exported to the 'packages' and 'legacyPackages' outputs. - ''; - }; - modules = mkOption { - type = listOf moduleType; - default = [ ]; - apply = dev.pathsToImportedAttrs; - description = '' - list of modules to include in confgurations and export in 'nixosModules' output - ''; - }; - userModules = mkOption { - type = listOf moduleType; - default = [ ]; - apply = dev.pathsToImportedAttrs; - description = '' - list of modules to include in home-manager configurations and export in - 'homeModules' output - ''; - }; - profiles = mkOption { - type = path; - default = "${self}/profiles"; - defaultText = "\${self}/profiles"; - apply = x: os.mkProfileAttrs (toString x); - description = "path to profiles folder that can be collected into suites"; - }; - userProfiles = mkOption { - type = path; - default = "${self}/users/profiles"; - defaultText = "\${self}/users/profiles"; - apply = x: os.mkProfileAttrs (toString x); - description = "path to user profiles folder that can be collected into userSuites"; - }; - suites = - let - defaults = { user = { }; system = { }; }; - in - mkOption { - type = inputAttrs; - default = { ... }: defaults; - defaultText = "{ user = {}; system = {}; }"; - apply = suites: defaults // os.mkSuites { - inherit suites; - inherit (config) profiles users userProfiles; - }; - description = '' - Function with inputs 'users' and 'profiles' that returns attribute set - with user and system suites. The former for Home Manager and the latter - for nixos configurations. - These can be accessed through the 'suites' specialArg in each config system. - ''; - }; - users = mkOption { - type = path; - default = "${self}/users"; - defaultText = "\${self}/users"; - apply = x: os.mkProfileAttrs (toString x); - description = '' - path to folder containing profiles that define system users - ''; - }; - extern = - let - defaults = { - modules = [ ]; - overlays = [ ]; - specialArgs = { }; - userModules = [ ]; - userSpecialArgs = { }; - }; - in - mkOption { - type = inputAttrs; - default = { ... }: defaults; - defaultText = '' - { modules = []; overlays = []; specialArgs = []; userModules = []; userSpecialArgs = []; } - ''; - # So unneeded extern attributes can safely be deleted - apply = x: defaults // (x { inputs = inputs // self.inputs; }); - description = '' - Function with argument 'inputs' that contains all devos and ''${self}'s inputs. - The function should return an attribute set with modules, overlays, and - specialArgs to be included across nixos and home manager configurations. - Only attributes that are used should be returned. - ''; - }; - overlays = mkOption { - type = path; - default = "${self}/overlays"; - defaultText = "\${self}/overlays"; - apply = x: dev.pathsToImportedAttrs (dev.pathsIn (toString x)); - description = '' - path to folder containing overlays which will be applied to pkgs and exported in - the 'overlays' output - ''; - }; - overrides = mkOption rec { - type = attrs; - default = { modules = [ ]; disabledModules = [ ]; packages = _: _: _: { }; }; - defaultText = "{ modules = []; disabledModules = []; packages = {}; }"; - apply = x: default // x; - description = "attrset of packages and modules that will be pulled from nixpkgs master"; - }; - }; - }; -in -nixos.lib.evalModules { - modules = [ argOpts args ]; -} diff --git a/lib/pkgs-lib/default.nix b/lib/pkgs-lib/default.nix deleted file mode 100644 index 807b44f..0000000 --- a/lib/pkgs-lib/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -args@{ lib, dev, utils, nixos, ... }: -lib.genAttrs utils.lib.defaultSystems (system: - lib.makeExtensible (final: - let - pkgs = import nixos { inherit system; }; - callLibs = file: import file - (args // { - inherit pkgs system; - pkgs-lib = final; - }); - in - with final; - { - inherit callLibs; - - tests = callLibs ./tests; - shell = callLibs ./shell; - } - ) -) diff --git a/lib/pkgs-lib/shell/default.nix b/lib/pkgs-lib/shell/default.nix deleted file mode 100644 index ed78187..0000000 --- a/lib/pkgs-lib/shell/default.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ lib, dev, inputs, system, nixos, ... }: -let - overlays = [ - inputs.devshell.overlay - (final: prev: { - deploy-rs = - inputs.deploy.packages.${prev.system}.deploy-rs; - }) - ]; - - pkgs = dev.os.pkgImport nixos overlays system; - - flk = pkgs.callPackage ./flk.nix { }; - - installPkgs = (lib.nixosSystem { - inherit system; - modules = [ ]; - }).config.system.build; -in -pkgs.devshell.mkShell { - imports = [ (pkgs.devshell.importTOML ./devshell.toml) ]; - - packages = with installPkgs; [ - nixos-install - nixos-generate-config - nixos-enter - ]; - - git.hooks = { - pre-commit.text = lib.fileContents ./pre-commit.sh; - }; - - commands = with pkgs; [ - { package = flk; } - { - name = "nix"; - help = pkgs.nixFlakes.meta.description; - command = '' - ${pkgs.nixFlakes}/bin/nix --experimental-features "nix-command flakes ca-references" "${"\${@}"}" - ''; - } - ] - ++ lib.optional (system != "i686-linux") { package = cachix; } - ++ lib.optional (system == "x86_64-linux") { - name = "deploy"; - package = deploy-rs; - help = "A simple multi-profile Nix-flake deploy tool."; - }; -} diff --git a/lib/pkgs-lib/shell/devshell.toml b/lib/pkgs-lib/shell/devshell.toml deleted file mode 100644 index f261fdc..0000000 --- a/lib/pkgs-lib/shell/devshell.toml +++ /dev/null @@ -1,29 +0,0 @@ -imports = [ "git.hooks" ] - -[devshell] -packages = [ - "git-crypt" -] - -[[commands]] -package = "git" -category = "vcs" - -[[commands]] -package = "nixpkgs-fmt" -category = "linters" - -[[commands]] -package = "editorconfig-checker" -category = "linters" - -[[commands]] -package = "python3Packages.grip" -category = "documentation" - -[[commands]] -package = "mdbook" -category = "documentation" - -[git.hooks] -enable = true diff --git a/lib/pkgs-lib/shell/flk.nix b/lib/pkgs-lib/shell/flk.nix deleted file mode 100644 index ff9c59e..0000000 --- a/lib/pkgs-lib/shell/flk.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ stdenv }: -let - name = "flk"; -in -stdenv.mkDerivation { - inherit name; - - src = ./flk.sh; - - dontUnpack = true; - dontBuild = true; - - installPhase = '' - mkdir -p $out/bin - install $src $out/bin/${name} - ''; - - checkPhase = '' - ${stdenv.shell} -n -O extglob $out/bin/${name} - ''; - - meta.description = "Build, deploy, and install NixOS"; -} diff --git a/lib/pkgs-lib/shell/flk.sh b/lib/pkgs-lib/shell/flk.sh deleted file mode 100755 index 2d46045..0000000 --- a/lib/pkgs-lib/shell/flk.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env bash - -[[ -d "$DEVSHELL_ROOT" ]] || - { - echo "This script must be run from devos's devshell" >&2 - exit 1 - } - -shopt -s extglob - -HOSTNAME="$(hostname)" - -usage () { - printf "%b\n" \ - "\e[4mUsage\e[0m: $(basename $0) COMMAND [ARGS]\n" \ - "\e[4mCommands\e[0m:" - - printf " %-30s %s\n\n" \ - "up" "Generate $DEVSHELL_ROOT/hosts/up-$HOSTNAME.nix" \ - "update [INPUT]" "Update and commit the lock file, or specific input" \ - "get (core|community) [DEST]" "Copy the desired template to DEST" \ - "iso HOST" "Generate an ISO image of HOST" \ - "install HOST [ARGS]" "Shortcut for nixos-install" \ - "home HOST USER [switch]" "Home-manager config of USER from HOST" \ - "HOST (switch|boot|test)" "Shortcut for nixos-rebuild" -} - -case "$1" in - ""|"-h"|"help"|*(-)"help") - usage - ;; - - "up") - mkdir -p "$DEVSHELL_ROOT/up" - - nixos-generate-config --dir "$DEVSHELL_ROOT/up/$HOSTNAME" - - printf "%s\n" \ - "{ suites, ... }:" \ - "{" \ - " imports = [" \ - " ../up/$HOSTNAME/configuration.nix" \ - " ] ++ suites.core;" \ - "}" > "$DEVSHELL_ROOT/hosts/up-$HOSTNAME.nix" - - git add -f \ - "$DEVSHELL_ROOT/up/$HOSTNAME" \ - "$DEVSHELL_ROOT/hosts/up-$HOSTNAME.nix" - ;; - - "update") - if [[ -n "$2" ]]; then - if [[ -n "$3" ]]; then - (cd $2; nix flake list-inputs --update-input "$3") - else - (cd $2; nix flake update) - fi - nix flake list-inputs --update-input "$2" "$DEVSHELL_ROOT" - else - nix flake update "$DEVSHELL_ROOT" - fi - ;; - - "get") - if [[ "$2" == "core" || "$2" == "community" ]]; then - nix flake new -t "github:divnix/devos/$2" "${3:-flk}" - else - echo "flk get (core|community) [DEST]" - exit 1 - fi - ;; - - "iso") - nix build \ - "$DEVSHELL_ROOT#nixosConfigurations.$2.config.system.build.iso" \ - "${@:3}" - ;; - - "install") - sudo nixos-install --flake "$DEVSHELL_ROOT#$2" "${@:3}" - ;; - - "home") - ref="$DEVSHELL_ROOT/#homeConfigurations.$3@$2.activationPackage" - - if [[ "$4" == "switch" ]]; then - nix build "$ref" && result/activate && - unlink result - - else - nix build "$ref" "${@:4}" - fi - ;; - - *) - sudo nixos-rebuild --flake "$DEVSHELL_ROOT#$1" "${@:2}" - ;; -esac diff --git a/lib/pkgs-lib/shell/pre-commit.sh b/lib/pkgs-lib/shell/pre-commit.sh deleted file mode 100755 index 985d3b4..0000000 --- a/lib/pkgs-lib/shell/pre-commit.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash - -if git rev-parse --verify HEAD >/dev/null 2>&1 -then - against=HEAD -else - # Initial commit: diff against an empty tree object - against=$(${git}/bin/git hash-object -t tree /dev/null) -fi - -diff="git diff-index --name-only --cached $against --diff-filter d" - -nix_files=($($diff -- '*.nix')) -all_files=($($diff)) - -# Format staged nix files. -if [[ -n "${nix_files[@]}" ]]; then - nixpkgs-fmt "${nix_files[@]}" \ - && git add "${nix_files[@]}" -fi - -# check editorconfig -editorconfig-checker -- "${all_files[@]}" -if [[ $? != '0' ]]; then - printf "%b\n" \ - "\nCode is not aligned with .editorconfig" \ - "Review the output and commit your fixes" >&2 - exit 1 -fi diff --git a/lib/pkgs-lib/tests/default.nix b/lib/pkgs-lib/tests/default.nix deleted file mode 100644 index d924a80..0000000 --- a/lib/pkgs-lib/tests/default.nix +++ /dev/null @@ -1,83 +0,0 @@ -{ pkgs-lib, pkgs, system, inputs, nixos, lib, ... }: -let - mkChecks = { hosts, nodes, homes ? { } }: - let - deployHosts = lib.filterAttrs - (n: _: hosts.${n}.config.nixpkgs.system == system) - nodes; - deployChecks = inputs.deploy.lib.${system}.deployChecks { nodes = deployHosts; }; - tests = - { libTests = libTests; } - // lib.optionalAttrs (deployHosts != { }) { - profilesTest = profilesTest (hosts.${(builtins.head (builtins.attrNames deployHosts))}); - } // lib.mapAttrs (n: v: v.activationPackage) homes; - - in - lib.recursiveUpdate tests deployChecks; - - mkTest = host: - let - nixosTesting = - (import "${nixos}/nixos/lib/testing-python.nix" { - inherit system; - inherit (host.config.lib) specialArgs; - inherit pkgs; - extraConfigurations = [ - host.config.lib.testModule - ]; - }); - in - test: - let - loadedTest = - if builtins.typeOf test == "path" - then import test - else test; - calledTest = - if pkgs.lib.isFunction loadedTest - then pkgs.callPackage loadedTest { } - else loadedTest; - in - nixosTesting.makeTest calledTest; - - profilesTest = host: mkTest host { - name = "profiles"; - - machine = { suites, ... }: { - imports = suites.allProfiles ++ suites.allUsers; - }; - - testScript = '' - ${host.config.networking.hostName}.systemctl("is-system-running --wait") - ''; - }; - - libTests = pkgs.runCommandNoCC "devos-lib-tests" - { - buildInputs = [ - pkgs.nix - ( - let tests = pkgs-lib.callLibs ./lib.nix; - in - if tests == [ ] - then null - else throw (builtins.toJSON tests) - ) - ]; - } '' - datadir="${pkgs.nix}/share" - export TEST_ROOT=$(pwd)/test-tmp - export NIX_BUILD_HOOK= - export NIX_CONF_DIR=$TEST_ROOT/etc - export NIX_LOCALSTATE_DIR=$TEST_ROOT/var - export NIX_LOG_DIR=$TEST_ROOT/var/log/nix - export NIX_STATE_DIR=$TEST_ROOT/var/nix - export NIX_STORE_DIR=$TEST_ROOT/store - export PAGER=cat - cacheDir=$TEST_ROOT/binary-cache - nix-store --init - - touch $out - ''; -in -{ inherit mkTest libTests profilesTest mkChecks; } diff --git a/lib/pkgs-lib/tests/lib.nix b/lib/pkgs-lib/tests/lib.nix deleted file mode 100644 index 68baa9f..0000000 --- a/lib/pkgs-lib/tests/lib.nix +++ /dev/null @@ -1,93 +0,0 @@ -{ pkgs, lib, dev, ... }: -with dev; -lib.runTests { - testConcatAttrs = { - expr = concatAttrs [{ foo = 1; } { bar = 2; } { baz = 3; }]; - - expected = { foo = 1; bar = 2; baz = 3; }; - }; - - testGenAttrs' = { - expr = genAttrs' - [ "/foo/bar" "/baz/buzz" ] - (path: { - name = baseNameOf path; - value = "${path}/fizz"; - }); - - expected = { bar = "/foo/bar/fizz"; buzz = "/baz/buzz/fizz"; }; - }; - - testMapFilterAttrs = { - expr = mapFilterAttrs - (n: v: n == "foobar" && v == 1) - (n: v: lib.nameValuePair ("${n}bar") (v + 1)) - { foo = 0; bar = 2; }; - - expected = { foobar = 1; }; - }; - - testPathsIn = { - expr = pathsIn (toString ./testPathsIn); - - expected = map toString [ - ./testPathsIn/bar - ./testPathsIn/baz - ./testPathsIn/foo - ]; - }; - - testPathsToImportedAttrs = { - expr = - pathsToImportedAttrs [ - (toString ./testPathsToImportedAttrs/dir) - ./testPathsToImportedAttrs/foo.nix - ./testPathsToImportedAttrs/bar.nix - ./testPathsToImportedAttrs/t.nix - ./testPathsToImportedAttrs/f.nix - ]; - - expected = { - dir = { a = 5; }; - foo = { bar = 1; }; - bar = { foo = 2; }; - t = true; - f = false; - }; - }; - - testRgxToString = lib.testAllTrue [ - (rgxToString ".+x" "vxk" == "vx") - (rgxToString "^fo" "foo" == "fo") - (rgxToString "a?" "a" == "a") - (rgxToString "hat" "foohatbar" == "hat") - ]; - - testSafeReadDir = { - expr = safeReadDir ./profiles // safeReadDir ./nonexistentdir; - expected = { - foo = "directory"; - t = "directory"; - }; - }; - - testSuites = - let - profiles = os.mkProfileAttrs (toString ./profiles); - users = ""; - userProfiles = ""; - suites = { profiles, ... }: { - system.bar = [ profiles.foo ]; - }; - in - { - expr = os.mkSuites { inherit profiles users userProfiles suites; }; - expected = { - system = { - bar = [ profiles.foo.default ]; - allProfiles = [ profiles.foo.default profiles.t.default ]; - allUsers = [ ]; - }; - }; - }; -} diff --git a/lib/pkgs-lib/tests/profiles/foo/default.nix b/lib/pkgs-lib/tests/profiles/foo/default.nix deleted file mode 100644 index 2181e56..0000000 --- a/lib/pkgs-lib/tests/profiles/foo/default.nix +++ /dev/null @@ -1,3 +0,0 @@ -{ - bar = 5; -} diff --git a/lib/pkgs-lib/tests/profiles/t/default.nix b/lib/pkgs-lib/tests/profiles/t/default.nix deleted file mode 100644 index 8b13789..0000000 --- a/lib/pkgs-lib/tests/profiles/t/default.nix +++ /dev/null @@ -1 +0,0 @@ - diff --git a/lib/pkgs-lib/tests/testPathsIn/bar b/lib/pkgs-lib/tests/testPathsIn/bar deleted file mode 100644 index e69de29..0000000 diff --git a/lib/pkgs-lib/tests/testPathsIn/baz b/lib/pkgs-lib/tests/testPathsIn/baz deleted file mode 100644 index e69de29..0000000 diff --git a/lib/pkgs-lib/tests/testPathsIn/foo b/lib/pkgs-lib/tests/testPathsIn/foo deleted file mode 100644 index e69de29..0000000 diff --git a/lib/pkgs-lib/tests/testPathsToImportedAttrs/bar.nix b/lib/pkgs-lib/tests/testPathsToImportedAttrs/bar.nix deleted file mode 100644 index 0e5233d..0000000 --- a/lib/pkgs-lib/tests/testPathsToImportedAttrs/bar.nix +++ /dev/null @@ -1 +0,0 @@ -{ foo = 2; } diff --git a/lib/pkgs-lib/tests/testPathsToImportedAttrs/dir/default.nix b/lib/pkgs-lib/tests/testPathsToImportedAttrs/dir/default.nix deleted file mode 100644 index 01cb926..0000000 --- a/lib/pkgs-lib/tests/testPathsToImportedAttrs/dir/default.nix +++ /dev/null @@ -1 +0,0 @@ -{ a = 5; } diff --git a/lib/pkgs-lib/tests/testPathsToImportedAttrs/f.nix b/lib/pkgs-lib/tests/testPathsToImportedAttrs/f.nix deleted file mode 100644 index c4d456a..0000000 --- a/lib/pkgs-lib/tests/testPathsToImportedAttrs/f.nix +++ /dev/null @@ -1 +0,0 @@ -true && false diff --git a/lib/pkgs-lib/tests/testPathsToImportedAttrs/foo.nix b/lib/pkgs-lib/tests/testPathsToImportedAttrs/foo.nix deleted file mode 100644 index 2f11bd3..0000000 --- a/lib/pkgs-lib/tests/testPathsToImportedAttrs/foo.nix +++ /dev/null @@ -1 +0,0 @@ -{ bar = 1; } diff --git a/lib/pkgs-lib/tests/testPathsToImportedAttrs/t.nix b/lib/pkgs-lib/tests/testPathsToImportedAttrs/t.nix deleted file mode 100644 index 3be59dc..0000000 --- a/lib/pkgs-lib/tests/testPathsToImportedAttrs/t.nix +++ /dev/null @@ -1 +0,0 @@ -true || false diff --git a/lib/strings.nix b/lib/strings.nix deleted file mode 100644 index 56a0861..0000000 --- a/lib/strings.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ lib, ... }: -{ - # returns matching part of _regex_ _string_; null indicates failure. - rgxToString = regex: string: - let - match = - let - head = lib.substring 0 1 regex; - sec = lib.substring 1 2 regex; - in - if head == "^" - || head == "." - || (sec == "*" || sec == "+" || sec == "?") - then builtins.match "(${regex}).*" string - else builtins.match ".*(${regex}).*" string; - in - if lib.isList match - then lib.head match - else null; -} diff --git a/modules/customBuilds.nix b/modules/customBuilds.nix new file mode 100644 index 0000000..875d23a --- /dev/null +++ b/modules/customBuilds.nix @@ -0,0 +1,30 @@ +{ lib, self, diggaLib, config, modules, channel, ... }: +let + mkBuild = buildModule: + # TODO: get specialArgs as a module argument and drop builderArgs usage + channel.input.lib.nixosSystem (diggaLib.mergeAny config.lib.builderArgs { + modules = [ buildModule ]; + }); +in +{ + system.build = { + iso = (mkBuild (diggaLib.modules.isoConfig { + inherit self; + inherit (self) inputs; + fullHostConfig = config; + })).config.system.build.isoImage; + + homes = (mkBuild ({ config, ... }: { + home-manager.useUserPackages = lib.mkForce false; + home-manager.sharedModules = [ + { + home.sessionVariables = { + inherit (config.environment.sessionVariables) NIX_PATH; + }; + xdg.configFile."nix/registry.json".text = + config.environment.etc."nix/registry.json".text; + } + ]; + })).config.home-manager.users; + }; +} diff --git a/overlays/overrides.nix b/overlays/overrides.nix new file mode 100644 index 0000000..59516b3 --- /dev/null +++ b/overlays/overrides.nix @@ -0,0 +1,28 @@ +channels: final: prev: { + + __dontExport = true; # overrides clutter up actual creations + + inherit (channels.latest) + cachix + dhall + discord + element-desktop + manix + nixpkgs-fmt + qutebrowser + signal-desktop + starship; + + + haskellPackages = prev.haskellPackages.override { + overrides = hfinal: hprev: + let version = prev.lib.replaceChars [ "." ] [ "" ] prev.ghc.version; + in + { + # same for haskell packages, matching ghc versions + inherit (channels.latest.haskell.packages."ghc${version}") + haskell-language-server; + }; + }; + +} diff --git a/profiles/core/default.nix b/profiles/core/default.nix index 15824b0..41b5136 100644 --- a/profiles/core/default.nix +++ b/profiles/core/default.nix @@ -1,4 +1,4 @@ -{ config, lib, pkgs, ... }: +{ self, config, lib, pkgs, ... }: let inherit (lib) fileContents; in { @@ -12,7 +12,6 @@ in binutils coreutils curl - deploy-rs direnv dnsutils dosfstools @@ -77,7 +76,7 @@ in ''; # fix nixos-option - nixos-option = "nixos-option -I nixpkgs=${toString ../../lib/compat}"; + nixos-option = "nixos-option -I nixpkgs=${self}/lib/compat"; # sudo s = ifSudo "sudo -E ";