diff --git a/src/bindgen/cargo/cargo.rs b/src/bindgen/cargo/cargo.rs index 1718a3d..5470b86 100644 --- a/src/bindgen/cargo/cargo.rs +++ b/src/bindgen/cargo/cargo.rs @@ -135,6 +135,26 @@ impl Cargo { .map(|dep| { let (dep_name, dep_version) = parse_dep_string(dep); + // If a version was not specified find the only package with the name of the dependency + let dep_version = dep_version.or_else(|| { + let mut versions = self.metadata.packages.iter().filter_map(|package| { + if package.name_and_version.name != dep_name { + return None; + } + package.name_and_version.version.as_ref().map(|v| v.as_str()) + }); + + // If the iterator contains more items, meaning multiple versions of the same + // package are present, warn! amd abort. + let version = versions.next(); + if versions.next().is_none() { + version + } else { + warn!("when looking for a version for package {}, multiple versions where found", dep_name); + None + } + }); + // Try to find the cfgs in the Cargo.toml let cfg = self .metadata diff --git a/tests/expectations/both/dep_v2.c b/tests/expectations/both/dep_v2.c new file mode 100644 index 0000000..4012289 --- /dev/null +++ b/tests/expectations/both/dep_v2.c @@ -0,0 +1,11 @@ +#include +#include +#include +#include + +typedef struct dep_struct { + uint32_t x; + double y; +} dep_struct; + +uint32_t get_x(const dep_struct *dep_struct); diff --git a/tests/expectations/both/dep_v2.compat.c b/tests/expectations/both/dep_v2.compat.c new file mode 100644 index 0000000..056089e --- /dev/null +++ b/tests/expectations/both/dep_v2.compat.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +typedef struct dep_struct { + uint32_t x; + double y; +} dep_struct; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +uint32_t get_x(const dep_struct *dep_struct); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus diff --git a/tests/expectations/dep_v2.c b/tests/expectations/dep_v2.c new file mode 100644 index 0000000..3d2cf8e --- /dev/null +++ b/tests/expectations/dep_v2.c @@ -0,0 +1,11 @@ +#include +#include +#include +#include + +typedef struct { + uint32_t x; + double y; +} dep_struct; + +uint32_t get_x(const dep_struct *dep_struct); diff --git a/tests/expectations/dep_v2.compat.c b/tests/expectations/dep_v2.compat.c new file mode 100644 index 0000000..4dc7fb3 --- /dev/null +++ b/tests/expectations/dep_v2.compat.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +typedef struct { + uint32_t x; + double y; +} dep_struct; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +uint32_t get_x(const dep_struct *dep_struct); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus diff --git a/tests/expectations/dep_v2.cpp b/tests/expectations/dep_v2.cpp new file mode 100644 index 0000000..f03f098 --- /dev/null +++ b/tests/expectations/dep_v2.cpp @@ -0,0 +1,15 @@ +#include +#include +#include +#include + +struct dep_struct { + uint32_t x; + double y; +}; + +extern "C" { + +uint32_t get_x(const dep_struct *dep_struct); + +} // extern "C" diff --git a/tests/expectations/tag/dep_v2.c b/tests/expectations/tag/dep_v2.c new file mode 100644 index 0000000..45fcba6 --- /dev/null +++ b/tests/expectations/tag/dep_v2.c @@ -0,0 +1,11 @@ +#include +#include +#include +#include + +struct dep_struct { + uint32_t x; + double y; +}; + +uint32_t get_x(const struct dep_struct *dep_struct); diff --git a/tests/expectations/tag/dep_v2.compat.c b/tests/expectations/tag/dep_v2.compat.c new file mode 100644 index 0000000..344af64 --- /dev/null +++ b/tests/expectations/tag/dep_v2.compat.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +struct dep_struct { + uint32_t x; + double y; +}; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +uint32_t get_x(const struct dep_struct *dep_struct); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus diff --git a/tests/rust/dep_v2/Cargo.lock b/tests/rust/dep_v2/Cargo.lock new file mode 100644 index 0000000..8019bb0 --- /dev/null +++ b/tests/rust/dep_v2/Cargo.lock @@ -0,0 +1,12 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "dep" +version = "0.1.0" + +[[package]] +name = "expand-dep" +version = "0.1.0" +dependencies = [ + "dep", +] diff --git a/tests/rust/dep_v2/Cargo.toml b/tests/rust/dep_v2/Cargo.toml new file mode 100644 index 0000000..40e3e8b --- /dev/null +++ b/tests/rust/dep_v2/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "expand-dep" +version = "0.1.0" +authors = ["cbindgen"] +edition = "2018" + +[dependencies] +dep = { path = "dep" } diff --git a/tests/rust/dep_v2/cbindgen.toml b/tests/rust/dep_v2/cbindgen.toml new file mode 100644 index 0000000..ac9c278 --- /dev/null +++ b/tests/rust/dep_v2/cbindgen.toml @@ -0,0 +1,3 @@ +[parse] +parse_deps = true +include = ["dep"] diff --git a/tests/rust/dep_v2/dep/Cargo.toml b/tests/rust/dep_v2/dep/Cargo.toml new file mode 100644 index 0000000..1cc8d62 --- /dev/null +++ b/tests/rust/dep_v2/dep/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "dep" +version = "0.1.0" +authors = ["cbindgen"] +edition = "2018" + +[dependencies] diff --git a/tests/rust/dep_v2/dep/src/lib.rs b/tests/rust/dep_v2/dep/src/lib.rs new file mode 100644 index 0000000..7253c57 --- /dev/null +++ b/tests/rust/dep_v2/dep/src/lib.rs @@ -0,0 +1,5 @@ +#[repr(C)] +pub struct dep_struct { + pub x: u32, + pub y: f64, +} diff --git a/tests/rust/dep_v2/src/lib.rs b/tests/rust/dep_v2/src/lib.rs new file mode 100644 index 0000000..639678d --- /dev/null +++ b/tests/rust/dep_v2/src/lib.rs @@ -0,0 +1,6 @@ +use dep::dep_struct; + +#[no_mangle] +pub unsafe extern "C" fn get_x(dep_struct: *const dep_struct) -> u32 { + dep_struct.read().x +}