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 toolchain = pkgs.fenix.combine [64 (pkgs.fenix.stable.withComponents [65 "cargo"66 "clippy"67 "rustc"68 "rust-src"69 ])70 rustfmt71 ];72 craneLib = (inputs.crane.mkLib pkgs).overrideToolchain toolchain;73 treefmt =74 (inputs.treefmt-nix.lib.evalModule pkgs (import ./treefmt.nix { inherit rustfmt; })).config.build;7576 77 crossToolchain = pkgs.fenix.combine [78 (pkgs.fenix.stable.withComponents [79 "cargo"80 "rustc"81 ])82 pkgs.fenix.targets."${targetArch}-unknown-linux-musl".stable.rust-std83 pkgs.fenix.targets."${targetArch}-apple-darwin".stable.rust-std84 ];85 craneLibCross = (inputs.crane.mkLib pkgs).overrideToolchain crossToolchain;8687 88 pkgsWindows = import inputs.nixpkgs {89 overlays = [ inputs.fenix.overlays.default ];90 localSystem = system;91 crossSystem = {92 config = "${targetArch}-w64-mingw32";93 libc = "msvcrt";94 };95 };96 windowsToolchain = pkgs.fenix.combine [97 (pkgs.fenix.stable.withComponents [98 "cargo"99 "rustc"100 ])101 pkgs.fenix.targets."${targetArch}-pc-windows-gnu".stable.rust-std102 ];103 craneLibWindows = (inputs.crane.mkLib pkgsWindows).overrideToolchain (_: windowsToolchain);104105 in106 {107 legacyPackages = {108 release = optionalAttrs pkgs.stdenv.hostPlatform.isLinux (109 {110 jrsonnet-linux-glibc = self'.packages.jrsonnet;111 jrsonnet-experimental-linux-glibc = self'.packages.jrsonnet-experimental;112 }113 // optionalAttrs pkgs.stdenv.hostPlatform.is64bit rec {114 jrsonnet-linux-musl = pkgs.callPackage ./nix/jrsonnet-cross-musl.nix {115 craneLib = craneLibCross;116 targetTriple = "${targetArch}-unknown-linux-musl";117 muslCC = pkgs.pkgsMusl.stdenv.cc;118 };119 jrsonnet-experimental-linux-musl = jrsonnet-linux-musl.override {120 withExperimentalFeatures = true;121 };122 }123 // optionalAttrs (targetArch == "aarch64") rec {124 jrsonnet-darwin = pkgs.callPackage ./nix/jrsonnet-cross-darwin.nix {125 craneLib = craneLibCross;126 targetTriple = "${targetArch}-apple-darwin";127 };128 jrsonnet-experimental-darwin = jrsonnet-darwin.override {129 withExperimentalFeatures = true;130 };131 }132 // optionalAttrs (targetArch == "x86_64") rec {133 jrsonnet-windows = pkgsWindows.callPackage ./nix/jrsonnet-cross-windows.nix {134 craneLib = craneLibWindows;135 targetTriple = "${targetArch}-pc-windows-gnu";136 };137 jrsonnet-experimental-windows = jrsonnet-windows.override {138 withExperimentalFeatures = true;139 };140 }141 );142 benchmarks = optionalAttrs (system == "x86_64-linux" || system == "aarch64-linux") {143 default = pkgs.callPackage ./nix/benchmarks.nix {144 inherit (config.legacyPackages.jsonnetImpls)145 go-jsonnet146 sjsonnet147 cpp-jsonnet148 rsjsonnet149 ;150 jrsonnetVariants = [151 {152 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };153 name = "";154 }155 ];156 };157 quick = pkgs.callPackage ./nix/benchmarks.nix {158 inherit (config.legacyPackages.jsonnetImpls)159 go-jsonnet160 sjsonnet161 cpp-jsonnet162 rsjsonnet163 ;164 quick = true;165 jrsonnetVariants = [166 {167 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };168 name = "";169 }170 ];171 };172 against-release = pkgs.callPackage ./nix/benchmarks.nix {173 inherit (config.legacyPackages.jsonnetImpls)174 go-jsonnet175 sjsonnet176 cpp-jsonnet177 rsjsonnet178 ;179 jrsonnetVariants = [180 {181 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };182 name = "current";183 }184 {185 drv = self'.packages.jrsonnet-experimental.override { forBenchmarks = true; };186 name = "current-experimental";187 }188 {189 drv = self'.legacyPackages.jsonnetImpls.jrsonnet-release.override { forBenchmarks = true; };190 name = "release";191 }192 ];193 };194 quick-against-release = pkgs.callPackage ./nix/benchmarks.nix {195 inherit (config.legacyPackages.jsonnetImpls)196 go-jsonnet197 sjsonnet198 cpp-jsonnet199 rsjsonnet200 ;201 quick = true;202 jrsonnetVariants = [203 {204 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };205 name = "current";206 }207 {208 drv = self'.packages.jrsonnet-experimental.override { forBenchmarks = true; };209 name = "current-experimental";210 }211 {212 drv = self'.legacyPackages.jsonnetImpls.jrsonnet-release.override { forBenchmarks = true; };213 name = "release";214 }215 ];216 };217 };218 jsonnetImpls = {219 go-jsonnet = pkgs.callPackage ./nix/go-jsonnet.nix { };220 sjsonnet = pkgs.callPackage ./nix/sjsonnet.nix { };221 cpp-jsonnet = pkgs.callPackage ./nix/cpp-jsonnet.nix { };222 223 224 rsjsonnet = pkgs.callPackage ./nix/rsjsonnet.nix { };225 226 jrsonnet-release = pkgs.callPackage ./nix/jrsonnet-release.nix {227 rustPlatform = pkgs.makeRustPlatform {228 rustc = toolchain;229 cargo = toolchain;230 };231 };232 };233 };234 packages =235 let236 jrsonnet = pkgs.callPackage ./nix/jrsonnet.nix {237 inherit craneLib;238 };239 jrsonnet-experimental = pkgs.callPackage ./nix/jrsonnet.nix {240 inherit craneLib;241 withExperimentalFeatures = true;242 };243 in244 {245 default = jrsonnet;246 inherit jrsonnet jrsonnet-experimental;247 };248 checks = optionalAttrs (system != "armv7l-linux") {249 formatting = treefmt.check inputs.self;250 };251 formatter = mkIf (system != "armv7l-linux") treefmt.wrapper;252 shelly.shells.default = {253 factory = craneLib.devShell;254 packages =255 with pkgs;256 [257 cargo-edit258 cargo-outdated259 cargo-watch260 cargo-insta261 cargo-hack262 cargo-show-asm263 lld264 hyperfine265 graphviz266 ]267 ++ optionals (!stdenv.isDarwin) [268 valgrind269 kdePackages.kcachegrind270 samply271 ];272 };273 };274 hercules-ci.github-releases.files =275 let276 rel = system: inputs.self.legacyPackages.${system}.release;277 bin = drv: "${drv}/bin/jrsonnet";278 exe = drv: "${drv}/bin/jrsonnet.exe";279 in280 [281 {282 label = "jrsonnet-x86_64-linux-musl";283 path = bin (rel "x86_64-linux").jrsonnet-linux-musl;284 }285 {286 label = "jrsonnet-experimental-x86_64-linux-musl";287 path = bin (rel "x86_64-linux").jrsonnet-experimental-linux-musl;288 }289 {290 label = "jrsonnet-aarch64-darwin";291 path = bin (rel "aarch64-linux").jrsonnet-darwin;292 }293 {294 label = "jrsonnet-experimental-aarch64-darwin";295 path = bin (rel "aarch64-linux").jrsonnet-experimental-darwin;296 }297 {298 label = "jrsonnet-x86_64-windows.exe";299 path = exe (rel "x86_64-linux").jrsonnet-windows;300 }301 {302 label = "jrsonnet-experimental-x86_64-windows.exe";303 path = exe (rel "x86_64-linux").jrsonnet-experimental-windows;304 }305306 {307 label = "jrsonnet-aarch64-linux-musl";308 path = bin (rel "aarch64-linux").jrsonnet-linux-musl;309 }310 {311 label = "jrsonnet-experimental-aarch64-linux-musl";312 path = bin (rel "aarch64-linux").jrsonnet-experimental-linux-musl;313 }314315 {316 label = "jrsonnet-x86_64-linux-glibc";317 path = bin (rel "x86_64-linux").jrsonnet-linux-glibc;318 }319 {320 label = "jrsonnet-experimental-x86_64-linux-glibc";321 path = bin (rel "x86_64-linux").jrsonnet-experimental-linux-glibc;322 }323 {324 label = "jrsonnet-aarch64-linux-glibc";325 path = bin (rel "aarch64-linux").jrsonnet-linux-glibc;326 }327 {328 label = "jrsonnet-experimental-aarch64-linux-glibc";329 path = bin (rel "aarch64-linux").jrsonnet-experimental-linux-glibc;330 }331 {332 label = "jrsonnet-i686-linux-glibc";333 path = bin (rel "i686-linux").jrsonnet-linux-glibc;334 }335 {336 label = "jrsonnet-experimental-i686-linux-glibc";337 path = bin (rel "i686-linux").jrsonnet-experimental-linux-glibc;338 }339 {340 label = "jrsonnet-armv7l-linux-glibc";341 path = bin (rel "armv7l-linux").jrsonnet-linux-glibc;342 }343 {344 label = "jrsonnet-experimental-armv7l-linux-glibc";345 path = bin (rel "armv7l-linux").jrsonnet-experimental-linux-glibc;346 }347 ];348 hercules-ci.cargo-publish = {349 enable = true;350 secretName = "crates-io";351 };352 hercules-ci.flake-update = {353 enable = true;354 baseMerge.enable = true;355 baseMerge.method = "fast-forward";356 when = {357 dayOfWeek = [ "Sat" ];358 };359 };360 herculesCI =361 { lib, config, ... }:362 {363 ciSystems = [364 "x86_64-linux"365 "i686-linux"366 "aarch64-linux"367 "armv7l-linux"368 369 370 ];371 onPush.default.outputs = {372 benchmarks.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.benchmarks.default;373374 375 release.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.release;376 release.aarch64-linux = inputs.self.legacyPackages.aarch64-linux.release;377 release.armv7l-linux = inputs.self.legacyPackages.armv7l-linux.release;378 release.i686-linux = inputs.self.legacyPackages.i686-linux.release;379380 381 devShells = mkForce { };382 formatter = mkForce { };383384 385 checks.i686-linux.formatting = mkForce { };386 checks.aarch64-linux.formatting = mkForce { };387 };388 };389 };390}