Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 27 additions & 6 deletions cargo-pgrx/src/command/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -215,9 +215,10 @@ pub(crate) fn generate_schema(
&flags,
embed.path(),
&package_name,
&manifest,
)?;

compute_sql(&package_name, &manifest)?;
compute_sql(&manifest)?;

Ok(())
}
Expand Down Expand Up @@ -495,6 +496,7 @@ fn second_build(
flags: &str,
embed_path: impl AsRef<Path>,
package_name: &str,
manifest: &Manifest,
) -> eyre::Result<()> {
let mut command = crate::env::cargo();
command.stdin(Stdio::null());
Expand All @@ -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);
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -594,7 +596,26 @@ fn compute_sql(package_name: &str, manifest: &Manifest) -> eyre::Result<()> {
Ok(())
}

fn parse_object(data: &[u8]) -> object::Result<object::File<'_>> {
fn pgrx_embed_name(manifest: &Manifest) -> eyre::Result<String> {
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<object::File> {
let kind = object::FileKind::parse(data)?;

match kind {
Expand Down
39 changes: 11 additions & 28 deletions pgrx-pg-config/src/cargo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,6 @@ pub trait PgrxManifestExt {
/// <https://doc.rust-lang.org/cargo/reference/cargo-targets.html#the-name-field>
fn lib_name(&self) -> eyre::Result<String>;

/// Resolved string for target artifact name, used for matching on
/// `cargo_metadata::message::Artifact`.
fn target_name(&self) -> eyre::Result<String>;

/// Resolved string for target library name extension filename
fn lib_filename(&self) -> eyre::Result<String>;
}
Expand Down Expand Up @@ -62,35 +58,22 @@ impl PgrxManifestExt for Manifest {
}

fn lib_name(&self) -> eyre::Result<String> {
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<String> {
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<String> {
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))
}
}

Expand Down
2 changes: 1 addition & 1 deletion pgrx-tests/src/framework.rs
Original file line number Diff line number Diff line change
Expand Up @@ -847,7 +847,7 @@ fn get_extension_name() -> eyre::Result<String> {
// 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<PathBuf> {
Expand Down
Loading