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 ];74 craneLib = (inputs.crane.mkLib pkgs).overrideToolchain toolchain;75 treefmt =76 (inputs.treefmt-nix.lib.evalModule pkgs (import ./treefmt.nix { inherit rustfmt; })).config.build;7778 79 crossToolchain = pkgs.fenix.combine [80 (pkgs.fenix.stable.withComponents [81 "cargo"82 "rustc"83 ])84 pkgs.fenix.targets."${targetArch}-unknown-linux-musl".stable.rust-std85 pkgs.fenix.targets."${targetArch}-apple-darwin".stable.rust-std86 ];87 craneLibCross = (inputs.crane.mkLib pkgs).overrideToolchain crossToolchain;8889 90 pkgsWindows = import inputs.nixpkgs {91 overlays = [ inputs.fenix.overlays.default ];92 localSystem = system;93 crossSystem = {94 config = "${targetArch}-w64-mingw32";95 libc = "msvcrt";96 };97 };98 windowsToolchain = pkgs.fenix.combine [99 (pkgs.fenix.stable.withComponents [100 "cargo"101 "rustc"102 ])103 pkgs.fenix.targets."${targetArch}-pc-windows-gnu".stable.rust-std104 ];105 craneLibWindows = (inputs.crane.mkLib pkgsWindows).overrideToolchain (_: windowsToolchain);106107 in108 {109 legacyPackages = {110 release = optionalAttrs pkgs.stdenv.hostPlatform.isLinux (111 {112 jrsonnet-linux-glibc = self'.packages.jrsonnet;113 jrsonnet-experimental-linux-glibc = self'.packages.jrsonnet-experimental;114 }115 // optionalAttrs pkgs.stdenv.hostPlatform.is64bit rec {116 jrsonnet-linux-musl = pkgs.callPackage ./nix/jrsonnet-cross-musl.nix {117 craneLib = craneLibCross;118 targetTriple = "${targetArch}-unknown-linux-musl";119 muslCC = pkgs.pkgsMusl.stdenv.cc;120 };121 jrsonnet-experimental-linux-musl = jrsonnet-linux-musl.override {122 withExperimentalFeatures = true;123 };124 }125 // optionalAttrs (targetArch == "aarch64") rec {126 jrsonnet-darwin = pkgs.callPackage ./nix/jrsonnet-cross-darwin.nix {127 craneLib = craneLibCross;128 targetTriple = "${targetArch}-apple-darwin";129 };130 jrsonnet-experimental-darwin = jrsonnet-darwin.override {131 withExperimentalFeatures = true;132 };133 }134 // optionalAttrs (targetArch == "x86_64") rec {135 jrsonnet-windows = pkgsWindows.callPackage ./nix/jrsonnet-cross-windows.nix {136 craneLib = craneLibWindows;137 targetTriple = "${targetArch}-pc-windows-gnu";138 };139 jrsonnet-experimental-windows = jrsonnet-windows.override {140 withExperimentalFeatures = true;141 };142 }143 );144 benchmarks = optionalAttrs (system == "x86_64-linux" || system == "aarch64-linux") {145 default = pkgs.callPackage ./nix/benchmarks.nix {146 inherit (config.legacyPackages.jsonnetImpls)147 go-jsonnet148 sjsonnet149 cpp-jsonnet150 rsjsonnet151 ;152 jrsonnetVariants = [153 {154 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };155 name = "";156 }157 ];158 };159 quick = pkgs.callPackage ./nix/benchmarks.nix {160 inherit (config.legacyPackages.jsonnetImpls)161 go-jsonnet162 sjsonnet163 cpp-jsonnet164 rsjsonnet165 ;166 quick = true;167 jrsonnetVariants = [168 {169 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };170 name = "";171 }172 ];173 };174 against-release = pkgs.callPackage ./nix/benchmarks.nix {175 inherit (config.legacyPackages.jsonnetImpls)176 go-jsonnet177 sjsonnet178 cpp-jsonnet179 rsjsonnet180 ;181 jrsonnetVariants = [182 {183 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };184 name = "current";185 }186 {187 drv = self'.packages.jrsonnet-experimental.override { forBenchmarks = true; };188 name = "current-experimental";189 }190 {191 drv = self'.legacyPackages.jsonnetImpls.jrsonnet-release.override { forBenchmarks = true; };192 name = "release";193 }194 ];195 };196 quick-against-release = pkgs.callPackage ./nix/benchmarks.nix {197 inherit (config.legacyPackages.jsonnetImpls)198 go-jsonnet199 sjsonnet200 cpp-jsonnet201 rsjsonnet202 ;203 quick = true;204 jrsonnetVariants = [205 {206 drv = self'.packages.jrsonnet.override { forBenchmarks = true; };207 name = "current";208 }209 {210 drv = self'.packages.jrsonnet-experimental.override { forBenchmarks = true; };211 name = "current-experimental";212 }213 {214 drv = self'.legacyPackages.jsonnetImpls.jrsonnet-release.override { forBenchmarks = true; };215 name = "release";216 }217 ];218 };219 };220 jsonnetImpls = {221 go-jsonnet = pkgs.callPackage ./nix/go-jsonnet.nix { };222 sjsonnet = pkgs.callPackage ./nix/sjsonnet.nix { };223 cpp-jsonnet = pkgs.callPackage ./nix/cpp-jsonnet.nix { };224 225 226 rsjsonnet = pkgs.callPackage ./nix/rsjsonnet.nix { };227 228 jrsonnet-release = pkgs.callPackage ./nix/jrsonnet-release.nix {229 rustPlatform = pkgs.makeRustPlatform {230 rustc = toolchain;231 cargo = toolchain;232 };233 };234 };235 };236 packages =237 let238 jrsonnet = pkgs.callPackage ./nix/jrsonnet.nix {239 inherit craneLib;240 };241 jrsonnet-experimental = pkgs.callPackage ./nix/jrsonnet.nix {242 inherit craneLib;243 withExperimentalFeatures = true;244 };245 in246 {247 default = jrsonnet;248 inherit jrsonnet jrsonnet-experimental;249 };250 checks = optionalAttrs (system != "armv7l-linux") {251 formatting = treefmt.check inputs.self;252 };253 formatter = mkIf (system != "armv7l-linux") treefmt.wrapper;254 shelly.shells.default = {255 factory = craneLib.devShell;256 packages =257 with pkgs;258 [259 cargo-edit260 cargo-outdated261 cargo-watch262 cargo-insta263 cargo-hack264 cargo-show-asm265 lld266 hyperfine267 graphviz268 ]269 ++ optionals (!stdenv.isDarwin) [270 valgrind271 kdePackages.kcachegrind272 samply273 ];274 };275 };276 hercules-ci.github-releases.files =277 let278 rel = system: inputs.self.legacyPackages.${system}.release;279 bin = drv: "${drv}/bin/jrsonnet";280 exe = drv: "${drv}/bin/jrsonnet.exe";281 in282 [283 {284 label = "jrsonnet-x86_64-linux-musl";285 path = bin (rel "x86_64-linux").jrsonnet-linux-musl;286 }287 {288 label = "jrsonnet-experimental-x86_64-linux-musl";289 path = bin (rel "x86_64-linux").jrsonnet-experimental-linux-musl;290 }291 {292 label = "jrsonnet-aarch64-darwin";293 path = bin (rel "aarch64-linux").jrsonnet-darwin;294 }295 {296 label = "jrsonnet-experimental-aarch64-darwin";297 path = bin (rel "aarch64-linux").jrsonnet-experimental-darwin;298 }299 {300 label = "jrsonnet-x86_64-windows.exe";301 path = exe (rel "x86_64-linux").jrsonnet-windows;302 }303 {304 label = "jrsonnet-experimental-x86_64-windows.exe";305 path = exe (rel "x86_64-linux").jrsonnet-experimental-windows;306 }307308 {309 label = "jrsonnet-aarch64-linux-musl";310 path = bin (rel "aarch64-linux").jrsonnet-linux-musl;311 }312 {313 label = "jrsonnet-experimental-aarch64-linux-musl";314 path = bin (rel "aarch64-linux").jrsonnet-experimental-linux-musl;315 }316317 {318 label = "jrsonnet-x86_64-linux-glibc";319 path = bin (rel "x86_64-linux").jrsonnet-linux-glibc;320 }321 {322 label = "jrsonnet-experimental-x86_64-linux-glibc";323 path = bin (rel "x86_64-linux").jrsonnet-experimental-linux-glibc;324 }325 {326 label = "jrsonnet-aarch64-linux-glibc";327 path = bin (rel "aarch64-linux").jrsonnet-linux-glibc;328 }329 {330 label = "jrsonnet-experimental-aarch64-linux-glibc";331 path = bin (rel "aarch64-linux").jrsonnet-experimental-linux-glibc;332 }333 {334 label = "jrsonnet-i686-linux-glibc";335 path = bin (rel "i686-linux").jrsonnet-linux-glibc;336 }337 {338 label = "jrsonnet-experimental-i686-linux-glibc";339 path = bin (rel "i686-linux").jrsonnet-experimental-linux-glibc;340 }341 {342 label = "jrsonnet-armv7l-linux-glibc";343 path = bin (rel "armv7l-linux").jrsonnet-linux-glibc;344 }345 {346 label = "jrsonnet-experimental-armv7l-linux-glibc";347 path = bin (rel "armv7l-linux").jrsonnet-experimental-linux-glibc;348 }349 ];350 hercules-ci.cargo-publish = {351 enable = true;352 secretName = "crates-io";353 extraPublishArgs = [ "--workspace" ];354 };355 hercules-ci.flake-update = {356 enable = true;357 baseMerge.enable = true;358 baseMerge.method = "fast-forward";359 when = {360 dayOfWeek = [ "Sat" ];361 };362 };363 herculesCI =364 { lib, config, ... }:365 {366 ciSystems = [367 "x86_64-linux"368 "i686-linux"369 "aarch64-linux"370 "armv7l-linux"371 372 373 ];374 onPush.default.outputs = {375 benchmarks.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.benchmarks.default;376377 378 release.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.release;379 release.aarch64-linux = inputs.self.legacyPackages.aarch64-linux.release;380 release.armv7l-linux = inputs.self.legacyPackages.armv7l-linux.release;381 release.i686-linux = inputs.self.legacyPackages.i686-linux.release;382383 384 devShells = mkForce { };385 formatter = mkForce { };386387 388 checks.i686-linux.formatting = mkForce { };389 checks.aarch64-linux.formatting = mkForce { };390 };391 };392 };393}