Patching sources of dependency crates
Sometimes it is useful to patch the sources of dependency crates without needing to wait for an upstream release to include a necessary change, or without needing to use a custom git fork.
The vendorCargoDeps
, vendorCargoRegistries
, vendorGitDeps
, and
vendorMultipleCargoDeps
APIs support arbitrary overrides (i.e. patching) at
the individual crate/repo level when vendoring sources. Checkout their
respective API documentation for more details, but below is a short quick start
example:
let
baseArgs = {
src = craneLib.cleanCargoSource ./.;
};
isNumCpusRepo = p: lib.hasPrefix
"git+https://github.com/seanmonstar/num_cpus.git"
p.source;
isTag1_13_1 = p: lib.hasInfix
"tag=v1.13.1"
p.source;
cargoVendorDir = craneLib.vendorCargoDeps (baseArgs // {
# Use this function to override crates coming from git dependencies
overrideVendorGitCheckout = ps: drv:
# For example, patch a specific repository and tag, in this case num_cpus-1.13.1
if lib.any (p: (isNumCpusRepo p) && (isTag1_13_1 p)) ps then
drv.overrideAttrs (_old: {
# Specifying an arbitrary patch to apply
patches = [
./0001-patch-num-cpus.patch
];
# Similarly we can also run additional hooks to make changes
postPatch = ''
echo running some arbitrary command to make modifications
'';
})
else
# Nothing to change, leave the derivations as is
drv;
# Use this function to override crates coming from any registry checkout
overrideVendorCargoPackage = p: drv:
# For example, patch a specific crate, in this case byteorder-1.5.0
if p.name == "byteorder" && p.version == "1.5.0" then
drv.overrideAttrs (_old: {
# Specifying an arbitrary patch to apply
patches = [
./0001-patch-byteorder.patch
];
# Similarly we can also run additional hooks to make changes
postPatch = ''
echo running some arbitrary command to make modifications
'';
})
else
# Nothing to change, leave the derivations as is
drv;
});
commonArgs = baseArgs // {
inherit cargoVendorDir;
};
in
craneLib.buildPackage commonArgs