1{2 description = "Jrsonnet";3 inputs = {4 nixpkgs.url = "github:nixos/nixpkgs/release-25.11";5 fenix = {6 url = "github:CertainLach/fenix/fix/libatomic";7 inputs.nixpkgs.follows = "nixpkgs";8 };9 flake-parts = {10 url = "github:hercules-ci/flake-parts";11 inputs.nixpkgs-lib.follows = "nixpkgs";12 };13 hercules-ci-effects = {14 url = "github:hercules-ci/hercules-ci-effects";15 inputs.flake-parts.follows = "flake-parts";16 inputs.nixpkgs.follows = "nixpkgs";17 };18 treefmt-nix = {19 url = "github:numtide/treefmt-nix";20 inputs.nixpkgs.follows = "nixpkgs";21 };22 crane.url = "github:ipetkov/crane";23 shelly.url = "github:CertainLach/shelly";2425 cpp-jsonnet-for-tests = {26 url = "github:google/jsonnet";27 flake = false;28 };29 go-jsonnet-for-tests = {30 url = "github:google/go-jsonnet";31 flake = false;32 };33 };34 outputs =35 inputs:36 let37 inherit (inputs.nixpkgs.lib)38 mkIf39 mkForce40 optionals41 optionalAttrs42 ;43 in44 inputs.flake-parts.lib.mkFlake { inherit inputs; } {45 imports = [46 inputs.shelly.flakeModule47 inputs.hercules-ci-effects.flakeModule48 ];49 systems = [50 "x86_64-linux"51 "i686-linux"52 "aarch64-linux"53 "armv7l-linux"54 "aarch64-darwin"55 ];56 perSystem =57 {58 config,59 self',60 system,61 ...62 }:63 let64 pkgs = import inputs.nixpkgs {65 inherit system;66 overlays = [ inputs.fenix.overlays.default ];67 config.allowUnsupportedSystem = true;68 config.allowUnfreePredicate = pkg: pkg.name == "Xcode.app";69 };70 targetArch = pkgs.stdenv.hostPlatform.parsed.cpu.name;71 rustfmt = (pkgs.fenix.complete or pkgs.fenix.stable).rustfmt;72 toolchain = pkgs.fenix.combine [73 (pkgs.fenix.stable.withComponents [74 "cargo"75 "clippy"76 "rustc"77 "rustfmt"78 ])79 pkgs.fenix.targets.wasm32-unknown-unknown.stable.rust-std80 ];81 devToolchain = pkgs.fenix.combine [82 ((pkgs.fenix.complete or pkgs.fenix.stable).withComponents [83 "cargo"84 "clippy"85 "rustc"86 "rust-src"87 "rustfmt"88 "rust-analyzer"89 ])90 pkgs.fenix.targets.wasm32-unknown-unknown.latest.rust-std91 ];92 craneLib = (inputs.crane.mkLib pkgs).overrideToolchain toolchain;93 craneLibDev = (inputs.crane.mkLib pkgs).overrideToolchain devToolchain;94 treefmt =95 (inputs.treefmt-nix.lib.evalModule pkgs (import ./treefmt.nix { inherit rustfmt; })).config.build;9697 98 crossToolchain = pkgs.fenix.combine [99 (pkgs.fenix.stable.withComponents [100 "cargo"101 "rustc"102 ])103 pkgs.fenix.targets."${targetArch}-unknown-linux-musl".stable.rust-std104 pkgs.fenix.targets."${targetArch}-apple-darwin".stable.rust-std105 ];106 craneLibCross = (inputs.crane.mkLib pkgs).overrideToolchain crossToolchain;107108 109 pkgsWindows = import inputs.nixpkgs {110 overlays = [ inputs.fenix.overlays.default ];111 localSystem = system;112 crossSystem = {113 config = "${targetArch}-w64-mingw32";114 libc = "msvcrt";115 };116 };117 windowsToolchain = pkgs.fenix.combine [118 (pkgs.fenix.stable.withComponents [119 "cargo"120 "rustc"121 ])122 pkgs.fenix.targets."${targetArch}-pc-windows-gnu".stable.rust-std123 ];124 craneLibWindows = (inputs.crane.mkLib pkgsWindows).overrideToolchain (_: windowsToolchain);125126 in127 {128 legacyPackages = {129 release = optionalAttrs pkgs.stdenv.hostPlatform.isLinux (130 {131 jrsonnet-linux-glibc = self'.packages.jrsonnet;132 jrsonnet-experimental-linux-glibc = self'.packages.jrsonnet-experimental;133 }134 // optionalAttrs pkgs.stdenv.hostPlatform.is64bit rec {135 jrsonnet-linux-musl = pkgs.callPackage ./nix/jrsonnet-cross-musl.nix {136 craneLib = craneLibCross;137 targetTriple = "${targetArch}-unknown-linux-musl";138 muslCC = pkgs.pkgsMusl.stdenv.cc;139 };140 jrsonnet-experimental-linux-musl = jrsonnet-linux-musl.override {141 withExperimentalFeatures = true;142 };143 }144 // optionalAttrs (targetArch == "aarch64") rec {145 jrsonnet-darwin = pkgs.callPackage ./nix/jrsonnet-cross-darwin.nix {146 craneLib = craneLibCross;147 targetTriple = "${targetArch}-apple-darwin";148 };149 jrsonnet-experimental-darwin = jrsonnet-darwin.override {150 withExperimentalFeatures = true;151 };152 }153 // optionalAttrs (targetArch == "x86_64") rec {154 jrsonnet-windows = pkgsWindows.callPackage ./nix/jrsonnet-cross-windows.nix {155 craneLib = craneLibWindows;156 targetTriple = "${targetArch}-pc-windows-gnu";157 };158 jrsonnet-experimental-windows = jrsonnet-windows.override {159 withExperimentalFeatures = true;160 };161 }162 );163 benchmarks = optionalAttrs (system == "x86_64-linux" || system == "aarch64-linux") {164 default = pkgs.callPackage ./nix/benchmarks.nix {165 inherit (config.legacyPackages.jsonnetImpls)166 go-jsonnet167 sjsonnet168 cpp-jsonnet169 rsjsonnet170 ;171 jrsonnetVariants = [172 {173 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };174 name = "";175 }176 ];177 };178 quick = pkgs.callPackage ./nix/benchmarks.nix {179 inherit (config.legacyPackages.jsonnetImpls)180 go-jsonnet181 sjsonnet182 cpp-jsonnet183 rsjsonnet184 ;185 quick = true;186 jrsonnetVariants = [187 {188 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };189 name = "";190 }191 ];192 };193 against-release = pkgs.callPackage ./nix/benchmarks.nix {194 inherit (config.legacyPackages.jsonnetImpls)195 go-jsonnet196 sjsonnet197 cpp-jsonnet198 rsjsonnet199 ;200 jrsonnetVariants = [201 {202 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };203 name = "current";204 }205 {206 drv = self'.packages.jrsonnet-experimental.override { forBenchmarks = true; };207 name = "current-experimental";208 }209 {210 drv = self'.legacyPackages.jsonnetImpls.jrsonnet-release.override { forBenchmarks = true; };211 name = "release";212 }213 ];214 };215 quick-against-release = pkgs.callPackage ./nix/benchmarks.nix {216 inherit (config.legacyPackages.jsonnetImpls)217 go-jsonnet218 sjsonnet219 cpp-jsonnet220 rsjsonnet221 ;222 quick = true;223 jrsonnetVariants = [224 {225 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };226 name = "current";227 }228 {229 drv = self'.packages.jrsonnet-experimental.override { forBenchmarks = true; };230 name = "current-experimental";231 }232 {233 drv = self'.legacyPackages.jsonnetImpls.jrsonnet-release.override { forBenchmarks = true; };234 name = "release";235 }236 ];237 };238 };239 jsonnetImpls = {240 go-jsonnet = pkgs.callPackage ./nix/go-jsonnet.nix { };241 sjsonnet = pkgs.callPackage ./nix/sjsonnet.nix { };242 cpp-jsonnet = pkgs.callPackage ./nix/cpp-jsonnet.nix { };243 244 245 rsjsonnet = pkgs.callPackage ./nix/rsjsonnet.nix { };246 247 jrsonnet-release = pkgs.callPackage ./nix/jrsonnet-release.nix {248 rustPlatform = pkgs.makeRustPlatform {249 rustc = toolchain;250 cargo = toolchain;251 };252 };253 };254 };255 packages =256 let257 jrsonnet = pkgs.callPackage ./nix/jrsonnet.nix {258 inherit craneLib;259 inherit (inputs) cpp-jsonnet-for-tests go-jsonnet-for-tests;260 };261 jrsonnet-experimental = pkgs.callPackage ./nix/jrsonnet.nix {262 inherit craneLib;263 inherit (inputs) cpp-jsonnet-for-tests go-jsonnet-for-tests;264 withExperimentalFeatures = true;265 };266 in267 {268 default = jrsonnet;269 inherit jrsonnet jrsonnet-experimental;270 };271 checks = optionalAttrs (system != "armv7l-linux") {272 formatting = treefmt.check inputs.self;273 };274 formatter = mkIf (system != "armv7l-linux") treefmt.wrapper;275 shelly.shells.default = {276 factory = craneLibDev.devShell;277 packages =278 with pkgs;279 [280 cargo-edit281 cargo-outdated282 cargo-watch283 cargo-insta284 cargo-hack285 cargo-show-asm286 lld287 hyperfine288 graphviz289 ]290 ++ optionals (!stdenv.isDarwin) [291 valgrind292 kdePackages.kcachegrind293 samply294 ];295 environment = {296 CPP_JSONNET_FOR_TESTS = inputs.cpp-jsonnet-for-tests;297 GO_JSONNET_FOR_TESTS = inputs.go-jsonnet-for-tests;298 };299 };300 shelly.shells.impls = {301 packages =302 (with self'.legacyPackages.jsonnetImpls; [303 cpp-jsonnet304 go-jsonnet305 rsjsonnet306 sjsonnet307 ])308 ++ (with self'.packages; [309 jrsonnet310 ]);311 };312 };313 hercules-ci.github-releases.files =314 let315 rel = system: inputs.self.legacyPackages.${system}.release;316 bin = drv: "${drv}/bin/jrsonnet";317 exe = drv: "${drv}/bin/jrsonnet.exe";318 in319 [320 {321 label = "jrsonnet-x86_64-linux-musl";322 path = bin (rel "x86_64-linux").jrsonnet-linux-musl;323 }324 {325 label = "jrsonnet-experimental-x86_64-linux-musl";326 path = bin (rel "x86_64-linux").jrsonnet-experimental-linux-musl;327 }328 {329 label = "jrsonnet-aarch64-darwin";330 path = bin (rel "aarch64-linux").jrsonnet-darwin;331 }332 {333 label = "jrsonnet-experimental-aarch64-darwin";334 path = bin (rel "aarch64-linux").jrsonnet-experimental-darwin;335 }336 {337 label = "jrsonnet-x86_64-windows.exe";338 path = exe (rel "x86_64-linux").jrsonnet-windows;339 }340 {341 label = "jrsonnet-experimental-x86_64-windows.exe";342 path = exe (rel "x86_64-linux").jrsonnet-experimental-windows;343 }344345 {346 label = "jrsonnet-aarch64-linux-musl";347 path = bin (rel "aarch64-linux").jrsonnet-linux-musl;348 }349 {350 label = "jrsonnet-experimental-aarch64-linux-musl";351 path = bin (rel "aarch64-linux").jrsonnet-experimental-linux-musl;352 }353354 {355 label = "jrsonnet-x86_64-linux-glibc";356 path = bin (rel "x86_64-linux").jrsonnet-linux-glibc;357 }358 {359 label = "jrsonnet-experimental-x86_64-linux-glibc";360 path = bin (rel "x86_64-linux").jrsonnet-experimental-linux-glibc;361 }362 {363 label = "jrsonnet-aarch64-linux-glibc";364 path = bin (rel "aarch64-linux").jrsonnet-linux-glibc;365 }366 {367 label = "jrsonnet-experimental-aarch64-linux-glibc";368 path = bin (rel "aarch64-linux").jrsonnet-experimental-linux-glibc;369 }370 {371 label = "jrsonnet-i686-linux-glibc";372 path = bin (rel "i686-linux").jrsonnet-linux-glibc;373 }374 {375 label = "jrsonnet-experimental-i686-linux-glibc";376 path = bin (rel "i686-linux").jrsonnet-experimental-linux-glibc;377 }378 {379 label = "jrsonnet-armv7l-linux-glibc";380 path = bin (rel "armv7l-linux").jrsonnet-linux-glibc;381 }382 {383 label = "jrsonnet-experimental-armv7l-linux-glibc";384 path = bin (rel "armv7l-linux").jrsonnet-experimental-linux-glibc;385 }386 ];387 hercules-ci.cargo-publish = {388 enable = true;389 secretName = "crates-io";390 extraPublishArgs = [ "--workspace" ];391 assertVersions = true;392 };393 hercules-ci.flake-update = {394 enable = true;395 baseMerge.enable = true;396 baseMerge.method = "fast-forward";397 when = {398 dayOfWeek = [ "Sat" ];399 };400 };401 herculesCI =402 { lib, config, ... }:403 {404 ciSystems = [405 "x86_64-linux"406 "i686-linux"407 "aarch64-linux"408 "armv7l-linux"409 410 411 ];412 onPush.default.outputs = {413 benchmarks.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.benchmarks.default;414415 416 release.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.release;417 release.aarch64-linux = inputs.self.legacyPackages.aarch64-linux.release;418 release.armv7l-linux = inputs.self.legacyPackages.armv7l-linux.release;419 release.i686-linux = inputs.self.legacyPackages.i686-linux.release;420421 422 devShells = mkForce { };423 formatter = mkForce { };424425 426 checks.i686-linux.formatting = mkForce { };427 checks.aarch64-linux.formatting = mkForce { };428 };429 };430 };431}