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

Reply via email to