|
| 1 | +# SPDX-License-Identifier: PMPL-1.0-or-later |
| 2 | +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} (hyperpolymath) <{{AUTHOR_EMAIL}}> |
| 3 | +# |
| 4 | +# Nix flake for {{PROJECT_NAME}} |
| 5 | +# |
| 6 | +# NOTE: guix.scm is the PRIMARY development environment. This flake is provided |
| 7 | +# as a FALLBACK for contributors who use Nix instead of Guix. The .envrc checks |
| 8 | +# for Guix first, then falls back to Nix. |
| 9 | +# |
| 10 | +# Usage: |
| 11 | +# nix develop # Enter development shell |
| 12 | +# nix build # Build the project |
| 13 | +# nix flake check # Run checks |
| 14 | +# nix flake show # Show flake outputs |
| 15 | +# |
| 16 | +# With direnv (.envrc already configured): |
| 17 | +# direnv allow # Auto-enters shell on cd |
| 18 | +# |
| 19 | +# TODO: Replace {{PROJECT_NAME}} and {{PROJECT_DESCRIPTION}} with actual values. |
| 20 | + |
| 21 | +{ |
| 22 | + description = "{{PROJECT_NAME}} — RSR-compliant project"; |
| 23 | + |
| 24 | + inputs = { |
| 25 | + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; |
| 26 | + flake-utils.url = "github:numtide/flake-utils"; |
| 27 | + }; |
| 28 | + |
| 29 | + outputs = { self, nixpkgs, flake-utils }: |
| 30 | + flake-utils.lib.eachSystem [ "x86_64-linux" "aarch64-linux" ] (system: |
| 31 | + let |
| 32 | + pkgs = import nixpkgs { inherit system; }; |
| 33 | + |
| 34 | + # Common development tools present in every RSR project. |
| 35 | + commonTools = with pkgs; [ |
| 36 | + git |
| 37 | + just |
| 38 | + nickel |
| 39 | + curl |
| 40 | + bash |
| 41 | + coreutils |
| 42 | + ]; |
| 43 | + |
| 44 | + # --------------------------------------------------------------- |
| 45 | + # Language-specific packages: uncomment the stacks you need. |
| 46 | + # --------------------------------------------------------------- |
| 47 | + # |
| 48 | + # Rust: |
| 49 | + # rustc cargo clippy rustfmt rust-analyzer |
| 50 | + # |
| 51 | + # Elixir: |
| 52 | + # elixir erlang |
| 53 | + # |
| 54 | + # Gleam: |
| 55 | + # gleam erlang |
| 56 | + # |
| 57 | + # Zig: |
| 58 | + # zig zls |
| 59 | + # |
| 60 | + # Haskell: |
| 61 | + # ghc cabal-install haskell-language-server |
| 62 | + # |
| 63 | + # Idris2: |
| 64 | + # idris2 |
| 65 | + # |
| 66 | + # OCaml: |
| 67 | + # ocaml dune_3 ocaml-lsp |
| 68 | + # |
| 69 | + # ReScript (via Deno): |
| 70 | + # deno |
| 71 | + # |
| 72 | + # Julia: |
| 73 | + # julia |
| 74 | + # |
| 75 | + # Ada/SPARK: |
| 76 | + # gnat gprbuild |
| 77 | + # |
| 78 | + # --------------------------------------------------------------- |
| 79 | + languageTools = with pkgs; [ |
| 80 | + # TODO: Uncomment or add packages for your stack. |
| 81 | + # Example for a Rust project: |
| 82 | + # rustc |
| 83 | + # cargo |
| 84 | + # clippy |
| 85 | + # rustfmt |
| 86 | + # rust-analyzer |
| 87 | + ]; |
| 88 | + |
| 89 | + in |
| 90 | + { |
| 91 | + # --------------------------------------------------------------- |
| 92 | + # Development shell — `nix develop` |
| 93 | + # --------------------------------------------------------------- |
| 94 | + devShells.default = pkgs.mkShell { |
| 95 | + name = "{{PROJECT_NAME}}-dev"; |
| 96 | + |
| 97 | + buildInputs = commonTools ++ languageTools; |
| 98 | + |
| 99 | + # Environment variables available inside the shell. |
| 100 | + env = { |
| 101 | + PROJECT_NAME = "{{PROJECT_NAME}}"; |
| 102 | + RSR_TIER = "infrastructure"; |
| 103 | + }; |
| 104 | + |
| 105 | + shellHook = '' |
| 106 | + echo "" |
| 107 | + echo " {{PROJECT_NAME}} — development shell" |
| 108 | + echo " Nix: $(nix --version 2>/dev/null || echo 'unknown')" |
| 109 | + echo " Just: $(just --version 2>/dev/null || echo 'not found')" |
| 110 | + echo "" |
| 111 | + echo " Run 'just' to see available recipes." |
| 112 | + echo "" |
| 113 | +
|
| 114 | + # Source .envrc manually when direnv is not managing the shell. |
| 115 | + # This keeps project env vars (PROJECT_NAME, DATABASE_URL, etc.) |
| 116 | + # consistent whether you enter via 'nix develop' or 'direnv allow'. |
| 117 | + if [ -z "''${DIRENV_IN_ENVRC:-}" ] && [ -f .envrc ]; then |
| 118 | + # Only source the non-nix parts to avoid recursion. |
| 119 | + export PROJECT_NAME="{{PROJECT_NAME}}" |
| 120 | + export RSR_TIER="infrastructure" |
| 121 | + if [ -f .env ]; then |
| 122 | + set -a |
| 123 | + . .env |
| 124 | + set +a |
| 125 | + fi |
| 126 | + fi |
| 127 | + ''; |
| 128 | + }; |
| 129 | + |
| 130 | + # --------------------------------------------------------------- |
| 131 | + # Package — `nix build` |
| 132 | + # --------------------------------------------------------------- |
| 133 | + packages.default = pkgs.stdenv.mkDerivation { |
| 134 | + pname = "{{PROJECT_NAME}}"; |
| 135 | + version = "0.1.0"; |
| 136 | + |
| 137 | + src = self; |
| 138 | + |
| 139 | + # TODO: Replace with real build instructions. |
| 140 | + # Examples: |
| 141 | + # |
| 142 | + # Rust (use rustPlatform.buildRustPackage instead of stdenv): |
| 143 | + # packages.default = pkgs.rustPlatform.buildRustPackage { ... }; |
| 144 | + # |
| 145 | + # Elixir (use mixRelease): |
| 146 | + # packages.default = pkgs.beamPackages.mixRelease { ... }; |
| 147 | + # |
| 148 | + # Zig: |
| 149 | + # buildPhase = "zig build -Doptimize=ReleaseSafe"; |
| 150 | + |
| 151 | + buildPhase = '' |
| 152 | + echo "TODO: Add build commands for {{PROJECT_NAME}}" |
| 153 | + ''; |
| 154 | + |
| 155 | + installPhase = '' |
| 156 | + mkdir -p $out/share/doc |
| 157 | + cp README.adoc $out/share/doc/ 2>/dev/null || true |
| 158 | + ''; |
| 159 | + |
| 160 | + meta = with pkgs.lib; { |
| 161 | + description = "{{PROJECT_DESCRIPTION}}"; |
| 162 | + homepage = "https://github.com/hyperpolymath/{{PROJECT_NAME}}"; |
| 163 | + license = licenses.mpl20; # PMPL-1.0-or-later extends MPL-2.0 |
| 164 | + maintainers = []; |
| 165 | + platforms = [ "x86_64-linux" "aarch64-linux" ]; |
| 166 | + }; |
| 167 | + }; |
| 168 | + } |
| 169 | + ); |
| 170 | +} |
0 commit comments