diff --git a/src/bindgen/cargo/cargo.rs b/src/bindgen/cargo/cargo.rs index da8134359..fc1a247df 100644 --- a/src/bindgen/cargo/cargo.rs +++ b/src/bindgen/cargo/cargo.rs @@ -46,10 +46,13 @@ impl Cargo { clean: bool, ) -> Result { let toml_path = crate_dir.join("Cargo.toml"); - let lock_path = match lock_file { - Some(v) => PathBuf::from(v), - None => crate_dir.join("Cargo.lock"), - }; + let metadata = cargo_metadata::metadata(&toml_path) + .map_err(|x| Error::CargoMetadata(toml_path.to_str().unwrap().to_owned(), x))?; + let lock_path = lock_file + .map(PathBuf::from) + .unwrap_or_else(|| { + Path::new(&metadata.workspace_root).join("Cargo.lock") + }); let lock = if use_cargo_lock { match cargo_lock::lock(&lock_path) { @@ -62,8 +65,6 @@ impl Cargo { } else { None }; - let metadata = cargo_metadata::metadata(&toml_path) - .map_err(|x| Error::CargoMetadata(toml_path.to_str().unwrap().to_owned(), x))?; // Use the specified binding crate name or infer it from the manifest let manifest = cargo_toml::manifest(&toml_path) diff --git a/src/bindgen/cargo/cargo_metadata.rs b/src/bindgen/cargo/cargo_metadata.rs index a46bc2b51..0705a74cf 100644 --- a/src/bindgen/cargo/cargo_metadata.rs +++ b/src/bindgen/cargo/cargo_metadata.rs @@ -24,6 +24,8 @@ pub struct Metadata { /// A list of all crates referenced by this crate (and the crate itself) pub packages: Vec, version: usize, + /// path to the workspace containing the `Cargo.lock` + pub workspace_root: String, } #[derive(Clone, Deserialize, Debug)]