Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support building against macOS universal binaries #1166

Merged
merged 1 commit into from
Jun 16, 2023
Merged

Support building against macOS universal binaries #1166

merged 1 commit into from
Jun 16, 2023

Conversation

clowder
Copy link
Contributor

@clowder clowder commented Jun 9, 2023

FIXES: #1087

A "universal binary" is a fat binary which contains multiple builds for different architectures. When Postgres is packaged in this format it's necessary to slice out the build for the current architecture before trying to parse it. The program terminates early if the universal binary doesn't support the current architecture.

The list of supported architectures in slice_arch32 is limited by object, which supports fewer than Rust.

The universal binary test fixture was simply chosen because of it's small size relative to other binaries in Postgres.

@eeeebbbbrrrr
Copy link
Contributor

Hey, this is cool. Thanks a bunch. I'm sure @thomcc will be excited to review this in detail.

The universal binary test fixture was simply chosen because of it's small size relative to other binaries in Postgres.

Any chance we can rename this to anything other than pg_config? I just know that name will cause confusion down the road since pgrx uses the real pg_config everywhere.

@clowder
Copy link
Contributor Author

clowder commented Jun 9, 2023

@eeeebbbbrrrr Thanks for the quick reply!

Any chance we can rename this to anything other than pg_config? I just know that name will cause confusion down the road since pgrx uses the real pg_config everywhere.

Happy to do this. Just to clarify, it's literally a universal binary version of the pg_config utility. With that in mind, would reshuffling the parts be enough? For example cargo-pgrx/tests/fixtures/pg_config.macos-universal. Or should we just give it some opaque name? For example cargo-pgrx/tests/fixtures/macos-universal.

@eeeebbbbrrrr
Copy link
Contributor

Yeah, i'd prefer it be called something like test-macos-universal-binary or similar. I suppose we don't care what the binary actually is.

Also, I can't tell in the PR, but please make sure it doesn't accidentally have the execute bit (+x) set.

@clowder
Copy link
Contributor Author

clowder commented Jun 14, 2023

Yeah, i'd prefer it be called something like test-macos-universal-binary or similar. I suppose we don't care what the binary actually is.

Updated. I opted for macos-universal-binary because test was already in the path.

Also, I can't tell in the PR, but please make sure it doesn't accidentally have the execute bit (+x) set.

It did. This has been fixed now.

@eeeebbbbrrrr
Copy link
Contributor

Nice, thanks! I just realized I never approved you for CI, so now that's happening. I'd still like @thomcc to give this a look and approve. He's more experienced with this kind of thing than I am.

@eeeebbbbrrrr
Copy link
Contributor

Yeah, glad I turned on CI. It doesn't like something here: https://github.com/tcdi/pgrx/actions/runs/5269612633/jobs/9528132717#step:10:160

FIXES: #1087

A "universal binary" is a fat binary which contains multiple builds for
different architectures. When Postgres is packaged in this format it's
necessary to slice out the build for the current architecture before
trying to parse it. The program terminates early if the universal binary
doesn't support the current architecture.

The list of supported architectures in `slice_arch32` is limited by
[`object`][object-arch], which supports fewer than [Rust][rust-arch].

The universal binary test fixture was simply chosen because of it's
small size relative to other binaries in Postgres.

[^1]: gimli-rs/object#454 (comment)

[rust-arch]: http://doc.rust-lang.org/1.68.2/std/env/consts/constant.ARCH.html
[object-arch]: https://docs.rs/object/latest/object/read/macho/trait.FatArch.html#method.architecture
@clowder
Copy link
Contributor Author

clowder commented Jun 14, 2023

Yeah, glad I turned on CI. It doesn't like something here: https://github.com/tcdi/pgrx/actions/runs/5269612633/jobs/9528132717#step:10:160

Sorry about that, I missed something renaming that fixture. Sorted now.

Copy link
Contributor

@thomcc thomcc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the delay, this looks fine to me.

}

