From f24ca4937f629e12cf34cf0a9c19ef2a78ea1b88 Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 24 Dec 2022 13:13:29 +0100 Subject: [PATCH 01/14] cargo-pgx: add cross-compilation options --- cargo-pgx/src/command/cross_options.rs | 51 ++++++++++++++++++++++++++ cargo-pgx/src/command/mod.rs | 1 + cargo-pgx/src/command/package.rs | 7 +++- 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 cargo-pgx/src/command/cross_options.rs diff --git a/cargo-pgx/src/command/cross_options.rs b/cargo-pgx/src/command/cross_options.rs new file mode 100644 index 0000000000..4eab95997a --- /dev/null +++ b/cargo-pgx/src/command/cross_options.rs @@ -0,0 +1,51 @@ +use clap::Args; +use std::path::PathBuf; + +#[derive(Args, Clone, Default, Debug)] +pub(crate) struct CrossBuildArgs { + /// Cross-compilation target - passing this option will make cargo-pgx assume we are cross-compiling + #[clap(long)] + pub(crate) target: Option, + /// Cross-compilation sysroot + #[clap(long)] + pub(crate) sysroot: Option, + /// Host sysroot + #[clap(long)] + pub(crate) host_sysroot: Option, + /// Host pg_config + #[clap(long)] + pub(crate) host_pg_config: Option, +} + +impl CrossBuildArgs { + pub(crate) fn is_cross_compiling(&self) -> bool { + self.target.is_some() + } + + pub(crate) fn to_build(&self) -> CrossBuild { + match self.is_cross_compiling() { + true => CrossBuild::Target { + target: self.target.clone().unwrap(), + sysroot: self.sysroot.clone(), + }, + false => CrossBuild::None, + } + } + + pub(crate) fn to_host_build(&self) -> CrossBuild { + match self.is_cross_compiling() { + true => CrossBuild::Host { + sysroot: self.host_sysroot.clone(), + pg_config: self.host_pg_config.clone(), + }, + false => CrossBuild::None, + } + } +} + +#[derive(Debug)] +pub(crate) enum CrossBuild { + None, + Target { target: String, sysroot: Option }, + Host { sysroot: Option, pg_config: Option }, +} diff --git a/cargo-pgx/src/command/mod.rs b/cargo-pgx/src/command/mod.rs index e92b1ad92a..eca474405d 100644 --- a/cargo-pgx/src/command/mod.rs +++ b/cargo-pgx/src/command/mod.rs @@ -8,6 +8,7 @@ Use of this source code is governed by the MIT license that can be found in the */ pub(crate) mod connect; +pub(crate) mod cross_options; pub(crate) mod get; pub(crate) mod init; pub(crate) mod install; diff --git a/cargo-pgx/src/command/package.rs b/cargo-pgx/src/command/package.rs index 6cde31d601..8395bb4e22 100644 --- a/cargo-pgx/src/command/package.rs +++ b/cargo-pgx/src/command/package.rs @@ -7,6 +7,7 @@ All rights reserved. Use of this source code is governed by the MIT license that can be found in the LICENSE file. */ +use crate::command::cross_options::CrossBuildArgs; use crate::command::install::install_extension; use crate::manifest::{display_version_info, PgVersionSource}; use crate::CommandExecute; @@ -32,6 +33,8 @@ pub(crate) struct Package { /// Specific profile to use (conflicts with `--debug`) #[clap(long)] profile: Option, + #[command(flatten)] + cross_args: CrossBuildArgs, /// Build in test mode (for `cargo pgx test`) #[clap(long)] test: bool, @@ -96,8 +99,8 @@ impl CommandExecute for Package { } #[tracing::instrument(level = "error", skip_all, fields( - pg_version = %pg_config.version()?, - profile = ?profile, + pg_version = % pg_config.version() ?, + profile = ? profile, test = is_test, ))] pub(crate) fn package_extension( From ca11ce0613b3e6a9132c93959f5c612d8ca37afa Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 24 Dec 2022 14:09:11 +0100 Subject: [PATCH 02/14] cargo-pgx: initial cross-compilation support --- cargo-pgx/src/command/install.rs | 66 ++++++++++++++++++++++++++++++-- cargo-pgx/src/command/package.rs | 3 ++ cargo-pgx/src/command/run.rs | 2 + cargo-pgx/src/command/schema.rs | 32 ++++++++++++++-- 4 files changed, 96 insertions(+), 7 deletions(-) diff --git a/cargo-pgx/src/command/install.rs b/cargo-pgx/src/command/install.rs index 99d497c6a6..21f964d7e2 100644 --- a/cargo-pgx/src/command/install.rs +++ b/cargo-pgx/src/command/install.rs @@ -7,6 +7,7 @@ All rights reserved. Use of this source code is governed by the MIT license that can be found in the LICENSE file. */ +use crate::command::cross_options::{CrossBuild, CrossBuildArgs}; use crate::command::get::{find_control_file, get_property}; use crate::manifest::{display_version_info, PgVersionSource}; use crate::profile::CargoProfile; @@ -84,6 +85,7 @@ impl CommandExecute for Install { package_manifest_path, &pg_config, &profile, + &CrossBuildArgs::default(), self.test, None, &self.features, @@ -104,6 +106,7 @@ pub(crate) fn install_extension( package_manifest_path: impl AsRef, pg_config: &PgConfig, profile: &CargoProfile, + cross_args: &CrossBuildArgs, is_test: bool, base_directory: Option, features: &clap_cargo::Features, @@ -124,8 +127,13 @@ pub(crate) fn install_extension( let versioned_so = get_property(&package_manifest_path, "module_pathname")?.is_none(); - let build_command_output = - build_extension(user_manifest_path.as_ref(), user_package, &profile, &features)?; + let build_command_output = build_extension( + &user_manifest_path.as_ref(), + user_package, + &profile, + &features, + &cross_args.to_build(), + )?; let build_command_bytes = build_command_output.stdout; let build_command_reader = BufReader::new(build_command_bytes.as_slice()); let build_command_stream = cargo_metadata::Message::parse_stream(build_command_reader); @@ -179,6 +187,7 @@ pub(crate) fn install_extension( &package_manifest_path, pg_config, profile, + cross_args, is_test, features, &extdir, @@ -224,10 +233,11 @@ fn copy_file( } pub(crate) fn build_extension( - user_manifest_path: Option>, + user_manifest_path: &Option>, user_package: Option<&String>, profile: &CargoProfile, features: &clap_cargo::Features, + cross_options: &CrossBuild, ) -> eyre::Result { let flags = std::env::var("PGX_BUILD_FLAGS").unwrap_or_default(); @@ -259,6 +269,54 @@ pub(crate) fn build_extension( command.arg("--all-features"); } + fn apply_sysroot(command: &mut Command, sysroot: &Option) -> eyre::Result<()> { + if let Some(ref sysroot) = sysroot { + let sysroot_str = sysroot.to_str().ok_or(eyre!("sysroot is not valid utf-8"))?; + let sysroot_arg = format!("--sysroot={sysroot_str}"); + command.env("BINDGEN_EXTRA_CLANG_ARGS", &sysroot_arg); + command.env("PG_CFLAGS", &sysroot_arg); + } + + Ok(()) + } + + // set PG_CONFIG + match cross_options { + CrossBuild::None | CrossBuild::Target { .. } => { + if let Some(pg_config) = std::env::var_os("PGX_PG_CONFIG_PATH") { + command.env("PG_CONFIG", pg_config); + } + } + CrossBuild::Host { pg_config, .. } => { + if let Some(ref host_pg_config) = pg_config { + command.env("PGX_PG_CONFIG_PATH", host_pg_config); + command.env("PF_CONFIG", host_pg_config); + } + } + } + + // sysroot and target handling + match cross_options { + CrossBuild::None => {} + CrossBuild::Target { target, sysroot } => { + command.arg("--target"); + command.arg(target); + + apply_sysroot(&mut command, &sysroot)?; + } + CrossBuild::Host { sysroot, .. } => { + let var_names = vec!["CC", "LD", "CFLAGS", "LDFLAGS"]; + for var in var_names { + let host_v = "HOST_".to_owned() + var; + if let Some(value) = std::env::var_os(host_v) { + command.env(var, value); + } + } + + apply_sysroot(&mut command, &sysroot)?; + } + } + command.arg("--message-format=json-render-diagnostics"); for arg in flags.split_ascii_whitespace() { @@ -300,6 +358,7 @@ fn copy_sql_files( package_manifest_path: impl AsRef, pg_config: &PgConfig, profile: &CargoProfile, + cross_args: &CrossBuildArgs, is_test: bool, features: &clap_cargo::Features, extdir: &PathBuf, @@ -315,6 +374,7 @@ fn copy_sql_files( user_package, &package_manifest_path, profile, + cross_args, is_test, features, Some(&dest), diff --git a/cargo-pgx/src/command/package.rs b/cargo-pgx/src/command/package.rs index 8395bb4e22..e2885aff1b 100644 --- a/cargo-pgx/src/command/package.rs +++ b/cargo-pgx/src/command/package.rs @@ -92,6 +92,7 @@ impl CommandExecute for Package { &pg_config, out_dir, &profile, + &self.cross_args, self.test, &self.features, ) @@ -110,6 +111,7 @@ pub(crate) fn package_extension( pg_config: &PgConfig, out_dir: PathBuf, profile: &CargoProfile, + cross_args: &CrossBuildArgs, is_test: bool, features: &clap_cargo::Features, ) -> eyre::Result<()> { @@ -124,6 +126,7 @@ pub(crate) fn package_extension( &package_manifest_path, pg_config, profile, + cross_args, is_test, Some(out_dir), features, diff --git a/cargo-pgx/src/command/run.rs b/cargo-pgx/src/command/run.rs index 46e63a3f1e..cb6b31bec8 100644 --- a/cargo-pgx/src/command/run.rs +++ b/cargo-pgx/src/command/run.rs @@ -7,6 +7,7 @@ All rights reserved. Use of this source code is governed by the MIT license that can be found in the LICENSE file. */ +use crate::command::cross_options::CrossBuildArgs; use crate::command::get::get_property; use crate::command::install::install_extension; use crate::command::start::start_postgres; @@ -116,6 +117,7 @@ pub(crate) fn run( package_manifest_path, pg_config, profile, + &CrossBuildArgs::default(), false, None, features, diff --git a/cargo-pgx/src/command/schema.rs b/cargo-pgx/src/command/schema.rs index 9eeb1a4338..bfd591b75d 100644 --- a/cargo-pgx/src/command/schema.rs +++ b/cargo-pgx/src/command/schema.rs @@ -7,7 +7,7 @@ All rights reserved. Use of this source code is governed by the MIT license that can be found in the LICENSE file. */ use crate::command::get::{find_control_file, get_property}; -use crate::command::install::format_display_path; +use crate::command::install::{build_extension, format_display_path}; use crate::pgx_pg_sys_stub::PgxPgSysStub; use crate::profile::CargoProfile; use crate::CommandExecute; @@ -23,8 +23,11 @@ use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; // Since we support extensions with `#[no_std]` extern crate alloc; +use crate::command::cross_options::CrossBuildArgs; use crate::manifest::{get_package_manifest, pg_config_and_version}; use alloc::vec::Vec; +use std::env; +use std::ffi::OsString; // An apparent bug in `glibc` 2.17 prevents us from safely dropping this // otherwise users find issues such as https://github.com/tcdi/pgx/issues/572 @@ -112,6 +115,7 @@ impl CommandExecute for Schema { self.package.as_ref(), package_manifest_path, &profile, + &CrossBuildArgs::default(), self.test, &self.features, self.out.as_ref(), @@ -183,6 +187,7 @@ pub(crate) fn generate_schema( user_package: Option<&String>, package_manifest_path: impl AsRef, profile: &CargoProfile, + cross_args: &CrossBuildArgs, is_test: bool, features: &clap_cargo::Features, path: Option>, @@ -230,13 +235,17 @@ pub(crate) fn generate_schema( command.arg(user_package); } - if let Some(user_manifest_path) = user_manifest_path { + if let Some(ref user_manifest_path) = user_manifest_path { command.arg("--manifest-path"); command.arg(user_manifest_path.as_ref()); } command.args(profile.cargo_args()); + if cross_args.is_cross_compiling() { + command.env("RUSTFLAGS", env::var_os("HOST_RUSTFLAGS").unwrap_or(OsString::new())); + } + if let Some(log_level) = &log_level { command.env("RUST_LOG", log_level); } @@ -297,7 +306,8 @@ pub(crate) fn generate_schema( // The next action may take a few seconds, we'd like the user to know we're thinking. eprintln!("{} SQL entities", " Discovering".bold().green(),); - let postmaster_stub_built = create_stub(&postmaster_path, &postmaster_stub_dir)?; + let postmaster_stub_built = + create_stub(&postmaster_path, &postmaster_stub_dir, cross_args.is_cross_compiling())?; // Inspect the symbol table for a list of `__pgx_internals` we should have the generator call let mut lib_so = target_dir_with_profile.clone(); @@ -306,6 +316,17 @@ pub(crate) fn generate_schema( lib_so.push(&format!("lib{}{}", package_name.replace('-', "_"), so_extension)); + if cross_args.is_cross_compiling() && !lib_so.try_exists()? { + eprintln!("Native plugin doesn't exist, building"); + build_extension( + &user_manifest_path, + user_package, + profile, + features, + &cross_args.to_host_build(), + )?; + } + let lib_so_data = std::fs::read(&lib_so).wrap_err("couldn't read extension shared object")?; let lib_so_obj_file = object::File::parse(&*lib_so_data).wrap_err("couldn't parse extension shared object")?; @@ -480,6 +501,7 @@ pub(crate) fn generate_schema( fn create_stub( postmaster_path: impl AsRef, postmaster_stub_dir: impl AsRef, + cross_build: bool, ) -> eyre::Result { let postmaster_path = postmaster_path.as_ref(); let postmaster_stub_dir = postmaster_stub_dir.as_ref(); @@ -538,7 +560,9 @@ fn create_stub( let mut so_rustc_invocation = Command::new("rustc"); so_rustc_invocation.stderr(Stdio::inherit()); - if let Some(rustc_flags_str) = std::env::var("RUSTFLAGS").ok() { + let rustflags_var_name = if cross_build { "RUSTFLAGS" } else { "HOST_RUSTFLAG" }; + + if let Some(rustc_flags_str) = std::env::var(rustflags_var_name).ok() { let rustc_flags = rustc_flags_str.split(' ').collect::>(); so_rustc_invocation.args(rustc_flags); } From ececd93bdfe5d6d90a1877eaefd9e8c9a6c2ef11 Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 14 Jan 2023 13:38:54 +0100 Subject: [PATCH 03/14] cargo-pgx: cross-compilation: fix nits --- cargo-pgx/src/command/cross_options.rs | 18 ++++++++++-------- cargo-pgx/src/command/install.rs | 6 +++--- cargo-pgx/src/command/package.rs | 4 ++-- cargo-pgx/src/command/schema.rs | 4 ++-- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/cargo-pgx/src/command/cross_options.rs b/cargo-pgx/src/command/cross_options.rs index 4eab95997a..c4b654a960 100644 --- a/cargo-pgx/src/command/cross_options.rs +++ b/cargo-pgx/src/command/cross_options.rs @@ -23,22 +23,24 @@ impl CrossBuildArgs { } pub(crate) fn to_build(&self) -> CrossBuild { - match self.is_cross_compiling() { - true => CrossBuild::Target { + if self.is_cross_compiling() { + CrossBuild::Target { target: self.target.clone().unwrap(), sysroot: self.sysroot.clone(), - }, - false => CrossBuild::None, + } + } else { + CrossBuild::None } } pub(crate) fn to_host_build(&self) -> CrossBuild { - match self.is_cross_compiling() { - true => CrossBuild::Host { + if self.is_cross_compiling() { + CrossBuild::Host { sysroot: self.host_sysroot.clone(), pg_config: self.host_pg_config.clone(), - }, - false => CrossBuild::None, + } + } else { + CrossBuild::None } } } diff --git a/cargo-pgx/src/command/install.rs b/cargo-pgx/src/command/install.rs index 21f964d7e2..ee3625c800 100644 --- a/cargo-pgx/src/command/install.rs +++ b/cargo-pgx/src/command/install.rs @@ -270,7 +270,7 @@ pub(crate) fn build_extension( } fn apply_sysroot(command: &mut Command, sysroot: &Option) -> eyre::Result<()> { - if let Some(ref sysroot) = sysroot { + if let Some(sysroot) = &sysroot { let sysroot_str = sysroot.to_str().ok_or(eyre!("sysroot is not valid utf-8"))?; let sysroot_arg = format!("--sysroot={sysroot_str}"); command.env("BINDGEN_EXTRA_CLANG_ARGS", &sysroot_arg); @@ -290,7 +290,7 @@ pub(crate) fn build_extension( CrossBuild::Host { pg_config, .. } => { if let Some(ref host_pg_config) = pg_config { command.env("PGX_PG_CONFIG_PATH", host_pg_config); - command.env("PF_CONFIG", host_pg_config); + command.env("PG_CONFIG", host_pg_config); } } } @@ -305,7 +305,7 @@ pub(crate) fn build_extension( apply_sysroot(&mut command, &sysroot)?; } CrossBuild::Host { sysroot, .. } => { - let var_names = vec!["CC", "LD", "CFLAGS", "LDFLAGS"]; + let var_names = vec!["CC", "LD", "CFLAGS", "LDFLAGS", "AR"]; for var in var_names { let host_v = "HOST_".to_owned() + var; if let Some(value) = std::env::var_os(host_v) { diff --git a/cargo-pgx/src/command/package.rs b/cargo-pgx/src/command/package.rs index e2885aff1b..e66a7deacd 100644 --- a/cargo-pgx/src/command/package.rs +++ b/cargo-pgx/src/command/package.rs @@ -100,8 +100,8 @@ impl CommandExecute for Package { } #[tracing::instrument(level = "error", skip_all, fields( - pg_version = % pg_config.version() ?, - profile = ? profile, + pg_version = %pg_config.version()?, + profile = ?profile, test = is_test, ))] pub(crate) fn package_extension( diff --git a/cargo-pgx/src/command/schema.rs b/cargo-pgx/src/command/schema.rs index bfd591b75d..9f079293e4 100644 --- a/cargo-pgx/src/command/schema.rs +++ b/cargo-pgx/src/command/schema.rs @@ -235,7 +235,7 @@ pub(crate) fn generate_schema( command.arg(user_package); } - if let Some(ref user_manifest_path) = user_manifest_path { + if let Some(user_manifest_path) = &user_manifest_path { command.arg("--manifest-path"); command.arg(user_manifest_path.as_ref()); } @@ -560,7 +560,7 @@ fn create_stub( let mut so_rustc_invocation = Command::new("rustc"); so_rustc_invocation.stderr(Stdio::inherit()); - let rustflags_var_name = if cross_build { "RUSTFLAGS" } else { "HOST_RUSTFLAG" }; + let rustflags_var_name = if cross_build { "RUSTFLAGS" } else { "HOST_RUSTFLAGS" }; if let Some(rustc_flags_str) = std::env::var(rustflags_var_name).ok() { let rustc_flags = rustc_flags_str.split(' ').collect::>(); From aba2960d46a9ffeb57629225dbbebf0becc4a07c Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 14 Jan 2023 13:43:17 +0100 Subject: [PATCH 04/14] cargo-pgx: remove None variant from CrossBuild --- cargo-pgx/src/command/cross_options.rs | 17 ++++++++--------- cargo-pgx/src/command/install.rs | 12 ++++++------ 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/cargo-pgx/src/command/cross_options.rs b/cargo-pgx/src/command/cross_options.rs index c4b654a960..93072b5b03 100644 --- a/cargo-pgx/src/command/cross_options.rs +++ b/cargo-pgx/src/command/cross_options.rs @@ -22,32 +22,31 @@ impl CrossBuildArgs { self.target.is_some() } - pub(crate) fn to_build(&self) -> CrossBuild { + pub(crate) fn to_build(&self) -> Option { if self.is_cross_compiling() { - CrossBuild::Target { + Some(CrossBuild::Target { target: self.target.clone().unwrap(), sysroot: self.sysroot.clone(), - } + }) } else { - CrossBuild::None + None } } - pub(crate) fn to_host_build(&self) -> CrossBuild { + pub(crate) fn to_host_build(&self) -> Option { if self.is_cross_compiling() { - CrossBuild::Host { + Some(CrossBuild::Host { sysroot: self.host_sysroot.clone(), pg_config: self.host_pg_config.clone(), - } + }) } else { - CrossBuild::None + None } } } #[derive(Debug)] pub(crate) enum CrossBuild { - None, Target { target: String, sysroot: Option }, Host { sysroot: Option, pg_config: Option }, } diff --git a/cargo-pgx/src/command/install.rs b/cargo-pgx/src/command/install.rs index ee3625c800..a1f88a1eea 100644 --- a/cargo-pgx/src/command/install.rs +++ b/cargo-pgx/src/command/install.rs @@ -237,7 +237,7 @@ pub(crate) fn build_extension( user_package: Option<&String>, profile: &CargoProfile, features: &clap_cargo::Features, - cross_options: &CrossBuild, + cross_options: &Option, ) -> eyre::Result { let flags = std::env::var("PGX_BUILD_FLAGS").unwrap_or_default(); @@ -282,12 +282,12 @@ pub(crate) fn build_extension( // set PG_CONFIG match cross_options { - CrossBuild::None | CrossBuild::Target { .. } => { + None | Some(CrossBuild::Target { .. }) => { if let Some(pg_config) = std::env::var_os("PGX_PG_CONFIG_PATH") { command.env("PG_CONFIG", pg_config); } } - CrossBuild::Host { pg_config, .. } => { + Some(CrossBuild::Host { pg_config, .. }) => { if let Some(ref host_pg_config) = pg_config { command.env("PGX_PG_CONFIG_PATH", host_pg_config); command.env("PG_CONFIG", host_pg_config); @@ -297,14 +297,14 @@ pub(crate) fn build_extension( // sysroot and target handling match cross_options { - CrossBuild::None => {} - CrossBuild::Target { target, sysroot } => { + None => {} + Some(CrossBuild::Target { target, sysroot }) => { command.arg("--target"); command.arg(target); apply_sysroot(&mut command, &sysroot)?; } - CrossBuild::Host { sysroot, .. } => { + Some(CrossBuild::Host { sysroot, .. }) => { let var_names = vec!["CC", "LD", "CFLAGS", "LDFLAGS", "AR"]; for var in var_names { let host_v = "HOST_".to_owned() + var; From c0dddb6c902441816ef25c451a135f2769cea3fd Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 14 Jan 2023 16:12:05 +0100 Subject: [PATCH 05/14] cshim: Makefile: the PG_CONFIG assignment weak --- pgx-pg-sys/cshim/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgx-pg-sys/cshim/Makefile b/pgx-pg-sys/cshim/Makefile index cc0a7351a9..94902af5ee 100644 --- a/pgx-pg-sys/cshim/Makefile +++ b/pgx-pg-sys/cshim/Makefile @@ -21,6 +21,6 @@ all: ${STATIC_LIB_NAME} EXTRA_CLEAN += ${STATIC_LIB_NAME} -PG_CONFIG = pg_config +PG_CONFIG ?= pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) From 861f3c7074075c68b7eec43e33ea66acb65f546c Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 14 Jan 2023 21:40:06 +0100 Subject: [PATCH 06/14] shim: don't maul PATH in build.rs --- pgx-pg-sys/build.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/pgx-pg-sys/build.rs b/pgx-pg-sys/build.rs index 7f5964cd82..f089c52752 100644 --- a/pgx-pg-sys/build.rs +++ b/pgx-pg-sys/build.rs @@ -655,10 +655,8 @@ fn build_shim_for_version( shim_dst: &PathBuf, pg_config: &PgConfig, ) -> eyre::Result<()> { - let path_env = prefix_path(pg_config.parent_path()); let major_version = pg_config.major_version()?; - eprintln!("PATH for build_shim={}", path_env); eprintln!("shim_src={}", shim_src.display()); eprintln!("shim_dst={}", shim_dst.display()); @@ -686,7 +684,6 @@ fn build_shim_for_version( .arg("clean") .arg(&format!("libpgx-cshim-{}.a", major_version)) .env("PG_TARGET_VERSION", format!("{}", major_version)) - .env("PATH", path_env) .current_dir(shim_dst), &format!("shim for PG v{}", major_version), )?; From a39385632cfe9073bc4ddb03beaffa3df95ea728 Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 14 Jan 2023 21:40:59 +0100 Subject: [PATCH 07/14] one more minor nit --- cargo-pgx/src/command/install.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cargo-pgx/src/command/install.rs b/cargo-pgx/src/command/install.rs index a1f88a1eea..09b71b8e11 100644 --- a/cargo-pgx/src/command/install.rs +++ b/cargo-pgx/src/command/install.rs @@ -270,7 +270,7 @@ pub(crate) fn build_extension( } fn apply_sysroot(command: &mut Command, sysroot: &Option) -> eyre::Result<()> { - if let Some(sysroot) = &sysroot { + if let Some(sysroot) = sysroot { let sysroot_str = sysroot.to_str().ok_or(eyre!("sysroot is not valid utf-8"))?; let sysroot_arg = format!("--sysroot={sysroot_str}"); command.env("BINDGEN_EXTRA_CLANG_ARGS", &sysroot_arg); From 5f6c892f18fd05cc1bca93a843370c1599cbbc42 Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 14 Jan 2023 21:42:26 +0100 Subject: [PATCH 08/14] cargo-pgx: install: cross: add RUSTFLAGS to HOST_ prefixed list used in host builds --- cargo-pgx/src/command/install.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cargo-pgx/src/command/install.rs b/cargo-pgx/src/command/install.rs index 09b71b8e11..c3a64b8ac3 100644 --- a/cargo-pgx/src/command/install.rs +++ b/cargo-pgx/src/command/install.rs @@ -305,7 +305,7 @@ pub(crate) fn build_extension( apply_sysroot(&mut command, &sysroot)?; } Some(CrossBuild::Host { sysroot, .. }) => { - let var_names = vec!["CC", "LD", "CFLAGS", "LDFLAGS", "AR"]; + let var_names = vec!["CC", "LD", "CFLAGS", "LDFLAGS", "AR", "RUSTFLAGS"]; for var in var_names { let host_v = "HOST_".to_owned() + var; if let Some(value) = std::env::var_os(host_v) { From 26a60c962fc603726c752edc720a180637accb3b Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 14 Jan 2023 21:42:48 +0100 Subject: [PATCH 09/14] cargo-pgx: install: cross: if a HOST_ variable is not given, remove it from environment --- cargo-pgx/src/command/install.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cargo-pgx/src/command/install.rs b/cargo-pgx/src/command/install.rs index c3a64b8ac3..505b811b06 100644 --- a/cargo-pgx/src/command/install.rs +++ b/cargo-pgx/src/command/install.rs @@ -311,6 +311,9 @@ pub(crate) fn build_extension( if let Some(value) = std::env::var_os(host_v) { command.env(var, value); } + else { + command.env_remove(var); + } } apply_sysroot(&mut command, &sysroot)?; From 5fe12542e80e1d561a01c70956879ab5e2e6dc03 Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 14 Jan 2023 21:47:49 +0100 Subject: [PATCH 10/14] cargo-pgx: fmt --- cargo-pgx/src/command/install.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cargo-pgx/src/command/install.rs b/cargo-pgx/src/command/install.rs index 505b811b06..c8a3cda481 100644 --- a/cargo-pgx/src/command/install.rs +++ b/cargo-pgx/src/command/install.rs @@ -310,8 +310,7 @@ pub(crate) fn build_extension( let host_v = "HOST_".to_owned() + var; if let Some(value) = std::env::var_os(host_v) { command.env(var, value); - } - else { + } else { command.env_remove(var); } } From 51d5e201f4425bc7f3283c6c5ca321333556191f Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 14 Jan 2023 22:57:48 +0100 Subject: [PATCH 11/14] pgx-pg-sys: fix warning in build.rs --- pgx-pg-sys/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgx-pg-sys/build.rs b/pgx-pg-sys/build.rs index 848ad569d3..85157f1613 100644 --- a/pgx-pg-sys/build.rs +++ b/pgx-pg-sys/build.rs @@ -10,7 +10,7 @@ Use of this source code is governed by the MIT license that can be found in the use bindgen::callbacks::{DeriveTrait, ImplementsTrait, MacroParsingBehavior}; use eyre::{eyre, WrapErr}; use once_cell::sync::Lazy; -use pgx_pg_config::{prefix_path, PgConfig, PgConfigSelector, Pgx, SUPPORTED_MAJOR_VERSIONS}; +use pgx_pg_config::{PgConfig, PgConfigSelector, Pgx, SUPPORTED_MAJOR_VERSIONS}; use quote::{quote, ToTokens}; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::path::PathBuf; From d3838d807c5d09666717971cb941887d2b83bbc6 Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Fri, 3 Feb 2023 01:47:53 +0100 Subject: [PATCH 12/14] cargo fmt --- cargo-pgx/src/command/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cargo-pgx/src/command/mod.rs b/cargo-pgx/src/command/mod.rs index 24430a4e0b..5e0e292cf5 100644 --- a/cargo-pgx/src/command/mod.rs +++ b/cargo-pgx/src/command/mod.rs @@ -8,8 +8,8 @@ Use of this source code is governed by the MIT license that can be found in the */ pub(crate) mod connect; -pub(crate) mod cross_options; pub(crate) mod cross; +pub(crate) mod cross_options; pub(crate) mod get; pub(crate) mod init; pub(crate) mod install; From a37e1313023bf82450807e519b5d0416955ccc9c Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 4 Feb 2023 00:29:50 +0100 Subject: [PATCH 13/14] cshim: build.rs: restore prefixing path --- pgx-pg-sys/build.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pgx-pg-sys/build.rs b/pgx-pg-sys/build.rs index a643a364c1..dca68af989 100644 --- a/pgx-pg-sys/build.rs +++ b/pgx-pg-sys/build.rs @@ -10,7 +10,7 @@ Use of this source code is governed by the MIT license that can be found in the use bindgen::callbacks::{DeriveTrait, ImplementsTrait, MacroParsingBehavior}; use eyre::{eyre, WrapErr}; use once_cell::sync::Lazy; -use pgx_pg_config::{PgConfig, PgConfigSelector, Pgx, SUPPORTED_MAJOR_VERSIONS}; +use pgx_pg_config::{prefix_path, PgConfig, PgConfigSelector, Pgx, SUPPORTED_MAJOR_VERSIONS}; use quote::{quote, ToTokens}; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::path::PathBuf; @@ -801,8 +801,10 @@ fn build_shim_for_version( shim_dst: &PathBuf, pg_config: &PgConfig, ) -> eyre::Result<()> { + let path_env = prefix_path(pg_config.parent_path()); let major_version = pg_config.major_version()?; + eprintln!("PATH for build_shim={}", path_env); eprintln!("shim_src={}", shim_src.display()); eprintln!("shim_dst={}", shim_dst.display()); @@ -830,6 +832,7 @@ fn build_shim_for_version( .arg("clean") .arg(&format!("libpgx-cshim-{}.a", major_version)) .env("PG_TARGET_VERSION", format!("{}", major_version)) + .env("PATH", path_env) .current_dir(shim_dst), &format!("shim for PG v{}", major_version), )?; From 951b1c73e6dc91c2c807ee9ebdefe4d4c1b44332 Mon Sep 17 00:00:00 2001 From: Jan Dorniak Date: Sat, 4 Feb 2023 00:33:23 +0100 Subject: [PATCH 14/14] cshim: build.rs: explicitly pass PG_CONFIG if path to pg_config is known --- pgx-pg-sys/build.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/pgx-pg-sys/build.rs b/pgx-pg-sys/build.rs index dca68af989..8179ba9141 100644 --- a/pgx-pg-sys/build.rs +++ b/pgx-pg-sys/build.rs @@ -831,6 +831,7 @@ fn build_shim_for_version( Command::new(make) .arg("clean") .arg(&format!("libpgx-cshim-{}.a", major_version)) + .args(pg_config.path().map(|p| format!("PG_CONFIG={}", p.display()))) .env("PG_TARGET_VERSION", format!("{}", major_version)) .env("PATH", path_env) .current_dir(shim_dst),