This is an automated email from the ASF dual-hosted git repository.
amoeba pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new e0038052f54 GH-51614: [C++][FlightRPC] Universal macOS PKG Installer
(#51765)
e0038052f54 is described below
commit e0038052f5479a3178e8d6b0d1d4a5921f037790
Author: Alina (Xi) Li <[email protected]>
AuthorDate: Thu Oct 15 18:01:48 2026 -0700
GH-51614: [C++][FlightRPC] Universal macOS PKG Installer (#51765)
### Rationale for this change
https://github.com/apache/arrow/issues/51614
### What changes are included in this PR?
- Output universal .pkg installer that work on both ARM and AMD.
- Add CI step to verify installation by the universal pkg installer.
- use `macos-26` for ODBC workflows
### Are these changes tested?
Tested in CI.
Manually tested the universal .pkg installer on M5 and Intel Mac machines.
### Are there any user-facing changes?
No.
Developers can use the universal macOS .pkg installer titled
`flight-sql-odbc-pkg-installer-universal` from the CI.
### Was AI used for this PR?
In accordance to the [AI generation
guidelines](https://arrow.apache.org/docs/dev/developers/overview.html#ai-generated-code),
please disclose below whether and how AI was used in this PR.
**PR code and description written by:**
- [x] Human
- [x] AI
**Reviewed before submission by:**
- [x] Human
- [x] AI
- [ ] Not reviewed
* GitHub Issue: #51614
Authored-by: Alina (Xi) Li <[email protected]>
Signed-off-by: Bryce Mecum <[email protected]>
---
.github/workflows/cpp_extra.yml | 125 ++++++++++++++++++++++++++++++++++++++--
1 file changed, 121 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml
index dce20ee232b..e29fa71035f 100644
--- a/.github/workflows/cpp_extra.yml
+++ b/.github/workflows/cpp_extra.yml
@@ -567,10 +567,10 @@ jobs:
fail-fast: false
matrix:
include:
- - { architecture: AMD64, macos-version: "15-intel", build-type :
debug }
- - { architecture: AMD64, macos-version: "15-intel", build-type :
release }
- - { architecture: ARM64, macos-version: "14", build-type : debug }
- - { architecture: ARM64, macos-version: "14", build-type : release }
+ - { architecture: AMD64, macos-version: "26-intel", build-type :
debug }
+ - { architecture: AMD64, macos-version: "26-intel", build-type :
release }
+ - { architecture: ARM64, macos-version: "26", build-type : debug }
+ - { architecture: ARM64, macos-version: "26", build-type : release }
env:
ARROW_BUILD_TESTS: ON
ARROW_BUILD_TYPE: ${{ matrix.build-type }}
@@ -672,6 +672,13 @@ jobs:
name: flight-sql-odbc-pkg-installer-${{ matrix.architecture }}
path: build/cpp/ArrowFlightSQLODBC-*.pkg
if-no-files-found: error
+ - name: Upload AMD64 ODBC dylib to the job
+ if: matrix.build-type == 'release' && matrix.architecture == 'AMD64'
+ uses: actions/upload-artifact@v7
+ with:
+ name: flight-sql-odbc-dylib-${{ matrix.architecture }}
+ path: build/cpp/${{ matrix.build-type
}}/libarrow_flight_sql_odbc.dylib
+ if-no-files-found: error
- name: Register Flight SQL ODBC Driver
run: |
sudo cpp/src/arrow/flight/sql/odbc/install/unix/install_odbc.sh
$(pwd)/build/cpp/${{ matrix.build-type }}/libarrow_flight_sql_odbc.dylib
@@ -686,6 +693,114 @@ jobs:
sudo chown -R $USER /Library/ODBC
ci/scripts/cpp_test.sh $(pwd) $(pwd)/build
+ odbc-macos-universal:
+ needs: odbc-macos
+ name: Create ODBC universal macOS installer
+ runs-on: macos-26
+ timeout-minutes: 30
+ steps:
+ - name: Download ARM64 PKG
+ uses: actions/download-artifact@v8
+ with:
+ name: flight-sql-odbc-pkg-installer-ARM64
+ path: arm64-pkg
+ - name: Download AMD64 dylib
+ uses: actions/download-artifact@v8
+ with:
+ name: flight-sql-odbc-dylib-AMD64
+ path: amd64-dylib
+ - name: Build universal macOS installer
+ run: |
+ set -euo pipefail
+
+ pkg_path="$(ls arm64-pkg/ArrowFlightSQLODBC-*.pkg)"
+ pkg_name="$(basename "${pkg_path}" .pkg)"
+
+ # Use the ARM64 .pkg and swap in a universal ODBC dylib
+ # that works on ARM64 and AMD64.
+ pkgutil --expand-full "${pkg_path}" expanded
+
+ # The unversioned name libarrow_flight_sql_odbc.dylib is a symlink
+ # to the versioned dylib that the
+ # install name (@rpath/libarrow_flight_sql_odbc.<SOVERSION>.dylib)
+ # resolves to. Run lipo on the real file so the symlinks stay intact.
+ symlink_path="$(find expanded -name libarrow_flight_sql_odbc.dylib)"
+ lib_dir="$(dirname "${symlink_path}")"
+ dylib_path="$(realpath "${symlink_path}")"
+ echo "Merging into ${dylib_path} (via ${symlink_path})"
+ lipo -create "${dylib_path}"
amd64-dylib/libarrow_flight_sql_odbc.dylib \
+ -output "${dylib_path}"
+
+ # Verify every dylib (including the symlinks) is universal before
re-packaging.
+ # Check one architecture at a time with `lipo -archs`,
+ # as macOS 27 support only one architecture search at a time.
+ for lib in "${lib_dir}"/libarrow_flight_sql_odbc*.dylib; do
+ dylib_archs="$(lipo -archs "${lib}")"
+ echo "${lib}: ${dylib_archs}"
+ for arch in arm64 x86_64; do
+ if ! grep -qw "${arch}" <<< "${dylib_archs}"; then
+ echo "${lib} is missing '${arch}' (got: ${dylib_archs})"
+ exit 1
+ fi
+ done
+ done
+
+ pkgutil --flatten-full expanded "${pkg_name}.pkg"
+ - name: Upload universal ODBC PKG
+ uses: actions/upload-artifact@v7
+ with:
+ name: flight-sql-odbc-pkg-installer-universal
+ path: ArrowFlightSQLODBC-*.pkg
+ if-no-files-found: error
+
+ odbc-macos-universal-verify:
+ needs: odbc-macos-universal
+ name: ODBC universal installer verify ${{ matrix.architecture }} macOS ${{
matrix.macos-version }}
+ runs-on: macos-${{ matrix.macos-version }}
+ timeout-minutes: 30
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - architecture: AMD64
+ macos-version: "26-intel"
+ - architecture: ARM64
+ macos-version: "26"
+ steps:
+ - name: Download universal PKG
+ uses: actions/download-artifact@v8
+ with:
+ name: flight-sql-odbc-pkg-installer-universal
+ - name: Install ODBC PKG
+ run: |
+ set -euo pipefail
+
+ pkg_path="$(ls ArrowFlightSQLODBC-*.pkg)"
+ sudo installer -pkg "${pkg_path}" -target / -verbose
+ - name: Check ODBC dylib installation
+ run: |
+ set -euo pipefail
+
+ dylib="/Library/ODBC/arrow-odbc/lib/libarrow_flight_sql_odbc.dylib"
+
+ if [ ! -f "${dylib}" ]; then
+ echo "ODBC dylib not found at ${dylib}"
+ exit 1
+ fi
+ echo "Found ODBC dylib: ${dylib}"
+
+ # Verify every installed dylib (including the symlinks) is universal.
+ local_arch="$(uname -m)"
+ echo "Local architecture: ${local_arch}"
+ for lib in
/Library/ODBC/arrow-odbc/lib/libarrow_flight_sql_odbc*.dylib; do
+ archs="$(lipo -archs "${lib}")"
+ echo "${lib}: ${archs}"
+ if ! grep -qw "${local_arch}" <<< "${archs}"; then
+ echo "${lib} does not support local architecture '${local_arch}'
(got: ${archs})"
+ exit 1
+ fi
+ done
+
odbc-msvc:
needs: check-enabled
if: needs.check-enabled.outputs.is_enabled == 'true'
@@ -856,6 +971,8 @@ jobs:
- msvc-arm64
- odbc-linux
- odbc-macos
+ - odbc-macos-universal
+ - odbc-macos-universal-verify
- odbc-msvc
- odbc-nightly
uses: ./.github/workflows/report_ci.yml