flake: initial commit

This commit is contained in:
Alejandro Soto 2025-01-26 15:07:06 -06:00
parent 6f35544dcd
commit 4b8609385a
6 changed files with 207 additions and 0 deletions

174
flake.nix Normal file
View file

@ -0,0 +1,174 @@
{
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = {
self,
nixpkgs,
flake-utils,
}: let
mapOverlayOverride = namespace: overlay: final: prev: let
overlayPkgs = overlay final prev;
in
{
"${namespace}" = builtins.removeAttrs overlayPkgs ["override"];
}
// (overlayPkgs.override or {});
in
flake-utils.lib.eachDefaultSystem (system: {
formatter = (import nixpkgs {inherit system;}).alejandra;
})
// {
overlays = let
overlay = mapOverlayOverride "trivium" (import ./pkgs);
in {
default = overlay;
trivium = overlay;
};
lib = {
mkSystemFlake = {
flakes,
system,
formatter ? "alejandra",
localOverlayPath ? null,
nixpkgsConfigPath ? null,
nixosSourcePath ? null,
nixosPlatformsPath ?
if nixosSourcePath != null
then nixosSourcePath + /platform
else null,
hmSourcePath ? null,
hmPlatformsPath ?
if hmSourcePath != null
then hmSourcePath + /platform
else null,
}: let
optionalFlake = name:
if flakes ? "${name}"
then flakes.${name}
else null;
requireFlake = name:
if flakes ? "${name}"
then flakes.${name}
else throw "Required flake input '${name}' is required but was not provided";
nur = optionalFlake "nur";
nixpkgs = requireFlake "nixpkgs";
unstable = optionalFlake "unstable";
home-manager =
if hmSourcePath != null
then requireFlake "home-manager"
else null;
pkgs = importPkgs nixpkgs;
importPkgs = flake:
import flake ({
inherit system;
config = import ./pkgs/config nixpkgs.lib;
overlays = let
conditions = [
{
overlay = nur.overlays.default;
condition = nur != null;
}
# NB: Preserve the relative order
{
overlay = self.overlays.trivium;
condition = true;
}
{
overlay = flakes.self.overlays.default;
condition = true;
}
];
in
builtins.map (cond: cond.overlay) (builtins.filter (cond: cond.condition) conditions);
}
// (
if nixpkgsConfigPath != null
then {
config = import nixpkgsConfigPath {inherit (nixpkgs) lib;};
}
else {}
));
inherit (pkgs.trivium.lib) importAll;
in
with pkgs.lib;
{
formatter.${system} =
if formatter == "alejandra"
then pkgs.alejandra
else if formatter == "nixpkgs-fmt"
then pkgs.nixpkgs-fmt
else throw "Unknown formatter: '${formatter}'";
packages.${system} = pkgs.local;
overlays.default = final: prev: let
overlay =
if localOverlayPath != null
then import localOverlayPath
else (final: prev: {});
in
mapOverlayOverride "local" overlay final prev
// optionalAttrs (unstable != null) {
unstable = importPkgs unstable;
};
}
// optionalAttrs (nixosSourcePath != null) {
nixosConfigurations = let
nixosSystem = {modules}:
makeOverridable nixpkgs.lib.nixosSystem {
inherit modules pkgs system;
specialArgs = {
inherit flakes;
};
};
hostConfig = platform:
nixosSystem {
modules = [
./nixos
nixosSourcePath
platform
];
};
in
mapAttrs (_: hostConfig) (importAll {root = nixosPlatformsPath;});
}
// optionalAttrs (hmSourcePath != null) {
homeConfigurations = let
registry = {...}: {
config.nix.registry =
mapAttrs
(_: value: {flake = value;})
flakes;
};
home = name: platform:
home-manager.lib.homeManagerConfiguration {
inherit pkgs;
extraSpecialArgs = {
inherit flakes;
};
modules = [
./hm
hmSourcePath
platform
registry
];
};
in
mapAttrs home (importAll {root = hmPlatformsPath;});
};
};
};
}

1
hm/default.nix Normal file
View file

@ -0,0 +1 @@
{}

1
nixos/default.nix Normal file
View file

@ -0,0 +1 @@
{}

8
pkgs/default.nix Normal file
View file

@ -0,0 +1,8 @@
final: prev:
with prev.lib; let
inherit (final) callPackage;
in {
lib = callPackage ./lib {};
override = {};
}

3
pkgs/lib/default.nix Normal file
View file

@ -0,0 +1,3 @@
{callPackage}: {
importAll = callPackage ./importAll.nix {};
}

20
pkgs/lib/importAll.nix Normal file
View file

@ -0,0 +1,20 @@
{lib}: {
root,
exclude ? [],
}:
with builtins;
with lib;
# http://chriswarbo.net/projects/nixos/useful_hacks.html
let
basename = removeSuffix ".nix";
isMatch = name: type:
(hasSuffix ".nix" name || type == "directory")
&& ! elem name (map basename exclude);
entry = name: _: {
name = basename name;
value = import (root + "/${name}");
};
in
mapAttrs' entry (filterAttrs isMatch (readDir root))