mirror of
https://github.com/ipetkov/crane.git
synced 2024-11-22 14:10:16 +03:00
85 lines
3.1 KiB
Nix
85 lines
3.1 KiB
Nix
{ buildDepsOnly
|
|
, crateNameFromCargoToml
|
|
, installFromCargoBuildLogHook
|
|
, lib
|
|
, mkCargoDerivation
|
|
, removeReferencesToVendoredSourcesHook
|
|
, vendorCargoDeps
|
|
}:
|
|
|
|
{ cargoBuildCommand ? "cargoWithProfile build"
|
|
, cargoExtraArgs ? "--locked"
|
|
, cargoTestCommand ? "cargoWithProfile test"
|
|
, cargoTestExtraArgs ? ""
|
|
, ...
|
|
}@args:
|
|
let
|
|
inherit (builtins) removeAttrs;
|
|
|
|
crateName = crateNameFromCargoToml args;
|
|
cleanedArgs = removeAttrs args [
|
|
"cargoBuildCommand"
|
|
"cargoExtraArgs"
|
|
"cargoTestCommand"
|
|
"cargoTestExtraArgs"
|
|
"outputHashes"
|
|
];
|
|
|
|
# Avoid recomputing values when passing args down
|
|
memoizedArgs = {
|
|
pname = args.pname or crateName.pname;
|
|
version = args.version or crateName.version;
|
|
cargoVendorDir = args.cargoVendorDir or (vendorCargoDeps args);
|
|
};
|
|
in
|
|
mkCargoDerivation (cleanedArgs // memoizedArgs // {
|
|
doCheck = args.doCheck or true;
|
|
doInstallCargoArtifacts = args.doInstallCargoArtifacts or false;
|
|
|
|
cargoArtifacts = args.cargoArtifacts or (
|
|
buildDepsOnly (args // memoizedArgs // {
|
|
# NB: we intentionally don't run any caller-provided hooks here since they might fail
|
|
# if they require any files that have been omitted by the source dummification.
|
|
# However, we still _do_ want to run the installation hook with the actual artifacts
|
|
installPhase = "prepareAndInstallCargoArtifactsDir";
|
|
})
|
|
);
|
|
|
|
buildPhaseCargoCommand = args.buildPhaseCargoCommand or ''
|
|
cargoBuildLog=$(mktemp cargoBuildLogXXXX.json)
|
|
${cargoBuildCommand} --message-format json-render-diagnostics ${cargoExtraArgs} >"$cargoBuildLog"
|
|
'';
|
|
|
|
checkPhaseCargoCommand = args.checkPhaseCargoCommand or ''
|
|
${cargoTestCommand} ${cargoExtraArgs} ${cargoTestExtraArgs}
|
|
'';
|
|
|
|
installPhaseCommand = args.installPhaseCommand or ''
|
|
if [ -n "$cargoBuildLog" -a -f "$cargoBuildLog" ]; then
|
|
installFromCargoBuildLog "$out" "$cargoBuildLog"
|
|
else
|
|
echo ${lib.strings.escapeShellArg ''
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
$cargoBuildLog is either undefined or does not point to a valid file location!
|
|
By default `buildPackage` will capture cargo's output and use it to determine which binaries
|
|
should be installed (instead of just guessing based on what is present in cargo's target directory).
|
|
If you are overriding the derivation with a custom build step, you have two options:
|
|
1. override `installPhaseCommand` with the appropriate installation steps
|
|
2. ensure that cargo's build log is captured in a file and point $cargoBuildLog at it
|
|
At a minimum, the latter option can be achieved with running:
|
|
cargoBuildLog=$(mktemp cargoBuildLogXXXX.json)
|
|
cargo build --release --message-format json-render-diagnostics >"$cargoBuildLog"
|
|
''}
|
|
|
|
false
|
|
fi
|
|
'';
|
|
|
|
nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [
|
|
# NB: avoid adding any non-hook packages here. Doing so will end up
|
|
# changing PKG_CONFIG_PATH and cause rebuilds of `*-sys` crates.
|
|
installFromCargoBuildLogHook
|
|
removeReferencesToVendoredSourcesHook
|
|
];
|
|
})
|