From e832157e6859bfd2f46dec03b35cd357d5911bad Mon Sep 17 00:00:00 2001 From: technofab Date: Sat, 4 Oct 2025 17:32:44 +0200 Subject: [PATCH] chore: initial commit --- .envrc | 2 + flake.lock | 63 ++++++++++++++ flake.nix | 22 +++++ lib/default.nix | 5 ++ lib/flake.nix | 5 ++ lib/mkDisk.nix | 32 +++++++ lib/mkHome.nix | 35 ++++++++ lib/mkSystem.nix | 77 +++++++++++++++++ lib/ren-module.nix | 50 +++++++++++ nix/repo/devShells.nix | 16 ++++ nix/repo/flake.lock | 45 ++++++++++ nix/repo/flake.nix | 15 ++++ test/flake.lock | 184 +++++++++++++++++++++++++++++++++++++++++ test/flake.nix | 115 ++++++++++++++++++++++++++ 14 files changed, 666 insertions(+) create mode 100644 .envrc create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 lib/default.nix create mode 100644 lib/flake.nix create mode 100644 lib/mkDisk.nix create mode 100644 lib/mkHome.nix create mode 100644 lib/mkSystem.nix create mode 100644 lib/ren-module.nix create mode 100644 nix/repo/devShells.nix create mode 100644 nix/repo/flake.lock create mode 100644 nix/repo/flake.nix create mode 100644 test/flake.lock create mode 100644 test/flake.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..565a52a --- /dev/null +++ b/.envrc @@ -0,0 +1,2 @@ +source $(fetchurl https://gitlab.com/rensa-nix/direnv/-/raw/v0.3.0/direnvrc "sha256-u7+KEz684NnIZ+Vh5x5qLrt8rKdnUNexewBoeTcEVHQ=") +use ren //repo/devShells/default diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..933ad69 --- /dev/null +++ b/flake.lock @@ -0,0 +1,63 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1759381078, + "narHash": "sha256-gTrEEp5gEspIcCOx9PD8kMaF1iEmfBcTbO0Jag2QhQs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "7df7ff7d8e00218376575f0acdcc5d66741351ee", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1754184128, + "narHash": "sha256-AjhoyBL4eSyXf01Bmc6DiuaMrJRNdWopmdnMY0Pa/M0=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "02e72200e6d56494f4a7c0da8118760736e41b60", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "ren": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "dir": "lib", + "lastModified": 1758738378, + "narHash": "sha256-NjzqdvQCDDdObEBH8x/vdhbdhrIB+N9E570uCdksGHY=", + "owner": "rensa-nix", + "repo": "core", + "rev": "abe19f9f13aff41de2b63304545c87d193d19ef4", + "type": "gitlab" + }, + "original": { + "dir": "lib", + "owner": "rensa-nix", + "repo": "core", + "type": "gitlab" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "ren": "ren" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..76be494 --- /dev/null +++ b/flake.nix @@ -0,0 +1,22 @@ +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + ren.url = "gitlab:rensa-nix/core?dir=lib"; + }; + + outputs = {ren, ...} @ inputs: + ren.buildWith + { + inherit inputs; + cellsFrom = ./nix; + transformInputs = system: i: + i + // { + pkgs = import i.nixpkgs {inherit system;}; + }; + cellBlocks = with ren.blocks; [ + (simple "devShells") + ]; + } + {}; +} diff --git a/lib/default.nix b/lib/default.nix new file mode 100644 index 0000000..59ed19c --- /dev/null +++ b/lib/default.nix @@ -0,0 +1,5 @@ +args: { + mkSystem = import ./mkSystem.nix args; + mkHome = import ./mkHome.nix args; + mkDisk = import ./mkDisk.nix args; +} diff --git a/lib/flake.nix b/lib/flake.nix new file mode 100644 index 0000000..1bb6f53 --- /dev/null +++ b/lib/flake.nix @@ -0,0 +1,5 @@ +{ + outputs = i: { + lib = import ./.; + }; +} diff --git a/lib/mkDisk.nix b/lib/mkDisk.nix new file mode 100644 index 0000000..28fca66 --- /dev/null +++ b/lib/mkDisk.nix @@ -0,0 +1,32 @@ +{lib}: userConfig: let + inherit (lib) evalModules types assertMsg isAttrs; + + evaled = evalModules { + modules = [ + ./ren-module.nix + userConfig + { + config._module.check = true; + config._module.freeformType = types.unspecified; + } + ]; + }; + + disko = assert assertMsg (isAttrs evaled.config.ren.disko) "disko input unset"; evaled.config.ren.disko; + diskoLib = import "${disko}/lib" {inherit lib;}; + + diskConfig = evalModules { + modules = [ + ./ren-module.nix + userConfig + { + # required since its a type, not a module + freeformType = diskoLib.toplevel; + } + ]; + }; +in { + innerConfig = builtins.removeAttrs diskConfig.config ["ren"]; + inherit (diskConfig) config options; + scripts = diskConfig.config._scripts {inherit (evaled.config.ren) pkgs;}; +} diff --git a/lib/mkHome.nix b/lib/mkHome.nix new file mode 100644 index 0000000..5f7e4dd --- /dev/null +++ b/lib/mkHome.nix @@ -0,0 +1,35 @@ +{lib}: userConfig: let + inherit (lib) evalModules types assertMsg isAttrs toString; + evaled = evalModules { + modules = [ + ./ren-module.nix + userConfig + { + config._module.check = true; + config._module.freeformType = types.unspecified; + } + ]; + }; + + home-manager = assert assertMsg (isAttrs evaled.config.ren.home-manager) "home-manager input unset"; evaled.config.ren.home-manager; + hmLib = import (home-manager + /modules/lib/stdlib-extended.nix) lib; + hmModules = import (home-manager + /modules/modules.nix) { + inherit (evaled.config.ren) pkgs; + lib = hmLib; + check = true; + useNixpkgsModule = false; + }; + + homeConfig = hmLib.evalModules { + specialArgs = { + modulesPath = toString (evaled.config.bee.home + /modules); + }; + modules = [./ren-module.nix userConfig] ++ hmModules; + }; +in { + innerConfig = { + imports = [userConfig ./ren-module.nix]; + }; + inherit (homeConfig) options config; + inherit (homeConfig.config.home) activationPackage; +} diff --git a/lib/mkSystem.nix b/lib/mkSystem.nix new file mode 100644 index 0000000..6f2e3be --- /dev/null +++ b/lib/mkSystem.nix @@ -0,0 +1,77 @@ +{lib}: userConfig: let + inherit (lib) evalModules types assertMsg isAttrs optionals mkDefault; + + evaled = evalModules { + modules = [ + ./ren-module.nix + userConfig + { + config._module.check = true; + config._module.freeformType = types.unspecified; + } + ]; + }; + + isDarwin = evaled.options.ren.nix-darwin.isDefined; + nix-darwin = assert assertMsg (isAttrs evaled.config.ren.nix-darwin) "nix-darwin input unset"; evaled.config.ren.nix-darwin; + + baseModules = [./ren-module.nix userConfig]; + + nixosModules = import (evaled.config.ren.pkgs.path + "/nixos/modules/module-list.nix"); + darwinModules = import (evaled.config.ren.nix-darwin + "/modules/module-list.nix"); + + extraNixosConfig = { + nixpkgs = { + inherit (evaled.config.ren) system pkgs; + }; + imports = + # add home-manager if the input is passed + optionals (evaled.options.ren.home-manager.isDefined) [ + evaled.config.ren.home-manager.nixosModules.home-manager + { + home-manager.useGlobalPkgs = mkDefault true; + home-manager.useUserPackages = mkDefault false; + } + ] + # add nixos-wsl if the input is passed + ++ optionals (evaled.options.ren.nixos-wsl.isDefined) [ + evaled.config.ren.nixos-wsl.nixosModules.wsl + { + wsl.enable = mkDefault true; + } + ] + # add disko if the input is passed + ++ optionals (evaled.options.ren.disko.isDefined) [ + evaled.config.ren.disko.nixosModules.disko + ]; + }; + extraDarwinConfig = { + # add home-manager if the input is passed + imports = optionals (evaled.options.ren.home-manager.isDefined) [ + evaled.config.ren.home-manager.darwinModules.home-manager + { + home-manager.useGlobalPkgs = mkDefault true; + home-manager.useUserPackages = mkDefault false; + } + ]; + }; + + systemConfig = import (evaled.config.ren.pkgs.path + "/nixos/lib/eval-config.nix") { + system = null; + modules = baseModules ++ [extraNixosConfig] ++ nixosModules; + }; + darwinConfig = nix-darwin.lib.darwinSystem { + inherit (evaled.config.ren) system pkgs; + modules = baseModules ++ [extraDarwinConfig] ++ darwinModules; + }; +in + ( + if isDarwin + then darwinConfig + else systemConfig + ) + // { + innerConfig = { + imports = [userConfig ./ren-module.nix]; + }; + } diff --git a/lib/ren-module.nix b/lib/ren-module.nix new file mode 100644 index 0000000..44db0cf --- /dev/null +++ b/lib/ren-module.nix @@ -0,0 +1,50 @@ +{ + config, + lib, + ... +}: let + inherit (lib) mkOption mkOptionType types isAttrs hasAttr; + mkInputOption = description: + mkOption { + type = mkOptionType { + name = "input"; + description = "a flake input"; + check = x: (isAttrs x) && (hasAttr "sourceInfo" x); + }; + description = '' + The flake input for ${description}. + + Example: + ren.home-manager = inputs.home-manager; + ''; + }; +in { + options.ren = { + system = mkOption { + type = types.str; + description = '' + The system architecture (e.g., 'x86_64-linux', 'aarch64-darwin'). + ''; + }; + + home-manager = mkInputOption "Home Manager"; + disko = mkInputOption "Disko"; + nixos-wsl = mkInputOption "NixOS-WSL"; + nix-darwin = mkInputOption "nix-darwin"; + + pkgs = mkOption { + type = mkOptionType { + name = "packages"; + description = "instance of nixpkgs"; + check = x: (isAttrs x) && (hasAttr "path" x); + }; + description = '' + An instantiated nixpkgs set. Used for general pkgs and to get NixOS systems' modules. + ''; + apply = x: + if (hasAttr "${config.ren.system or "unset"}" x) + then x.${config.ren.system} + else x; + }; + }; +} diff --git a/nix/repo/devShells.nix b/nix/repo/devShells.nix new file mode 100644 index 0000000..2eb5c90 --- /dev/null +++ b/nix/repo/devShells.nix @@ -0,0 +1,16 @@ +{inputs, ...}: let + inherit (inputs) pkgs devshell treefmt; +in { + default = devshell.mkShell { + packages = [ + pkgs.nil + (treefmt.mkWrapper pkgs { + programs = { + alejandra.enable = true; + deadnix.enable = true; + mdformat.enable = true; + }; + }) + ]; + }; +} diff --git a/nix/repo/flake.lock b/nix/repo/flake.lock new file mode 100644 index 0000000..a29e62e --- /dev/null +++ b/nix/repo/flake.lock @@ -0,0 +1,45 @@ +{ + "nodes": { + "devshell-lib": { + "locked": { + "dir": "lib", + "lastModified": 1758204313, + "narHash": "sha256-ainbY0Oajb1HMdvy+A8QxF/P5qwcbEzJGEY5pzKdDdc=", + "owner": "rensa-nix", + "repo": "devshell", + "rev": "7d0c4bc78d9f017a739b0c7eb2f4e563118353e6", + "type": "gitlab" + }, + "original": { + "dir": "lib", + "owner": "rensa-nix", + "repo": "devshell", + "type": "gitlab" + } + }, + "root": { + "inputs": { + "devshell-lib": "devshell-lib", + "treefmt-nix": "treefmt-nix" + } + }, + "treefmt-nix": { + "flake": false, + "locked": { + "lastModified": 1758728421, + "narHash": "sha256-ySNJ008muQAds2JemiyrWYbwbG+V7S5wg3ZVKGHSFu8=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "5eda4ee8121f97b218f7cc73f5172098d458f1d1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/nix/repo/flake.nix b/nix/repo/flake.nix new file mode 100644 index 0000000..db3b784 --- /dev/null +++ b/nix/repo/flake.nix @@ -0,0 +1,15 @@ +{ + inputs = { + devshell-lib.url = "gitlab:rensa-nix/devshell?dir=lib"; + treefmt-nix = { + url = "github:numtide/treefmt-nix"; + flake = false; + }; + }; + outputs = i: + i + // { + devshell = i.devshell-lib.lib {inherit (i.parent) pkgs;}; + treefmt = import i.treefmt-nix; + }; +} diff --git a/test/flake.lock b/test/flake.lock new file mode 100644 index 0000000..5084f99 --- /dev/null +++ b/test/flake.lock @@ -0,0 +1,184 @@ +{ + "nodes": { + "disko": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1758287904, + "narHash": "sha256-IGmaEf3Do8o5Cwp1kXBN1wQmZwQN3NLfq5t4nHtVtcU=", + "owner": "nix-community", + "repo": "disko", + "rev": "67ff9807dd148e704baadbd4fd783b54282ca627", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1747046372, + "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1759337100, + "narHash": "sha256-CcT3QvZ74NGfM+lSOILcCEeU+SnqXRvl1XCRHenZ0Us=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "004753ae6b04c4b18aa07192c1106800aaacf6c3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "nix-darwin": { + "inputs": { + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1758805352, + "narHash": "sha256-BHdc43Lkayd+72W/NXRKHzX5AZ+28F3xaUs3a88/Uew=", + "owner": "lnl7", + "repo": "nix-darwin", + "rev": "c48e963a5558eb1c3827d59d21c5193622a1477c", + "type": "github" + }, + "original": { + "owner": "lnl7", + "repo": "nix-darwin", + "type": "github" + } + }, + "nixos-wsl": { + "inputs": { + "flake-compat": "flake-compat", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1759348509, + "narHash": "sha256-at9xMhxMP65JYWlGWYJ412VKbS+tXkTM3f5t9Q8IyMA=", + "owner": "nix-community", + "repo": "nixos-wsl", + "rev": "d96dda76c1f1827634ddf28d386feabd2d135d21", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-wsl", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1752596105, + "narHash": "sha256-lFNVsu/mHLq3q11MuGkMhUUoSXEdQjCHvpReaGP1S2k=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "dab3a6e781554f965bde3def0aa2fda4eb8f1708", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1747728033, + "narHash": "sha256-NnXFQu7g4LnvPIPfJmBuZF7LFy/fey2g2+LCzjQhTUk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "2f9173bde1d3fbf1ad26ff6d52f952f9e9da52ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "disko": "disko", + "home-manager": "home-manager", + "nix-darwin": "nix-darwin", + "nixos-wsl": "nixos-wsl", + "nixpkgs": "nixpkgs_5" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/test/flake.nix b/test/flake.nix new file mode 100644 index 0000000..c3aeb56 --- /dev/null +++ b/test/flake.nix @@ -0,0 +1,115 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + home-manager.url = "github:nix-community/home-manager"; + disko.url = "github:nix-community/disko"; + nixos-wsl.url = "github:nix-community/nixos-wsl"; + nix-darwin.url = "github:lnl7/nix-darwin"; + }; + + outputs = {...} @ inputs: let + lib = import ../lib {inherit (inputs.nixpkgs) lib;}; + pkgs = inputs.nixpkgs.legacyPackages.aarch64-linux; + in rec { + nixosConfigurations = { + "nixos-server" = lib.mkSystem { + ren = { + system = "aarch64-linux"; + inherit pkgs; + inherit (inputs) home-manager disko; + }; + + networking.hostName = "nixos-server"; + users.users."demo" = { + home = "/home/demo"; + isNormalUser = true; + group = "example"; + }; + users.groups."example" = {}; + + disko.devices = pkgs.lib.mkMerge [ + diskoConfigurations.some-disk.innerConfig + ]; + + home-manager = { + useUserPackages = false; + useGlobalPkgs = true; + users.demo = homeConfigurations."demo-standalone".innerConfig; + }; + }; + + "nixos-wsl" = lib.mkSystem { + ren = { + system = "x86_64-linux"; + inherit pkgs; + inherit (inputs) nixos-wsl; + }; + + wsl.defaultUser = "demo"; + }; + }; + + darwinConfigurations = { + "my-macbook" = lib.mkSystem { + ren = { + system = "aarch64-darwin"; + inherit pkgs; + inherit (inputs) nix-darwin; + }; + system.stateVersion = 6; + users.users.demo.home = "/Users/demo"; + }; + }; + + diskoConfigurations = { + "some-disk" = lib.mkDisk { + disk = { + sda = { + device = "/dev/sda"; + type = "disk"; + content = { + type = "gpt"; + partitions = { + boot = { + size = "1M"; + type = "EF02"; + attributes = [0]; + }; + root = { + size = "100%"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/"; + }; + }; + }; + }; + }; + }; + ren = { + inherit pkgs; + inherit (inputs) disko; + }; + }; + }; + + homeConfigurations = { + "demo-standalone" = lib.mkHome { + ren = rec { + system = "x86_64-linux"; + inherit (inputs) home-manager; + pkgs = import inputs.nixpkgs { + inherit system; + config.allowUnfree = true; + }; + }; + home = { + username = "demo"; + homeDirectory = "/home/demo"; + stateVersion = "23.11"; + }; + }; + }; + }; +}