git.delta.rocks / jrsonnet / refs/commits / 75beb619a12f

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                lld263                hyperfine264                graphviz265              ]266              ++ optionals (!stdenv.isDarwin) [267                valgrind268                kdePackages.kcachegrind269              ];270          };271        };272      hercules-ci.github-releases.files =273        let274          rel = system: inputs.self.legacyPackages.${system}.release;275          bin = drv: "${drv}/bin/jrsonnet";276          exe = drv: "${drv}/bin/jrsonnet.exe";277        in278        [279          {280            label = "jrsonnet-x86_64-linux-musl";281            path = bin (rel "x86_64-linux").jrsonnet-linux-musl;282          }283          {284            label = "jrsonnet-experimental-x86_64-linux-musl";285            path = bin (rel "x86_64-linux").jrsonnet-experimental-linux-musl;286          }287          {288            label = "jrsonnet-aarch64-darwin";289            path = bin (rel "aarch64-linux").jrsonnet-darwin;290          }291          {292            label = "jrsonnet-experimental-aarch64-darwin";293            path = bin (rel "aarch64-linux").jrsonnet-experimental-darwin;294          }295          {296            label = "jrsonnet-x86_64-windows.exe";297            path = exe (rel "x86_64-linux").jrsonnet-windows;298          }299          {300            label = "jrsonnet-experimental-x86_64-windows.exe";301            path = exe (rel "x86_64-linux").jrsonnet-experimental-windows;302          }303304          {305            label = "jrsonnet-aarch64-linux-musl";306            path = bin (rel "aarch64-linux").jrsonnet-linux-musl;307          }308          {309            label = "jrsonnet-experimental-aarch64-linux-musl";310            path = bin (rel "aarch64-linux").jrsonnet-experimental-linux-musl;311          }312313          {314            label = "jrsonnet-x86_64-linux-glibc";315            path = bin (rel "x86_64-linux").jrsonnet-linux-glibc;316          }317          {318            label = "jrsonnet-experimental-x86_64-linux-glibc";319            path = bin (rel "x86_64-linux").jrsonnet-experimental-linux-glibc;320          }321          {322            label = "jrsonnet-aarch64-linux-glibc";323            path = bin (rel "aarch64-linux").jrsonnet-linux-glibc;324          }325          {326            label = "jrsonnet-experimental-aarch64-linux-glibc";327            path = bin (rel "aarch64-linux").jrsonnet-experimental-linux-glibc;328          }329          {330            label = "jrsonnet-i686-linux-glibc";331            path = bin (rel "i686-linux").jrsonnet-linux-glibc;332          }333          {334            label = "jrsonnet-experimental-i686-linux-glibc";335            path = bin (rel "i686-linux").jrsonnet-experimental-linux-glibc;336          }337          {338            label = "jrsonnet-armv7l-linux-glibc";339            path = bin (rel "armv7l-linux").jrsonnet-linux-glibc;340          }341          {342            label = "jrsonnet-experimental-armv7l-linux-glibc";343            path = bin (rel "armv7l-linux").jrsonnet-experimental-linux-glibc;344          }345        ];346      hercules-ci.cargo-publish = {347        enable = true;348        secretName = "crates-io";349      };350      hercules-ci.flake-update = {351        enable = true;352        baseMerge.enable = true;353        baseMerge.method = "fast-forward";354        when = {355          dayOfWeek = [ "Sat" ];356        };357      };358      herculesCI =359        { lib, config, ... }:360        {361          ciSystems = [362            "x86_64-linux"363            "i686-linux"364            "aarch64-linux"365            "armv7l-linux"366            # TODO: add workers for these platforms367            # "aarch64-darwin"368          ];369          onPush.default.outputs = {370            benchmarks.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.benchmarks.default;371372            # Cross: musl/mingw/darwin-zigbuild373            release.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.release;374            release.aarch64-linux = inputs.self.legacyPackages.aarch64-linux.release;375            release.armv7l-linux = inputs.self.legacyPackages.armv7l-linux.release;376            release.i686-linux = inputs.self.legacyPackages.i686-linux.release;377378            # Too much to build for CI purposes379            devShells = mkForce { };380            formatter = mkForce { };381382            # No need to run them on different arch, pretty large derivations and might try to compile GHC383            checks.i686-linux.formatting = mkForce { };384            checks.aarch64-linux.formatting = mkForce { };385          };386        };387    };388}