diff --git a/cargo-pgrx/src/command/schema.rs b/cargo-pgrx/src/command/schema.rs index 21d8aa1d97..47b097cd52 100644 --- a/cargo-pgrx/src/command/schema.rs +++ b/cargo-pgrx/src/command/schema.rs @@ -12,7 +12,7 @@ use crate::manifest::{get_package_manifest, pg_config_and_version}; use crate::profile::CargoProfile; use crate::CommandExecute; use cargo_toml::Manifest; -use eyre::WrapErr; +use eyre::{eyre, WrapErr}; use object::read::macho::MachOFatFile32; use owo_colors::OwoColorize; use pgrx_pg_config::cargo::PgrxManifestExt; @@ -215,9 +215,10 @@ pub(crate) fn generate_schema( &flags, embed.path(), &package_name, + &manifest, )?; - compute_sql(&package_name, &manifest)?; + compute_sql(&manifest)?; Ok(()) } @@ -495,6 +496,7 @@ fn second_build( flags: &str, embed_path: impl AsRef, package_name: &str, + manifest: &Manifest, ) -> eyre::Result<()> { let mut command = crate::env::cargo(); command.stdin(Stdio::null()); @@ -505,7 +507,7 @@ fn second_build( // The only cargo command respecting our need is `cargo rustc` command.arg("rustc"); command.arg("--bin"); - command.arg(format!("pgrx_embed_{package_name}")); + command.arg(pgrx_embed_name(manifest)?); command.arg("--package"); command.arg(package_name); @@ -563,10 +565,10 @@ fn second_build( Ok(()) } -fn compute_sql(package_name: &str, manifest: &Manifest) -> eyre::Result<()> { +fn compute_sql(manifest: &Manifest) -> eyre::Result<()> { let mut bin = get_target_dir()?; bin.push("debug"); // pgrx_embed_ is always compiled in debug mode - bin.push(format!("pgrx_embed_{package_name}")); + bin.push(pgrx_embed_name(manifest)?); let mut command = std::process::Command::new(bin); command.stdin(Stdio::inherit()); @@ -594,7 +596,26 @@ fn compute_sql(package_name: &str, manifest: &Manifest) -> eyre::Result<()> { Ok(()) } -fn parse_object(data: &[u8]) -> object::Result> { +fn pgrx_embed_name(manifest: &Manifest) -> eyre::Result { + fn name_from(s: &str) -> String { + format!("pgrx_embed_{s}") + } + + let package_name = name_from(&manifest.package_name()?); + let lib_name = name_from(&manifest.lib_name()?); + (&manifest.bin) + .into_iter() + .find(|bin| { + // As cargo_anifest autofills lib.name if it's empty, it's impossible to + // check only against one name. Perhaps, cargo-util-schemas can help with that. + bin.name.as_ref().is_some_and(|name| name == &package_name || name == &lib_name) + }) + .map(|bin| bin.name.to_owned()) + .flatten() + .ok_or_else(|| eyre!("Failed to find a pgrx_embed binary.")) +} + +fn parse_object(data: &[u8]) -> object::Result { let kind = object::FileKind::parse(data)?; match kind { diff --git a/pgrx-pg-config/src/cargo.rs b/pgrx-pg-config/src/cargo.rs index c9394135d6..3d38e478f0 100644 --- a/pgrx-pg-config/src/cargo.rs +++ b/pgrx-pg-config/src/cargo.rs @@ -27,10 +27,6 @@ pub trait PgrxManifestExt { /// fn lib_name(&self) -> eyre::Result; - /// Resolved string for target artifact name, used for matching on - /// `cargo_metadata::message::Artifact`. - fn target_name(&self) -> eyre::Result; - /// Resolved string for target library name extension filename fn lib_filename(&self) -> eyre::Result; } @@ -62,35 +58,22 @@ impl PgrxManifestExt for Manifest { } fn lib_name(&self) -> eyre::Result { - match &self.package { - Some(_) => match &self.lib { - Some(lib) => match &lib.name { - // `cargo_manifest` auto fills lib.name with package.name; - // hyphen replaced with underscore if crate type is lib. - // So we will always have a lib.name for lib crates. - Some(lib_name) => Ok(lib_name.to_owned()), - None => Err(eyre!("Could not get [lib] name from manifest.")), - }, - None => Err(eyre!("Could not get [lib] name from manifest.")), - }, - None => Err(eyre!("Could not get [lib] name from manifest.")), - } - } - - fn target_name(&self) -> eyre::Result { - let package = self.package_name()?; - let lib = self.lib_name()?; - if package.replace('-', "_") == lib { - Ok(package) - } else { - Ok(lib) - } + // `cargo_manifest` auto fills lib.name with package.name; + // hyphen replaced with underscore if crate type is lib. + // So we will always have a lib.name for lib crates. + Ok(self + .package + .as_ref() + .and_then(|_| self.lib.as_ref()) + .map(|lib| lib.name.to_owned()) + .flatten() + .ok_or_else(|| eyre!("Could not get [lib] name from manifest."))?) } fn lib_filename(&self) -> eyre::Result { use std::env::consts::{DLL_PREFIX, DLL_SUFFIX}; let lib_name = &self.lib_name()?; - Ok(format!("{DLL_PREFIX}{}{DLL_SUFFIX}", lib_name.replace('-', "_"))) + Ok(format!("{DLL_PREFIX}{}{DLL_SUFFIX}", lib_name)) } } diff --git a/pgrx-tests/src/framework.rs b/pgrx-tests/src/framework.rs index f8df69b76e..b85e4ceaea 100644 --- a/pgrx-tests/src/framework.rs +++ b/pgrx-tests/src/framework.rs @@ -847,7 +847,7 @@ fn get_extension_name() -> eyre::Result { // https://github.com/rust-lang/cargo/issues/45 let path = PathBuf::from(dir).join("Cargo.toml"); let name = pgrx_pg_config::cargo::read_manifest(path)?.lib_name()?; - Ok(name.replace('-', "_")) + Ok(name) } fn get_pgdata_path() -> eyre::Result {