{ description = "pict-rs"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; fenix = { url = "github:nix-community/fenix"; inputs.nixpkgs.follows = "nixpkgs"; }; naersk = { url = "github:nix-community/naersk"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, flake-utils, fenix, naersk }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; overlays = [ fenix.overlays.default ]; }; systemMappings = { "x86_64-linux" = ["x86_64" "unknown" "linux" "gnu"]; "aarch64-linux" = ["aarch64" "unknown" "linux" "gnu"]; }; hostCargoTarget = nixpkgs.lib.strings.concatMapStringsSep "_" (nixpkgs.lib.strings.toUpper) systemMappings.${system}; makeRustCrossPackage = (crossSystem: let pkgsCross = import nixpkgs { inherit system; crossSystem.system = crossSystem; }; target = nixpkgs.lib.strings.concatStringsSep "-" systemMappings.${crossSystem}; cargoTarget = nixpkgs.lib.strings.concatMapStringsSep "_" (nixpkgs.lib.strings.toUpper) systemMappings.${crossSystem}; toolchain = with fenix.packages.${system}; combine [ minimal.cargo minimal.rustc targets.${target}.latest.rust-std ]; inherit (pkgsCross.stdenv) cc; in (naersk.lib.${system}.override { cargo = toolchain; rustc = toolchain; }).buildPackage { src = ./.; CARGO_BUILD_TARGET = target; "CARGO_TARGET_${cargoTarget}_LINKER" = "${cc}/bin/${cc.targetPrefix}cc"; TARGET_CC = "${cc}/bin/${cc.targetPrefix}cc"; TARGET_AR = "${cc}/bin/${cc.targetPrefix}ar"; }); in { packages = rec { pict-rs-x86_64-linux-gnu = makeRustCrossPackage "x86_64-linux"; pict-rs-aarch64-linux-gnu = makeRustCrossPackage "aarch64-linux"; pict-rs = pict-rs-x86_64-linux-gnu; default = pict-rs; }; apps = rec { dev = flake-utils.lib.mkApp { drv = self.packages.${system}.pict-rs; }; default = dev; }; devShell = with pkgs; mkShell { "CARGO_TARGET_${hostCargoTarget}_LINKER" = "${clang}/bin/clang"; "RUSTFLAGS" = "--cfg tokio_unstable --cfg uuid_unstable -C link-arg=-fuse-ld=${mold-wrapped}/bin/mold"; nativeBuildInputs = [ diesel-cli exiftool (pkgs.fenix.complete.withComponents [ "cargo" "clippy" "rust-src" "rustc" "rustfmt" ]) ffmpeg_6-full garage imagemagick rust-analyzer-nightly taplo tokio-console ]; }; }); }