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:CertainLach/crane/refactor/drop-remarshal";23 shelly.url = "github:CertainLach/shelly";24 };25 outputs =26 inputs:27 let28 inherit (inputs.nixpkgs.lib)29 mkIf30 mkForce31 optionals32 optionalAttrs33 ;34 in35 inputs.flake-parts.lib.mkFlake { inherit inputs; } {36 imports = [37 inputs.shelly.flakeModule38 inputs.hercules-ci-effects.flakeModule39 ];40 systems = [41 "x86_64-linux"42 "i686-linux"43 "aarch64-linux"44 "armv7l-linux"45 "aarch64-darwin"46 ];47 perSystem =48 {49 config,50 self',51 system,52 ...53 }:54 let55 pkgs = import inputs.nixpkgs {56 inherit system;57 overlays = [ inputs.fenix.overlays.default ];58 config.allowUnsupportedSystem = true;59 config.allowUnfreePredicate = pkg: pkg.name == "Xcode.app";60 };61 targetArch = pkgs.stdenv.hostPlatform.parsed.cpu.name;62 rustfmt = (pkgs.fenix.complete or pkgs.fenix.stable).rustfmt;63 rust-analyzer = (pkgs.fenix.complete or pkgs.fenix.stable).rust-analyzer;64 toolchain = pkgs.fenix.combine [65 (pkgs.fenix.stable.withComponents [66 "cargo"67 "clippy"68 "rustc"69 "rust-src"70 ])71 rustfmt72 rust-analyzer73 pkgs.fenix.targets.wasm32-unknown-unknown.stable.rust-std74 ];75 craneLib = (inputs.crane.mkLib pkgs).overrideToolchain toolchain;76 treefmt =77 (inputs.treefmt-nix.lib.evalModule pkgs (import ./treefmt.nix { inherit rustfmt; })).config.build;7879 80 crossToolchain = pkgs.fenix.combine [81 (pkgs.fenix.stable.withComponents [82 "cargo"83 "rustc"84 ])85 pkgs.fenix.targets."${targetArch}-unknown-linux-musl".stable.rust-std86 pkgs.fenix.targets."${targetArch}-apple-darwin".stable.rust-std87 ];88 craneLibCross = (inputs.crane.mkLib pkgs).overrideToolchain crossToolchain;8990 91 pkgsWindows = import inputs.nixpkgs {92 overlays = [ inputs.fenix.overlays.default ];93 localSystem = system;94 crossSystem = {95 config = "${targetArch}-w64-mingw32";96 libc = "msvcrt";97 };98 };99 windowsToolchain = pkgs.fenix.combine [100 (pkgs.fenix.stable.withComponents [101 "cargo"102 "rustc"103 ])104 pkgs.fenix.targets."${targetArch}-pc-windows-gnu".stable.rust-std105 ];106 craneLibWindows = (inputs.crane.mkLib pkgsWindows).overrideToolchain (_: windowsToolchain);107108 in109 {110 legacyPackages = {111 release = optionalAttrs pkgs.stdenv.hostPlatform.isLinux (112 {113 jrsonnet-linux-glibc = self'.packages.jrsonnet;114 jrsonnet-experimental-linux-glibc = self'.packages.jrsonnet-experimental;115 }116 // optionalAttrs pkgs.stdenv.hostPlatform.is64bit rec {117 jrsonnet-linux-musl = pkgs.callPackage ./nix/jrsonnet-cross-musl.nix {118 craneLib = craneLibCross;119 targetTriple = "${targetArch}-unknown-linux-musl";120 muslCC = pkgs.pkgsMusl.stdenv.cc;121 };122 jrsonnet-experimental-linux-musl = jrsonnet-linux-musl.override {123 withExperimentalFeatures = true;124 };125 }126 // optionalAttrs (targetArch == "aarch64") rec {127 jrsonnet-darwin = pkgs.callPackage ./nix/jrsonnet-cross-darwin.nix {128 craneLib = craneLibCross;129 targetTriple = "${targetArch}-apple-darwin";130 };131 jrsonnet-experimental-darwin = jrsonnet-darwin.override {132 withExperimentalFeatures = true;133 };134 }135 // optionalAttrs (targetArch == "x86_64") rec {136 jrsonnet-windows = pkgsWindows.callPackage ./nix/jrsonnet-cross-windows.nix {137 craneLib = craneLibWindows;138 targetTriple = "${targetArch}-pc-windows-gnu";139 };140 jrsonnet-experimental-windows = jrsonnet-windows.override {141 withExperimentalFeatures = true;142 };143 }144 );145 benchmarks = optionalAttrs (system == "x86_64-linux" || system == "aarch64-linux") {146 default = pkgs.callPackage ./nix/benchmarks.nix {147 inherit (config.legacyPackages.jsonnetImpls)148 go-jsonnet149 sjsonnet150 cpp-jsonnet151 rsjsonnet152 ;153 jrsonnetVariants = [154 {155 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };156 name = "";157 }158 ];159 };160 quick = pkgs.callPackage ./nix/benchmarks.nix {161 inherit (config.legacyPackages.jsonnetImpls)162 go-jsonnet163 sjsonnet164 cpp-jsonnet165 rsjsonnet166 ;167 quick = true;168 jrsonnetVariants = [169 {170 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };171 name = "";172 }173 ];174 };175 against-release = pkgs.callPackage ./nix/benchmarks.nix {176 inherit (config.legacyPackages.jsonnetImpls)177 go-jsonnet178 sjsonnet179 cpp-jsonnet180 rsjsonnet181 ;182 jrsonnetVariants = [183 {184 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };185 name = "current";186 }187 {188 drv = self'.packages.jrsonnet-experimental.override { forBenchmarks = true; };189 name = "current-experimental";190 }191 {192 drv = self'.legacyPackages.jsonnetImpls.jrsonnet-release.override { forBenchmarks = true; };193 name = "release";194 }195 ];196 };197 quick-against-release = pkgs.callPackage ./nix/benchmarks.nix {198 inherit (config.legacyPackages.jsonnetImpls)199 go-jsonnet200 sjsonnet201 cpp-jsonnet202 rsjsonnet203 ;204 quick = true;205 jrsonnetVariants = [206 {207 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };208 name = "current";209 }210 {211 drv = self'.packages.jrsonnet-experimental.override { forBenchmarks = true; };212 name = "current-experimental";213 }214 {215 drv = self'.legacyPackages.jsonnetImpls.jrsonnet-release.override { forBenchmarks = true; };216 name = "release";217 }218 ];219 };220 };221 jsonnetImpls = {222 go-jsonnet = pkgs.callPackage ./nix/go-jsonnet.nix { };223 sjsonnet = pkgs.callPackage ./nix/sjsonnet.nix { };224 cpp-jsonnet = pkgs.callPackage ./nix/cpp-jsonnet.nix { };225 226 227 rsjsonnet = pkgs.callPackage ./nix/rsjsonnet.nix { };228 229 jrsonnet-release = pkgs.callPackage ./nix/jrsonnet-release.nix {230 rustPlatform = pkgs.makeRustPlatform {231 rustc = toolchain;232 cargo = toolchain;233 };234 };235 };236 };237 packages =238 let239 jrsonnet = pkgs.callPackage ./nix/jrsonnet.nix {240 inherit craneLib;241 };242 jrsonnet-experimental = pkgs.callPackage ./nix/jrsonnet.nix {243 inherit craneLib;244 withExperimentalFeatures = true;245 };246 in247 {248 default = jrsonnet;249 inherit jrsonnet jrsonnet-experimental;250 };251 checks = optionalAttrs (system != "armv7l-linux") {252 formatting = treefmt.check inputs.self;253 };254 formatter = mkIf (system != "armv7l-linux") treefmt.wrapper;255 shelly.shells.default = {256 factory = craneLib.devShell;257 packages =258 with pkgs;259 [260 cargo-edit261 cargo-outdated262 cargo-watch263 cargo-insta264 cargo-hack265 cargo-show-asm266 lld267 hyperfine268 graphviz269 ]270 ++ optionals (!stdenv.isDarwin) [271 valgrind272 kdePackages.kcachegrind273 samply274 ];275 };276 };277 hercules-ci.github-releases.files =278 let279 rel = system: inputs.self.legacyPackages.${system}.release;280 bin = drv: "${drv}/bin/jrsonnet";281 exe = drv: "${drv}/bin/jrsonnet.exe";282 in283 [284 {285 label = "jrsonnet-x86_64-linux-musl";286 path = bin (rel "x86_64-linux").jrsonnet-linux-musl;287 }288 {289 label = "jrsonnet-experimental-x86_64-linux-musl";290 path = bin (rel "x86_64-linux").jrsonnet-experimental-linux-musl;291 }292 {293 label = "jrsonnet-aarch64-darwin";294 path = bin (rel "aarch64-linux").jrsonnet-darwin;295 }296 {297 label = "jrsonnet-experimental-aarch64-darwin";298 path = bin (rel "aarch64-linux").jrsonnet-experimental-darwin;299 }300 {301 label = "jrsonnet-x86_64-windows.exe";302 path = exe (rel "x86_64-linux").jrsonnet-windows;303 }304 {305 label = "jrsonnet-experimental-x86_64-windows.exe";306 path = exe (rel "x86_64-linux").jrsonnet-experimental-windows;307 }308309 {310 label = "jrsonnet-aarch64-linux-musl";311 path = bin (rel "aarch64-linux").jrsonnet-linux-musl;312 }313 {314 label = "jrsonnet-experimental-aarch64-linux-musl";315 path = bin (rel "aarch64-linux").jrsonnet-experimental-linux-musl;316 }317318 {319 label = "jrsonnet-x86_64-linux-glibc";320 path = bin (rel "x86_64-linux").jrsonnet-linux-glibc;321 }322 {323 label = "jrsonnet-experimental-x86_64-linux-glibc";324 path = bin (rel "x86_64-linux").jrsonnet-experimental-linux-glibc;325 }326 {327 label = "jrsonnet-aarch64-linux-glibc";328 path = bin (rel "aarch64-linux").jrsonnet-linux-glibc;329 }330 {331 label = "jrsonnet-experimental-aarch64-linux-glibc";332 path = bin (rel "aarch64-linux").jrsonnet-experimental-linux-glibc;333 }334 {335 label = "jrsonnet-i686-linux-glibc";336 path = bin (rel "i686-linux").jrsonnet-linux-glibc;337 }338 {339 label = "jrsonnet-experimental-i686-linux-glibc";340 path = bin (rel "i686-linux").jrsonnet-experimental-linux-glibc;341 }342 {343 label = "jrsonnet-armv7l-linux-glibc";344 path = bin (rel "armv7l-linux").jrsonnet-linux-glibc;345 }346 {347 label = "jrsonnet-experimental-armv7l-linux-glibc";348 path = bin (rel "armv7l-linux").jrsonnet-experimental-linux-glibc;349 }350 ];351 hercules-ci.cargo-publish = {352 enable = true;353 secretName = "crates-io";354 extraPublishArgs = [ "--workspace" ];355 };356 hercules-ci.flake-update = {357 enable = true;358 baseMerge.enable = true;359 baseMerge.method = "fast-forward";360 when = {361 dayOfWeek = [ "Sat" ];362 };363 };364 herculesCI =365 { lib, config, ... }:366 {367 ciSystems = [368 "x86_64-linux"369 "i686-linux"370 "aarch64-linux"371 "armv7l-linux"372 373 374 ];375 onPush.default.outputs = {376 benchmarks.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.benchmarks.default;377378 379 release.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.release;380 release.aarch64-linux = inputs.self.legacyPackages.aarch64-linux.release;381 release.armv7l-linux = inputs.self.legacyPackages.armv7l-linux.release;382 release.i686-linux = inputs.self.legacyPackages.i686-linux.release;383384 385 devShells = mkForce { };386 formatter = mkForce { };387388 389 checks.i686-linux.formatting = mkForce { };390 checks.aarch64-linux.formatting = mkForce { };391 };392 };393 };394}