fn slice_arch32<'a>(data: &'a [u8], arch: &str) -> Option<&'a [u8]> {
let target = match arch {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Most of these almost certainly don't work, but I suppose it's harmless.

@eeeebbbbrrrr eeeebbbbrrrr merged commit 16c9d5c into pgcentralfoundation:develop Jun 16, 2023
@clowder clowder deleted the universal-binary-support branch June 19, 2023 08:48
eeeebbbbrrrr added a commit that referenced this pull request Sep 5, 2023
This is the final release of v0.10.0. Thanks everyone for the beta
testing, pull requests, issues, and patience.

As always, install `cargo-pgrx` with `cargo install cargo-pgrx --locked`
and update your extension Cargo.toml files to use the `0.10.0` pgrx
dependencies.

This release includes support for Postgres 16RC1. Support for the
previous betas has been removed. As such, a fresh `cargo pgrx init` is
required.

## What's Changed Since v0.10.0-beta.4

* Fix `GetMemoryChunkContext` port by @workingjubilee in
#1273
* Better error messages when `pg_config` isn't found. by @eeeebbbbrrrr
in #1271
* Make `PostgresHash` also need `Eq` by @workingjubilee in
#1264
* Memoize git hash and extension metadata by @levkk in
#1274
* move to pg16rc1 by @eeeebbbbrrrr in
#1276
* Fix bgworker template up to 0.10.0-beta.4 by @workingjubilee in
#1270

## New Contributors
* @levkk made their first contribution in
#1274

**Changelog**:
v0.10.0-beta.4...v0.10.0

---

v0.10.0's full set of changes throughout the entire beta period are:

* Postgres 16beta1 Support by @eeeebbbbrrrr in
#1169
* Support building against macOS universal binaries by @clowder in
#1166
* list specific versions in feature gates by @eeeebbbbrrrr in
#1175
* Fix bug with converting a `pg_sys::Datum` into a `pgrx::Date` by
@eeeebbbbrrrr in #1177
* Fix Arrays with leading nulls by @eeeebbbbrrrr in
#1180
* Disable hello_versioned_so test by @workingjubilee in
#1192
* doc: fix link broken by @yihong0618 in
#1181
* fcinfo: fix incorrect length set in unsafe code by @Sasasu in
#1190
* update to pg16beta2 support by @eeeebbbbrrrr in
#1188
* Array-walking is aligned by @workingjubilee in
#1191
* Implement PGRXSharedMemory for Deque by @feikesteenbergen in
#1170
* Include security labels header by @daamien in
#1189
* Fixes macos-11 tests by @BradyBonnette in
#1197
* Pgcentralfoundation updates again by @eeeebbbbrrrr in
#1200
* Update version to 0.10.0-beta.0 by @eeeebbbbrrrr in
#1201
* Testing help by @eeeebbbbrrrr in
#1203
* Type testability cleanup by @eeeebbbbrrrr in
#1204
* Try to smartly propagate fs errors by @workingjubilee in
#1186
* Fix issue #1209 by @eeeebbbbrrrr in
#1210
* Type roundtrip tests by @eeeebbbbrrrr in
#1185
* Update version to 0.10.0-beta.1 by @eeeebbbbrrrr in
#1213
* Add a workaround for the pg16/homebrew/icu4c situation by @thomcc in
#1206
* Add security policy by @johnrballard in
#1207
* `AnyNumeric` is no longer backed by Postgres-allocated memory by
@eeeebbbbrrrr in #1216
* Modularize pgrx::spi by @workingjubilee in
#1219
* Stop SpiClient soundness from regressing by @workingjubilee in
#1214
* Add foreign table headers by @workingjubilee in
#1226
* Modularize the interior of pgrx-pg-sys by @workingjubilee in
#1227
* Initial valgrind support by @thomcc in
#1218
* Add support for handling SIGINT and SIGCHLD from bgworker by @JelteF
in #1229
* Ignores UI tests for MUSL environments by @BradyBonnette in
#1235
* Add a env flag that can be set to skip `#[pg_test]`-generated tests.
by @thomcc in #1239
* Fix issue #1076: Properly handle dependency graph of `Result<T, _>` by
@eeeebbbbrrrr in #1241
* Cleanup the error when cargo-pgrx version doesn't match Cargo.toml by
@eeeebbbbrrrr in #1240
* Add operator and cache related api by @VoVAllen in
#1242
* Addresses cargo-pgrx error reporting by @BradyBonnette in
#1238
* Update version to 0.10.0-beta.2 by @eeeebbbbrrrr in
#1244
* Bump cargo-metadata and clap-cargo by @thomcc in
#1246
* Derive Clone for Inet by @JelteF in
#1251
* Correct docs for datetime `From` impls by @workingjubilee in
#1253
* Only enable line tables for profile.dev by @thomcc in
#1249
* Remove references to master branch by @thomcc in
#1243
* Ensure bindgen gets all the `cppflags` it needs (on macOS, anyway) by
@thomcc in #1247
* update for pg16beta3 support by @eeeebbbbrrrr in
#1254
* Update version to 0.10.0-beta.3 by @eeeebbbbrrrr in
#1255
* Add proptest support by @workingjubilee in
#1258
* Misc reformatting and typo fixes by @workingjubilee in
#1260
* spi: simplify (optimize?) Datum preparation by @vrmiguel in
#1256
* Assume commutation when deriving PostgresEq by @workingjubilee in
#1261
* Demand Ord for PostgresOrd by @workingjubilee in
#1262
* Fix pgrx install causing postgresql coredump by @Sasasu in
#1263
* Update version to 0.10.0-beta.4 by @workingjubilee in
#1267

## New Contributors
* @clowder made their first contribution in
#1166
* @yihong0618 made their first contribution in
#1181
* @Sasasu made their first contribution in
#1190
* @daamien made their first contribution in
#1189
* @johnrballard made their first contribution in
#1207
* @VoVAllen made their first contribution in
#1242
* @vrmiguel made their first contribution in
#1256


**Full Changelog**:
v0.9.8...v0.10.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants