diff --git a/Cargo.lock b/Cargo.lock index d225c7815..397aa2d2c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -239,6 +239,31 @@ dependencies = [ "serde", ] +[[package]] +name = "cargo-platform" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84982c6c0ae343635a3a4ee6dedef965513735c8b183caa7289fa6e27399ebd4" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-util-schemas" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e63d2780ac94487eb9f1fea7b0d56300abc9eb488800854ca217f102f5caccca" +dependencies = [ + "semver", + "serde", + "serde-untagged", + "serde-value", + "thiserror 1.0.69", + "toml 0.8.23", + "unicode-xid", + "url", +] + [[package]] name = "cargo-xwin" version = "0.18.6" @@ -277,7 +302,7 @@ dependencies = [ "anyhow", "cargo-config2", "cargo-options", - "cargo_metadata", + "cargo_metadata 0.19.2", "clap", "crc", "dirs", @@ -300,7 +325,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" dependencies = [ "camino", - "cargo-platform", + "cargo-platform 0.1.9", + "semver", + "serde", + "serde_json", + "thiserror 2.0.17", +] + +[[package]] +name = "cargo_metadata" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7835cfc6135093070e95eb2b53e5d9b5c403dc3a6be6040ee026270aa82502" +dependencies = [ + "camino", + "cargo-platform 0.2.0", + "cargo-util-schemas", "semver", "serde", "serde_json", @@ -732,6 +772,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + [[package]] name = "errno" version = "0.3.14" @@ -1367,7 +1418,7 @@ dependencies = [ "cargo-options", "cargo-xwin", "cargo-zigbuild", - "cargo_metadata", + "cargo_metadata 0.20.0", "cbindgen", "cc", "clap", @@ -1575,6 +1626,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "number_prefix" version = "0.4.0" @@ -1643,6 +1703,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + [[package]] name = "os_pipe" version = "1.2.3" @@ -2282,6 +2351,28 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -2877,6 +2968,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" version = "1.19.0" diff --git a/Cargo.toml b/Cargo.toml index 9036ee4b5..9a1e3ee6b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,7 +43,7 @@ anyhow = "1.0.80" base64 = "0.22.0" glob = "0.3.0" cargo-config2 = "0.1.24" -cargo_metadata = "0.19.0" +cargo_metadata = "0.20.0" cargo-options = "0.7.2" cbindgen = { version = "0.29.0", default-features = false } flate2 = "1.0.18" diff --git a/src/build_options.rs b/src/build_options.rs index 489cb1eca..0e5e87c53 100644 --- a/src/build_options.rs +++ b/src/build_options.rs @@ -946,16 +946,16 @@ fn filter_cargo_targets( config_targets: Option<&[crate::pyproject_toml::CargoTarget]>, ) -> Result> { let root_pkg = cargo_metadata.root_package().unwrap(); - let resolved_features = cargo_metadata + let resolved_features: Vec = cargo_metadata .resolve .as_ref() - .and_then(|resolve| resolve.nodes.iter().find(|node| node.id == root_pkg.id)) - .map(|node| node.features.clone()) + .and_then(|resolve| resolve.nodes.iter().find(|&node| node.id == root_pkg.id)) + .map(|node| node.features.iter().map(|f| f.to_string()).collect()) .unwrap_or_default(); let mut targets: Vec<_> = root_pkg .targets .iter() - .filter(|target| match bridge { + .filter(|&target| match bridge { BridgeModel::Bin(_) => { let is_bin = target.is_bin(); if target.required_features.is_empty() { @@ -1028,15 +1028,19 @@ fn filter_cargo_targets( fn has_abi3(deps: &HashMap<&str, &Node>) -> Result> { for &lib in PYO3_BINDING_CRATES.iter() { let lib = lib.as_str(); - if let Some(pyo3_crate) = deps.get(lib) { + if let Some(&pyo3_crate) = deps.get(lib) { // Find the minimal abi3 python version. If there is none, abi3 hasn't been selected // This parser abi3-py{major}{minor} and returns the minimal (major, minor) tuple - let abi3_selected = pyo3_crate.features.iter().any(|x| x == "abi3"); + let abi3_selected = pyo3_crate + .features + .iter() + .map(AsRef::as_ref) + .any(|x| x == "abi3"); let min_abi3_version = pyo3_crate .features .iter() - .filter(|x| x.starts_with("abi3-py") && x.len() >= "abi3-pyxx".len()) + .filter(|&x| x.starts_with("abi3-py") && x.len() >= "abi3-pyxx".len()) .map(|x| { Ok(( (x.as_bytes()[7] as char).to_string().parse::()?, @@ -1072,10 +1076,11 @@ fn is_generating_import_lib(cargo_metadata: &Metadata) -> Result { .filter(|package| cargo_metadata[&package.id].name.as_str() == lib) .collect::>(); match pyo3_packages.as_slice() { - [pyo3_crate] => { + &[pyo3_crate] => { let generate_import_lib = pyo3_crate .features .iter() + .map(AsRef::as_ref) .any(|x| x == "generate-import-lib" || x == "generate-abi3-import-lib"); return Ok(generate_import_lib); } @@ -1176,9 +1181,9 @@ pub fn find_bridge(cargo_metadata: &Metadata, bridge: Option<&str>) -> Result
) -> Result
Option<(u64, u64, .packages .iter() .filter_map(|pkg| { - let name = &pkg.name; + let name = pkg.name.as_ref(); if name == "pyo3" || name == "pyo3-ffi" { - Some((name.as_ref(), pkg)) + Some((name, pkg)) } else { None } diff --git a/src/metadata.rs b/src/metadata.rs index e8c0c9adc..345ebe333 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -536,7 +536,7 @@ impl Metadata24 { license: package.license.clone(), license_files, project_url, - ..Metadata24::new(name, version) + ..Metadata24::new(name.to_string(), version) }; Ok(metadata) } diff --git a/src/source_distribution.rs b/src/source_distribution.rs index e701d783f..58bb4554b 100644 --- a/src/source_distribution.rs +++ b/src/source_distribution.rs @@ -343,7 +343,7 @@ pub fn find_path_deps(cargo_metadata: &Metadata) -> Result Result