git.delta.rocks / jrsonnet / refs/commits / 191649c98a7e

difftreelog

source

flake.nix13.8 KiBsourcehistory
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          # Cross-compilation toolchains77          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          # Windows cross-compilation88          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              # I didn't managed to build it, and nixpkgs version is marked as broken223              # haskell-jsonnet = pkgs.callPackage ./nix/haskell-jsonnet.nix { };224              rsjsonnet = pkgs.callPackage ./nix/rsjsonnet.nix { };225              # Older released version of jrsonnet itself, for benchmarking purposes226              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            # TODO: add workers for these platforms369            # "aarch64-darwin"370          ];371          onPush.default.outputs = {372            benchmarks.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.benchmarks.default;373374            # Cross: musl/mingw/darwin-zigbuild375            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            # Too much to build for CI purposes381            devShells = mkForce { };382            formatter = mkForce { };383384            # No need to run them on different arch, pretty large derivations and might try to compile GHC385            checks.i686-linux.formatting = mkForce { };386            checks.aarch64-linux.formatting = mkForce { };387          };388        };389    };390}