Files
nixpkgs/pkgs/build-support/rust/hooks/default.nix
dramforever d387841843 rust/hooks: Use rustcTargetSpec for --target
The --target option expects the target spec JSON, not the short target
name, so use rustcTargetSpec.
2025-08-13 16:13:10 +02:00

138 lines
4.0 KiB
Nix

{
cargo-nextest,
clang,
diffutils,
lib,
makeSetupHook,
rust,
stdenv,
pkgsHostTarget,
pkgsTargetTarget,
# This confusingly-named parameter indicates the *subdirectory of
# `target/` from which to copy the build artifacts. It is derived
# from a stdenv platform (or a JSON file).
target ? stdenv.targetPlatform.rust.cargoShortTarget,
tests,
pkgsCross,
}:
{
cargoBuildHook = makeSetupHook {
name = "cargo-build-hook.sh";
substitutions = {
inherit (stdenv.targetPlatform.rust) rustcTargetSpec;
inherit (rust.envVars) setEnv;
};
passthru.tests = {
test = tests.rust-hooks.cargoBuildHook;
}
// lib.optionalAttrs (stdenv.isLinux) {
testCross = pkgsCross.riscv64.tests.rust-hooks.cargoBuildHook;
};
} ./cargo-build-hook.sh;
cargoCheckHook = makeSetupHook {
name = "cargo-check-hook.sh";
substitutions = {
inherit (stdenv.targetPlatform.rust) rustcTargetSpec;
inherit (rust.envVars) setEnv;
};
passthru.tests = {
test = tests.rust-hooks.cargoCheckHook;
}
// lib.optionalAttrs (stdenv.isLinux) {
testCross = pkgsCross.riscv64.tests.rust-hooks.cargoCheckHook;
};
} ./cargo-check-hook.sh;
cargoInstallHook = makeSetupHook {
name = "cargo-install-hook.sh";
substitutions = {
targetSubdirectory = target;
};
passthru.tests = {
test = tests.rust-hooks.cargoInstallHook;
}
// lib.optionalAttrs (stdenv.isLinux) {
testCross = pkgsCross.riscv64.tests.rust-hooks.cargoInstallHook;
};
} ./cargo-install-hook.sh;
cargoNextestHook = makeSetupHook {
name = "cargo-nextest-hook.sh";
propagatedBuildInputs = [ cargo-nextest ];
substitutions = {
inherit (stdenv.targetPlatform.rust) rustcTargetSpec;
};
passthru.tests = {
test = tests.rust-hooks.cargoNextestHook;
}
// lib.optionalAttrs (stdenv.isLinux) {
testCross = pkgsCross.riscv64.tests.rust-hooks.cargoNextestHook;
};
} ./cargo-nextest-hook.sh;
cargoSetupHook = makeSetupHook {
name = "cargo-setup-hook.sh";
propagatedBuildInputs = [ ];
substitutions = {
defaultConfig = ../fetchcargo-default-config.toml;
# Specify the stdenv's `diff` by abspath to ensure that the user's build
# inputs do not cause us to find the wrong `diff`.
diff = "${lib.getBin diffutils}/bin/diff";
cargoConfig =
lib.optionalString (stdenv.hostPlatform.config != stdenv.targetPlatform.config) ''
[target."${stdenv.targetPlatform.rust.rustcTarget}"]
"linker" = "${pkgsTargetTarget.stdenv.cc}/bin/${pkgsTargetTarget.stdenv.cc.targetPrefix}cc"
"rustflags" = [ ${
lib.concatStringsSep ", " (
[
''"-Ctarget-feature=${if stdenv.targetPlatform.isStatic then "+" else "-"}crt-static"''
]
++ lib.optional (!stdenv.targetPlatform.isx86_32) ''"-Cforce-frame-pointers=yes"''
)
} ]
''
+ ''
[target."${stdenv.hostPlatform.rust.rustcTarget}"]
"linker" = "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc"
"rustflags" = [ ${
lib.optionalString (!stdenv.hostPlatform.isx86_32) ''"-Cforce-frame-pointers=yes"''
} ]
'';
};
passthru.tests = {
test = tests.rust-hooks.cargoSetupHook;
}
// lib.optionalAttrs (stdenv.isLinux) {
testCross = pkgsCross.riscv64.tests.rust-hooks.cargoSetupHook;
};
} ./cargo-setup-hook.sh;
maturinBuildHook = makeSetupHook {
name = "maturin-build-hook.sh";
propagatedBuildInputs = [
pkgsHostTarget.maturin
pkgsHostTarget.cargo
pkgsHostTarget.rustc
];
substitutions = {
inherit (stdenv.targetPlatform.rust) rustcTargetSpec;
inherit (rust.envVars) setEnv;
};
} ./maturin-build-hook.sh;
bindgenHook = makeSetupHook {
name = "rust-bindgen-hook";
substitutions = {
libclang = (lib.getLib clang.cc);
inherit clang;
};
} ./rust-bindgen-hook.sh;
}