Skip to content

Commit 4fe6e19

Browse files
Detect pgrx_embed name from lib name (#2035)
Co-authored-by: Eric Ridge <eebbrr@gmail.com>
1 parent 7825b97 commit 4fe6e19

3 files changed

Lines changed: 39 additions & 35 deletions

File tree

cargo-pgrx/src/command/schema.rs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::manifest::{get_package_manifest, pg_config_and_version};
1212
use crate::profile::CargoProfile;
1313
use crate::CommandExecute;
1414
use cargo_toml::Manifest;
15-
use eyre::WrapErr;
15+
use eyre::{eyre, WrapErr};
1616
use object::read::macho::MachOFatFile32;
1717
use owo_colors::OwoColorize;
1818
use pgrx_pg_config::cargo::PgrxManifestExt;
@@ -215,9 +215,10 @@ pub(crate) fn generate_schema(
215215
&flags,
216216
embed.path(),
217217
&package_name,
218+
&manifest,
218219
)?;
219220

220-
compute_sql(&package_name, &manifest)?;
221+
compute_sql(&manifest)?;
221222

222223
Ok(())
223224
}
@@ -495,6 +496,7 @@ fn second_build(
495496
flags: &str,
496497
embed_path: impl AsRef<Path>,
497498
package_name: &str,
499+
manifest: &Manifest,
498500
) -> eyre::Result<()> {
499501
let mut command = crate::env::cargo();
500502
command.stdin(Stdio::null());
@@ -505,7 +507,7 @@ fn second_build(
505507
// The only cargo command respecting our need is `cargo rustc`
506508
command.arg("rustc");
507509
command.arg("--bin");
508-
command.arg(format!("pgrx_embed_{package_name}"));
510+
command.arg(pgrx_embed_name(manifest)?);
509511

510512
command.arg("--package");
511513
command.arg(package_name);
@@ -563,10 +565,10 @@ fn second_build(
563565
Ok(())
564566
}
565567

566-
fn compute_sql(package_name: &str, manifest: &Manifest) -> eyre::Result<()> {
568+
fn compute_sql(manifest: &Manifest) -> eyre::Result<()> {
567569
let mut bin = get_target_dir()?;
568570
bin.push("debug"); // pgrx_embed_ is always compiled in debug mode
569-
bin.push(format!("pgrx_embed_{package_name}"));
571+
bin.push(pgrx_embed_name(manifest)?);
570572

571573
let mut command = std::process::Command::new(bin);
572574
command.stdin(Stdio::inherit());
@@ -594,7 +596,26 @@ fn compute_sql(package_name: &str, manifest: &Manifest) -> eyre::Result<()> {
594596
Ok(())
595597
}
596598

597-
fn parse_object(data: &[u8]) -> object::Result<object::File<'_>> {
599+
fn pgrx_embed_name(manifest: &Manifest) -> eyre::Result<String> {
600+
fn name_from(s: &str) -> String {
601+
format!("pgrx_embed_{s}")
602+
}
603+
604+
let package_name = name_from(&manifest.package_name()?);
605+
let lib_name = name_from(&manifest.lib_name()?);
606+
(&manifest.bin)
607+
.into_iter()
608+
.find(|bin| {
609+
// As cargo_anifest autofills lib.name if it's empty, it's impossible to
610+
// check only against one name. Perhaps, cargo-util-schemas can help with that.
611+
bin.name.as_ref().is_some_and(|name| name == &package_name || name == &lib_name)
612+
})
613+
.map(|bin| bin.name.to_owned())
614+
.flatten()
615+
.ok_or_else(|| eyre!("Failed to find a pgrx_embed binary."))
616+
}
617+
618+
fn parse_object(data: &[u8]) -> object::Result<object::File> {
598619
let kind = object::FileKind::parse(data)?;
599620

600621
match kind {

pgrx-pg-config/src/cargo.rs

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@ pub trait PgrxManifestExt {
2727
/// <https://doc.rust-lang.org/cargo/reference/cargo-targets.html#the-name-field>
2828
fn lib_name(&self) -> eyre::Result<String>;
2929

30-
/// Resolved string for target artifact name, used for matching on
31-
/// `cargo_metadata::message::Artifact`.
32-
fn target_name(&self) -> eyre::Result<String>;
33-
3430
/// Resolved string for target library name extension filename
3531
fn lib_filename(&self) -> eyre::Result<String>;
3632
}
@@ -62,35 +58,22 @@ impl PgrxManifestExt for Manifest {
6258
}
6359

6460
fn lib_name(&self) -> eyre::Result<String> {
65-
match &self.package {
66-
Some(_) => match &self.lib {
67-
Some(lib) => match &lib.name {
68-
// `cargo_manifest` auto fills lib.name with package.name;
69-
// hyphen replaced with underscore if crate type is lib.
70-
// So we will always have a lib.name for lib crates.
71-
Some(lib_name) => Ok(lib_name.to_owned()),
72-
None => Err(eyre!("Could not get [lib] name from manifest.")),
73-
},
74-
None => Err(eyre!("Could not get [lib] name from manifest.")),
75-
},
76-
None => Err(eyre!("Could not get [lib] name from manifest.")),
77-
}
78-
}
79-
80-
fn target_name(&self) -> eyre::Result<String> {
81-
let package = self.package_name()?;
82-
let lib = self.lib_name()?;
83-
if package.replace('-', "_") == lib {
84-
Ok(package)
85-
} else {
86-
Ok(lib)
87-
}
61+
// `cargo_manifest` auto fills lib.name with package.name;
62+
// hyphen replaced with underscore if crate type is lib.
63+
// So we will always have a lib.name for lib crates.
64+
Ok(self
65+
.package
66+
.as_ref()
67+
.and_then(|_| self.lib.as_ref())
68+
.map(|lib| lib.name.to_owned())
69+
.flatten()
70+
.ok_or_else(|| eyre!("Could not get [lib] name from manifest."))?)
8871
}
8972

9073
fn lib_filename(&self) -> eyre::Result<String> {
9174
use std::env::consts::{DLL_PREFIX, DLL_SUFFIX};
9275
let lib_name = &self.lib_name()?;
93-
Ok(format!("{DLL_PREFIX}{}{DLL_SUFFIX}", lib_name.replace('-', "_")))
76+
Ok(format!("{DLL_PREFIX}{}{DLL_SUFFIX}", lib_name))
9477
}
9578
}
9679

pgrx-tests/src/framework.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -847,7 +847,7 @@ fn get_extension_name() -> eyre::Result<String> {
847847
// https://github.com/rust-lang/cargo/issues/45
848848
let path = PathBuf::from(dir).join("Cargo.toml");
849849
let name = pgrx_pg_config::cargo::read_manifest(path)?.lib_name()?;
850-
Ok(name.replace('-', "_"))
850+
Ok(name)
851851
}
852852

853853
fn get_pgdata_path() -> eyre::Result<PathBuf> {

0 commit comments

Comments
 (0)