@@ -12,7 +12,7 @@ use crate::manifest::{get_package_manifest, pg_config_and_version};
1212use crate :: profile:: CargoProfile ;
1313use crate :: CommandExecute ;
1414use cargo_toml:: Manifest ;
15- use eyre:: WrapErr ;
15+ use eyre:: { eyre , WrapErr } ;
1616use object:: read:: macho:: MachOFatFile32 ;
1717use owo_colors:: OwoColorize ;
1818use 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 {
0 commit comments