From f302c553b3ffa99bafa12cf1e1a4a805498c508b Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Tue, 22 Sep 2026 22:59:08 +0000 Subject: [PATCH] Add a devenv dev shell via nix-gradle-wrapper devenv.nix/devenv.yaml/devenv.lock provide the reproducible environment the build needs (run Gradle as `devenv shell -- ./gradlew ...`): - nix-gradle-wrapper (github.com/devinrsmith/nix-gradle-wrapper, a non-flake input) vendors the exact Gradle distribution pinned in gradle/wrapper/gradle-wrapper.properties. Its isolatedHomeHook gives the shell an isolated GRADLE_USER_HOME with toolchain auto-detect and auto-download disabled (and manages GRADLE_ENCRYPTION_KEY itself, so the Configuration Cache keystore works against its symlinked caches); warmupHook pre-starts the daemon. - extraJdkHomes registers every toolchain the build uses: JDK 8 (base source set), 11 (java11 override), and 17/21/25 (the extra test runtimes). javaHome pins the Gradle daemon itself to JDK 25. jdkHome resolves the Darwin bundle layout as well as Linux. - perWorkerMemBytes is lowered to 512 MiB so the wrapper's worker count doesn't collapse to 1 on small machines for this tiny project. .gitignore ignores .devenv, the state directory devenv creates in the project root. --- .gitignore | 1 + devenv.lock | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++ devenv.nix | 57 +++++++++++++++++++++++++++++++++++++ devenv.yaml | 6 ++++ 4 files changed, 146 insertions(+) create mode 100644 devenv.lock create mode 100644 devenv.nix create mode 100644 devenv.yaml diff --git a/.gitignore b/.gitignore index 1cbbf2c..87043e6 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ build .kotlin .idea +.devenv diff --git a/devenv.lock b/devenv.lock new file mode 100644 index 0000000..b817c4f --- /dev/null +++ b/devenv.lock @@ -0,0 +1,82 @@ +{ + "nodes": { + "devenv": { + "locked": { + "dir": "src/modules", + "lastModified": 1789991752, + "narHash": "sha256-SiH+H00IutELZBg7BBNo6r5DU6E+DG7DjrbeX5+QLa0=", + "owner": "cachix", + "repo": "devenv", + "rev": "1c57b5dea0d400af97053fdd1a536fca17378f73", + "type": "github" + }, + "original": { + "dir": "src/modules", + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "nix-gradle-wrapper": { + "flake": false, + "locked": { + "lastModified": 1790095744, + "narHash": "sha256-hzVOn9BrB1fbjQ32bbNIPal0yiTb6C46ZZaz4FsFgOU=", + "owner": "devinrsmith", + "repo": "nix-gradle-wrapper", + "rev": "bdaa336f22df5501834ab4e4d359a2c0dca63167", + "type": "github" + }, + "original": { + "owner": "devinrsmith", + "repo": "nix-gradle-wrapper", + "type": "github" + } + }, + "nixpkgs": { + "inputs": { + "nixpkgs-src": "nixpkgs-src" + }, + "locked": { + "lastModified": 1789506231, + "narHash": "sha256-vNkJbtmqyBfFhn/HnzQo4ROuoyYWuy/allqTfJb4kMY=", + "owner": "cachix", + "repo": "devenv-nixpkgs", + "rev": "c2f38fe7f9e04d9aadd354d380f2bd40531d9737", + "type": "github" + }, + "original": { + "owner": "cachix", + "ref": "rolling", + "repo": "devenv-nixpkgs", + "type": "github" + } + }, + "nixpkgs-src": { + "flake": false, + "locked": { + "lastModified": 1789370336, + "narHash": "sha256-6RSEDHIWQtesQKWSu5qRai8L2h4KgCgMEfJHstW99G4=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c7def046b9a883d46974757852106483d741586f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": "devenv", + "nix-gradle-wrapper": "nix-gradle-wrapper", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} \ No newline at end of file diff --git a/devenv.nix b/devenv.nix new file mode 100644 index 0000000..b1db0a2 --- /dev/null +++ b/devenv.nix @@ -0,0 +1,57 @@ +{ pkgs, inputs, ... }: +let + # seqlock/build.gradle.kts's multiRelease { targetVersions(8, 11) } (the + # me.champeau.mrjar plugin) needs both a Java 8 and a Java 11 toolchain -- + # the base source set plus the java11 override/java11Test source sets. + # gradle-wrapper.nix's isolatedHomeHook disables Gradle's own toolchain + # auto-detect/auto-download, so all of these have to be registered + # explicitly via extraJdkHomes below rather than relying on scanning. + jdk8 = pkgs.jdk8; + jdk11 = pkgs.jdk11; + + # One of the extra LTS runtimes build.gradle.kts's java17/21/25Test tasks + # exercise the java11 override classes against (see there) -- otherwise + # unrelated to running Gradle itself, unlike jdk25 below. + jdk17 = pkgs.jdk17; + jdk21 = pkgs.jdk21; + + # Runs the Gradle 9 wrapper/daemon itself (Java Compatibility table: + # https://docs.gradle.org/current/userguide/compatibility.html -- Java 25 + # supported for running Gradle since 9.1.0, we're on 9.7.1), independent of + # whatever JDK version(s) the project's own toolchains target. Also one of + # the extra LTS runtimes build.gradle.kts's java17/21/25Test tasks exercise + # the java11 override classes against. + jdk25 = pkgs.jdk25; + + # On Linux a JDK package's .home is already the toolchain-detectable home; + # on Darwin, nixpkgs' JDK outputs are a symlink farm and the real home is + # nested at ${pkg.bundle}/Contents/Home (per nix-gradle-wrapper's own + # README -- passing the top-level .home there lists the same JDK twice). + jdkHome = pkg: if pkg ? bundle then "${pkg.bundle}/Contents/Home" else pkg.home; + + gradleWrapper = import "${inputs.nix-gradle-wrapper}/gradle-wrapper.nix" { + inherit pkgs; + wrapperPropertiesFile = ./gradle/wrapper/gradle-wrapper.properties; + name = "seqlock"; + # This is a tiny single-module library (no per-task -Xmx override in + # seqlock/build.gradle.kts), so the 4 GiB default per-worker assumption + # is a big overestimate -- it collapses org.gradle.workers.max to 1 on + # an 8 GiB machine. 512 MiB is generous for this project's tests/compile. + perWorkerMemBytes = 512 * 1024 * 1024; + extraJdkHomes = [ (jdkHome jdk8) (jdkHome jdk11) (jdkHome jdk17) (jdkHome jdk21) (jdkHome jdk25) ]; + # Pins the daemon JVM explicitly (org.gradle.java.home) instead of + # relying on languages.java.jdk.package below having put jdk25 first on + # JAVA_HOME/PATH by the time ./gradlew starts the daemon. + javaHome = jdkHome jdk25; + }; +in +{ + languages.java.enable = true; + languages.java.jdk.package = jdk25; + + packages = gradleWrapper.extraBuildInputs ++ [ jdk8 jdk11 jdk17 jdk21 ]; + + enterShell = gradleWrapper.isolatedHomeHook + gradleWrapper.warmupHook + '' + echo "seqlock dev shell ready" + ''; +} diff --git a/devenv.yaml b/devenv.yaml new file mode 100644 index 0000000..7074ae7 --- /dev/null +++ b/devenv.yaml @@ -0,0 +1,6 @@ +inputs: + nixpkgs: + url: github:cachix/devenv-nixpkgs/rolling + nix-gradle-wrapper: + url: github:devinrsmith/nix-gradle-wrapper + flake: false