diff --git a/flake.nix b/flake.nix index 05ffad2..2318aa0 100644 --- a/flake.nix +++ b/flake.nix @@ -18,6 +18,17 @@ formatter = (import nixpkgs {inherit system;}).alejandra; }) // { + templates = let + system-flake = { + path = ./templates/system-flake; + description = "Opinionated flake for a NixOS system with Home Manager"; + }; + in { + inherit system-flake; + + default = system-flake; + }; + overlays = let overlay = mapOverlayOverride "trivium" (import ./pkgs); in { diff --git a/templates/system-flake/.gitignore b/templates/system-flake/.gitignore new file mode 100644 index 0000000..21f979d --- /dev/null +++ b/templates/system-flake/.gitignore @@ -0,0 +1,3 @@ +!**/.keep +result +flake.lock diff --git a/templates/system-flake/flake.nix b/templates/system-flake/flake.nix new file mode 100644 index 0000000..7b4ec56 --- /dev/null +++ b/templates/system-flake/flake.nix @@ -0,0 +1,34 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; + unstable.url = "github:nixos/nixpkgs/nixos-unstable"; + + home-manager = { + url = "github:nix-community/home-manager/release-24.11"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + trivium = { + url = "git+https://git.posixlycorrect.com/deepState/trivionomicon.git"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = flakes @ { + self, + nixpkgs, + unstable, + home-manager, + trivium, + }: + trivium.lib.mkSystemFlake { + system = "x86_64-linux"; + inherit flakes; + + localOverlayPath = ./pkgs; + nixpkgsConfigPath = ./pkgs/config; + + hmSourcePath = ./home; + nixosSourcePath = ./sys; + }; +} diff --git a/templates/system-flake/home/default.nix b/templates/system-flake/home/default.nix new file mode 100644 index 0000000..49439c7 --- /dev/null +++ b/templates/system-flake/home/default.nix @@ -0,0 +1,73 @@ +{ + config, + pkgs, + ... +}: { + # This value determines the Home Manager release that your configuration is + # compatible with. This helps avoid breakage when a new Home Manager release + # introduces backwards incompatible changes. + # + # You should not change this value, even if you update Home Manager. If you do + # want to update the value, then make sure to first check the Home Manager + # release notes. + home.stateVersion = "24.11"; # Please read the comment before changing. + + # The home.packages option allows you to install Nix packages into your + # environment. + home.packages = [ + # # Adds the 'hello' command to your environment. It prints a friendly + # # "Hello, world!" when run. + # pkgs.hello + + # # It is sometimes useful to fine-tune packages, for example, by applying + # # overrides. You can do that directly here, just don't forget the + # # parentheses. Maybe you want to install Nerd Fonts with a limited number of + # # fonts? + # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; }) + + # # You can also create simple shell scripts directly inside your + # # configuration. For example, this adds a command 'my-hello' to your + # # environment: + # (pkgs.writeShellScriptBin "my-hello" '' + # echo "Hello, ${config.home.username}!" + # '') + ]; + + # Home Manager is pretty good at managing dotfiles. The primary way to manage + # plain files is through 'home.file'. + home.file = { + # # Building this configuration will create a copy of 'dotfiles/screenrc' in + # # the Nix store. Activating the configuration will then make '~/.screenrc' a + # # symlink to the Nix store copy. + # ".screenrc".source = dotfiles/screenrc; + + # # You can also set the file content immediately. + # ".gradle/gradle.properties".text = '' + # org.gradle.console=verbose + # org.gradle.daemon.idletimeout=3600000 + # ''; + }; + + # Home Manager can also manage your environment variables through + # 'home.sessionVariables'. These will be explicitly sourced when using a + # shell provided by Home Manager. If you don't want to manage your shell + # through Home Manager then you have to manually source 'hm-session-vars.sh' + # located at either + # + # ~/.nix-profile/etc/profile.d/hm-session-vars.sh + # + # or + # + # ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh + # + # or + # + # /etc/profiles/per-user//etc/profile.d/hm-session-vars.sh + # + home.sessionVariables = { + # EDITOR = "emacs"; + }; + + # Let Home Manager install and manage itself. + programs.home-manager.enable = true; +} diff --git a/templates/system-flake/home/platform/me@foo/default.nix b/templates/system-flake/home/platform/me@foo/default.nix new file mode 100644 index 0000000..6481e85 --- /dev/null +++ b/templates/system-flake/home/platform/me@foo/default.nix @@ -0,0 +1,10 @@ +{ + config, + pkgs, + ... +}: { + # Home Manager needs a bit of information about you and the paths it should + # manage. + home.username = "ale"; + home.homeDirectory = "/home/ale"; +} diff --git a/templates/system-flake/pkgs/config/default.nix b/templates/system-flake/pkgs/config/default.nix new file mode 100644 index 0000000..395d35d --- /dev/null +++ b/templates/system-flake/pkgs/config/default.nix @@ -0,0 +1,5 @@ +lib: +with lib; { + android_sdk.accept_license = true; + allowUnfreePredicate = pkg: import ./unfree.nix lib (getName pkg); +} diff --git a/templates/system-flake/pkgs/config/unfree.nix b/templates/system-flake/pkgs/config/unfree.nix new file mode 100644 index 0000000..deda971 --- /dev/null +++ b/templates/system-flake/pkgs/config/unfree.nix @@ -0,0 +1,7 @@ +lib: name: +with lib; + elem name [ + "libproprietary-v3" + "closed-source-pkg" + "favorite-abandonware" + ] diff --git a/templates/system-flake/pkgs/default.nix b/templates/system-flake/pkgs/default.nix new file mode 100644 index 0000000..78a86d4 --- /dev/null +++ b/templates/system-flake/pkgs/default.nix @@ -0,0 +1,12 @@ +final: prev: +with prev.lib; let + inherit (final) callPackage fetchpatch; +in { + lib = callPackage ./lib {}; + + hello-world = callPackage ./hello-world {}; + + override = { + sl = prev.sl.overrideAttrs {pname = "my-sl";}; + }; +} diff --git a/templates/system-flake/pkgs/hello-world/Makefile b/templates/system-flake/pkgs/hello-world/Makefile new file mode 100644 index 0000000..4eef056 --- /dev/null +++ b/templates/system-flake/pkgs/hello-world/Makefile @@ -0,0 +1,6 @@ +CFLAGS += -O3 -s + +all: hello-world + +%: %.c + $(CC) $(CFLAGS) -o $@ $< diff --git a/templates/system-flake/pkgs/hello-world/default.nix b/templates/system-flake/pkgs/hello-world/default.nix new file mode 100644 index 0000000..19047a1 --- /dev/null +++ b/templates/system-flake/pkgs/hello-world/default.nix @@ -0,0 +1,14 @@ +{stdenv, ...}: +stdenv.mkDerivation { + name = "hello-world"; + version = "1.0.0"; + + src = ./.; + + installPhase = '' + mkdir -p $out/bin + cp hello-world $out/bin + ''; + + meta.mainProgram = "hello-world"; +} diff --git a/templates/system-flake/pkgs/hello-world/hello-world.c b/templates/system-flake/pkgs/hello-world/hello-world.c new file mode 100644 index 0000000..d6cfa6b --- /dev/null +++ b/templates/system-flake/pkgs/hello-world/hello-world.c @@ -0,0 +1,7 @@ +#include + +int main() +{ + printf("Hello, world!\n"); + return 0; +} diff --git a/templates/system-flake/pkgs/lib/default.nix b/templates/system-flake/pkgs/lib/default.nix new file mode 100644 index 0000000..ab54163 --- /dev/null +++ b/templates/system-flake/pkgs/lib/default.nix @@ -0,0 +1,3 @@ +{callPackage}: { + fibonacci = callPackage ./fibonacci.nix {}; +} diff --git a/templates/system-flake/pkgs/lib/fibonacci.nix b/templates/system-flake/pkgs/lib/fibonacci.nix new file mode 100644 index 0000000..a12576b --- /dev/null +++ b/templates/system-flake/pkgs/lib/fibonacci.nix @@ -0,0 +1,7 @@ +let + fib = n: + if n > 1 + then fib (n - 1) + fib (n - 2) + else 1; +in + fib diff --git a/templates/system-flake/sys/default.nix b/templates/system-flake/sys/default.nix new file mode 100644 index 0000000..fa0f994 --- /dev/null +++ b/templates/system-flake/sys/default.nix @@ -0,0 +1,14 @@ +{pkgs, ...}: { + # Let 'nixos-version --json' know about the Git revision + # of this flake. + system.configurationRevision = nixpkgs.lib.mkIf (self ? rev) self.rev; + + # Network configuration. + networking.firewall.allowedTCPPorts = [80]; + + # Enable a web server. + services.httpd = { + enable = true; + adminAddr = "morty@example.org"; + }; +} diff --git a/templates/system-flake/sys/platform/foo/default.nix b/templates/system-flake/sys/platform/foo/default.nix new file mode 100644 index 0000000..ef84269 --- /dev/null +++ b/templates/system-flake/sys/platform/foo/default.nix @@ -0,0 +1,6 @@ +{pkgs, ...}: { + boot.isContainer = true; + + # Network configuration. + networking.useDHCP = false; +}