magic-nix-cache/crane.nix

98 lines
2.9 KiB
Nix
Raw Normal View History

2023-05-19 08:48:52 +00:00
{ stdenv
, pkgs
, lib
, crane
, rustNightly
, rust
, nix-gitignore
, supportedSystems
}:
let
inherit (stdenv.hostPlatform) system;
# For easy cross-compilation in devShells
# We are just composing the pkgsCross.*.stdenv.cc together
crossPlatforms = let
makeCrossPlatform = crossSystem: let
pkgsCross =
if crossSystem == system then pkgs
else import pkgs.path {
inherit system crossSystem;
overlays = [];
};
rustTargetSpec = rust.toRustTargetSpec pkgsCross.pkgsStatic.stdenv.hostPlatform;
rustTargetSpecUnderscored = builtins.replaceStrings [ "-" ] [ "_" ] rustTargetSpec;
cargoLinkerEnv = lib.strings.toUpper "CARGO_TARGET_${rustTargetSpecUnderscored}_LINKER";
cargoCcEnv = "CC_${rustTargetSpecUnderscored}"; # for ring
cc = "${pkgsCross.stdenv.cc}/bin/${pkgsCross.stdenv.cc.targetPrefix}cc";
in {
name = crossSystem;
value = {
inherit rustTargetSpec cc;
pkgs = pkgsCross;
env = {
"${cargoLinkerEnv}" = cc;
"${cargoCcEnv}" = cc;
};
};
};
systems = lib.filter (s: s == system || lib.hasInfix "linux" s) supportedSystems;
in builtins.listToAttrs (map makeCrossPlatform systems);
cargoTargets = lib.mapAttrsToList (_: p: p.rustTargetSpec) crossPlatforms;
cargoCrossEnvs = lib.foldl (acc: p: acc // p.env) {} (builtins.attrValues crossPlatforms);
buildFor = system: let
crossPlatform = crossPlatforms.${system};
inherit (crossPlatform) pkgs;
craneLib = (crane.mkLib pkgs).overrideToolchain rustNightly;
2023-05-19 19:00:36 +00:00
crateName = craneLib.crateNameFromCargoToml {
cargoToml = ./nix-actions-cache/Cargo.toml;
};
2023-05-19 08:48:52 +00:00
src = nix-gitignore.gitignoreSource [] ./.;
2023-05-22 22:00:34 +00:00
commonArgs = {
inherit (crateName) pname version;
inherit src;
buildInputs = with pkgs; []
2023-05-19 08:48:52 +00:00
++ lib.optionals pkgs.stdenv.isDarwin [
darwin.apple_sdk.frameworks.Security
];
2023-05-22 22:00:34 +00:00
nativeBuildInputs = with pkgs; []
# The Rust toolchain from rust-overlay has a dynamic libiconv in depsTargetTargetPropagated
# Our static libiconv needs to take precedence
2023-05-19 08:48:52 +00:00
++ lib.optionals pkgs.stdenv.isDarwin [
(libiconv.override { enableStatic = true; enableShared = false; })
];
2023-05-22 22:00:34 +00:00
cargoExtraArgs = "--target ${crossPlatform.rustTargetSpec}";
2023-05-19 08:48:52 +00:00
2023-05-22 22:00:34 +00:00
cargoVendorDir = craneLib.vendorMultipleCargoDeps {
inherit (craneLib.findCargoFiles src) cargoConfigs;
cargoLockList = [
./Cargo.lock
"${rustNightly.passthru.availableComponents.rust-src}/lib/rustlib/src/rust/Cargo.lock"
];
};
} // crossPlatform.env;
2023-05-19 08:48:52 +00:00
2023-05-22 22:00:34 +00:00
crate = craneLib.buildPackage (commonArgs // {
cargoArtifacts = craneLib.buildDepsOnly commonArgs;
2023-05-19 08:48:52 +00:00
# The resulting executable must be standalone
allowedRequisites = [];
2023-05-22 22:00:34 +00:00
});
2023-05-19 08:48:52 +00:00
in crate;
in {
inherit crossPlatforms cargoTargets cargoCrossEnvs;
nix-actions-cache = buildFor system;
}