let inherit (import ./npins) nixpkgs rust-overlay ; currentPkgs = import nixpkgs { overlays = [ (import rust-overlay) ]; }; inherit (currentPkgs) lib stdenv; crate-info = fromTOML (builtins.readFile ./Cargo.toml); pname = crate-info.package.name; version = crate-info.package.version; docker-image = "badmanners/${pname}"; cargo-deps-hash = "sha256-oiz2a6Vip199saU/s/sBn/3Cl0eJaSltN3n1uPETHGk="; cargo-src = lib.fileset.toSource { root = ./.; fileset = lib.fileset.unions [ ./Cargo.toml ./Cargo.lock ]; }; src = lib.fileset.toSource { root = ./.; fileset = lib.fileset.unions [ ./Cargo.toml ./Cargo.lock ./src ./migration/Cargo.toml ./migration/src ./static ./templates ]; }; archs = { amd64 = { system = "x86_64-linux"; pkgs = import nixpkgs { localSystem = "x86_64-linux"; }; tag = "latest-amd64"; targetTriple = "x86_64-unknown-linux-gnu"; }; arm64 = { system = "aarch64-linux"; pkgs = import nixpkgs { localSystem = "aarch64-linux"; }; tag = "latest-arm64"; targetTriple = "aarch64-unknown-linux-gnu"; }; }; rust-bin = currentPkgs.rust-bin.stable.latest.default.override { targets = [ "x86_64-unknown-linux-gnu" "aarch64-unknown-linux-gnu" ]; }; mkRustPkg = targetTriple: stdenv.mkDerivation { inherit pname version src ; cargoDeps = currentPkgs.rustPlatform.fetchCargoVendor { src = cargo-src; hash = cargo-deps-hash; }; nativeBuildInputs = [ currentPkgs.rustPlatform.cargoSetupHook currentPkgs.zig rust-bin ]; buildPhase = '' export HOME=$(mktemp -d) ${currentPkgs.cargo-zigbuild}/bin/cargo-zigbuild zigbuild --release --target ${targetTriple} ''; installPhase = '' mkdir -p $out/bin cp ./target/${targetTriple}/release/${pname} $out/bin/ ''; }; mkDocker = { system, pkgs, tag, targetTriple, }: let pkgs-cross = if system == builtins.currentSystem then currentPkgs else (import nixpkgs { crossSystem = system; }); rust-package = mkRustPkg targetTriple; in pkgs-cross.dockerTools.buildLayeredImage { name = docker-image; inherit tag; contents = [ pkgs.ffmpeg-headless pkgs.glibc ]; config.Entrypoint = [ "${rust-package}/bin/${pname}" ]; }; currentTargetTriple = (lib.lists.findFirst (arch: arch.system == builtins.currentSystem) { targetTriple = throw "Unknown current system ${builtins.currentSystem}"; } (lib.attrValues archs)).targetTriple; in { samey = mkRustPkg currentTargetTriple; docker-amd64 = mkDocker archs.amd64; docker-arm64 = mkDocker archs.arm64; }