This is an automated email from the ASF dual-hosted git repository.
kou 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 8dd9eba99a GH-47196: [CI][C++] Add Windows ARM64 build (#47811)
8dd9eba99a is described below
commit 8dd9eba99a69dbdf1d110cebf0bd349ee3ac7eda
Author: Jonathan Giannuzzi <[email protected]>
AuthorDate: Thu Oct 23 03:54:11 2025 +0300
GH-47196: [CI][C++] Add Windows ARM64 build (#47811)
### Rationale for this change
This PR adds a CI job to test building the C++ library on Windows ARM64
with MSVC, which will help ensuring that downstream projects like
[`vcpkg`](https://github.com/microsoft/vcpkg) can build Arrow C++ on that
platform.
### What changes are included in this PR?
- The `windows` job from the `cpp.yml` workflow has been moved into a
reusable workflow `cpp_windows.yml`
- Use GitHub hosted runner `windows-11-arm` to build with MSVC ARM64 in
`cpp_extra.yml`
- `simd-level` is set `NONE` for now as xsimd does not yet support MSVC
ARM64
- `msys2` is installed and used for the timezone data, as it is not
guaranteed to exist on `windows-11-arm` images
- A recent version of `cmake` is installed as support for finding Windows
OpenSSL ARM64 builds was only added in 4.1.0 (see
https://github.com/Kitware/CMake/commit/bf52219e4c095fb0db7d0dc6cc0ebcbd5026c73e)
- The Boost context implementation is set to `winfib` when building with
MSVC ARM64 as it's the only supported implementation for that platform (see
https://github.com/boostorg/context/issues/296#issuecomment-3234098728 and
https://github.com/boostorg/context/pull/315)
### Are these changes tested?
Yes, in the CI itself
### Are there any user-facing changes?
No
* GitHub Issue: #47196
Authored-by: Jonathan Giannuzzi <[email protected]>
Signed-off-by: Sutou Kouhei <[email protected]>
---
.github/workflows/cpp.yml | 99 ++--------------------
.github/workflows/cpp_extra.yml | 13 +++
.github/workflows/cpp_windows.yml | 124 ++++++++++++++++++++++++++++
ci/scripts/install_ccache.sh | 13 ++-
ci/scripts/install_cmake.sh | 39 +++++----
cpp/cmake_modules/ThirdpartyToolchain.cmake | 5 ++
6 files changed, 182 insertions(+), 111 deletions(-)
diff --git a/.github/workflows/cpp.yml b/.github/workflows/cpp.yml
index 0122f01e75..db3abd456c 100644
--- a/.github/workflows/cpp.yml
+++ b/.github/workflows/cpp.yml
@@ -280,100 +280,13 @@ jobs:
ci/scripts/cpp_test.sh $(pwd) $(pwd)/build
windows:
- name: ${{ matrix.title }}
- runs-on: ${{ matrix.os }}
if: ${{ !contains(github.event.pull_request.title, 'WIP') }}
- timeout-minutes: 60
- strategy:
- fail-fast: false
- matrix:
- os:
- - windows-2022
- include:
- - os: windows-2022
- simd-level: AVX2
- title: AMD64 Windows 2022 AVX2
- env:
- ARROW_BOOST_USE_SHARED: OFF
- ARROW_BUILD_BENCHMARKS: ON
- ARROW_BUILD_SHARED: ON
- ARROW_BUILD_STATIC: OFF
- ARROW_BUILD_TESTS: ON
- ARROW_DATASET: ON
- ARROW_FLIGHT: OFF
- ARROW_HDFS: ON
- ARROW_HOME: /usr
- ARROW_JEMALLOC: OFF
- ARROW_MIMALLOC: ON
- ARROW_ORC: ON
- ARROW_PARQUET: ON
- ARROW_SIMD_LEVEL: ${{ matrix.simd-level }}
- ARROW_SUBSTRAIT: ON
- ARROW_USE_GLOG: OFF
- ARROW_VERBOSE_THIRDPARTY_BUILD: OFF
- ARROW_WITH_BROTLI: OFF
- ARROW_WITH_BZ2: OFF
- ARROW_WITH_LZ4: OFF
- ARROW_WITH_OPENTELEMETRY: OFF
- ARROW_WITH_SNAPPY: ON
- ARROW_WITH_ZLIB: ON
- ARROW_WITH_ZSTD: ON
- BOOST_SOURCE: BUNDLED
- CMAKE_CXX_STANDARD: "17"
- CMAKE_GENERATOR: Ninja
- CMAKE_INSTALL_PREFIX: /usr
- CMAKE_UNITY_BUILD: ON
- steps:
- - name: Disable Crash Dialogs
- run: |
- reg add `
- "HKCU\SOFTWARE\Microsoft\Windows\Windows Error Reporting" `
- /v DontShowUI `
- /t REG_DWORD `
- /d 1 `
- /f
- - name: Checkout Arrow
- uses: actions/checkout@v5
- with:
- fetch-depth: 0
- submodules: recursive
- - name: Download Timezone Database
- shell: bash
- run: ci/scripts/download_tz_database.sh
- - name: Install ccache
- shell: bash
- run: |
- ci/scripts/install_ccache.sh 4.6.3 /usr
- - name: Setup ccache
- shell: bash
- run: |
- ci/scripts/ccache_setup.sh
- - name: ccache info
- id: ccache-info
- shell: bash
- run: |
- echo "cache-dir=$(ccache --get-config cache_dir)" >> $GITHUB_OUTPUT
- - name: Cache ccache
- uses: actions/cache@v4
- with:
- path: ${{ steps.ccache-info.outputs.cache-dir }}
- key: cpp-ccache-windows-${{ env.CACHE_VERSION }}-${{
hashFiles('cpp/**') }}
- restore-keys: cpp-ccache-windows-${{ env.CACHE_VERSION }}-
- env:
- # We can invalidate the current cache by updating this.
- CACHE_VERSION: "2022-09-13"
- - name: Build
- shell: cmd
- run: |
- call "C:\Program Files\Microsoft Visual
Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64
- bash -c "ci/scripts/cpp_build.sh $(pwd) $(pwd)/build"
- - name: Test
- shell: cmd
- run: |
- call "C:\Program Files\Microsoft Visual
Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64
- # For ORC
- set TZDIR=C:\msys64\usr\share\zoneinfo
- bash -c "ci/scripts/cpp_test.sh $(pwd) $(pwd)/build"
+ name: AMD64 Windows 2022 AVX2 C++
+ uses: ./.github/workflows/cpp_windows.yml
+ with:
+ arch: x64
+ os: windows-2022
+ simd-level: AVX2
windows-mingw:
name: AMD64 Windows MinGW ${{ matrix.msystem_upper }} C++
diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml
index 5b054ddfb5..583a010a20 100644
--- a/.github/workflows/cpp_extra.yml
+++ b/.github/workflows/cpp_extra.yml
@@ -164,6 +164,19 @@ jobs:
continue-on-error: true
run: archery docker push ${{ matrix.image }}
+ msvc-arm64:
+ needs: check-labels
+ if: >-
+ needs.check-labels.outputs.force == 'true' ||
+ contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'),
'CI: Extra') ||
+ contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'),
'CI: Extra: C++')
+ name: ARM64 Windows 11 MSVC
+ uses: ./.github/workflows/cpp_windows.yml
+ with:
+ arch: arm64
+ os: windows-11-arm
+ simd-level: NONE
+
jni-linux:
needs: check-labels
name: JNI ${{ matrix.platform.runs-on }} ${{ matrix.platform.arch }}
diff --git a/.github/workflows/cpp_windows.yml
b/.github/workflows/cpp_windows.yml
new file mode 100644
index 0000000000..cc48f27710
--- /dev/null
+++ b/.github/workflows/cpp_windows.yml
@@ -0,0 +1,124 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+name: C++ Windows MSVC Reusable
+
+on:
+ workflow_call:
+ inputs:
+ arch:
+ description: "The architecture to build for"
+ required: true
+ type: string
+ os:
+ description: "The runner label to run the job on"
+ required: true
+ type: string
+ simd-level:
+ description: "The Arrow SIMD level to build with"
+ required: true
+ type: string
+
+jobs:
+ windows:
+ runs-on: ${{ inputs.os }}
+ timeout-minutes: 60
+ env:
+ ARROW_BOOST_USE_SHARED: OFF
+ ARROW_BUILD_BENCHMARKS: ON
+ ARROW_BUILD_SHARED: ON
+ ARROW_BUILD_STATIC: OFF
+ ARROW_BUILD_TESTS: ON
+ ARROW_DATASET: ON
+ ARROW_FLIGHT: OFF
+ ARROW_HDFS: ON
+ ARROW_HOME: /usr
+ ARROW_JEMALLOC: OFF
+ ARROW_MIMALLOC: ON
+ ARROW_ORC: ON
+ ARROW_PARQUET: ON
+ ARROW_SIMD_LEVEL: ${{ inputs.simd-level }}
+ ARROW_SUBSTRAIT: ON
+ ARROW_USE_GLOG: OFF
+ ARROW_VERBOSE_THIRDPARTY_BUILD: OFF
+ ARROW_WITH_BROTLI: OFF
+ ARROW_WITH_BZ2: OFF
+ ARROW_WITH_LZ4: OFF
+ ARROW_WITH_OPENTELEMETRY: OFF
+ ARROW_WITH_SNAPPY: ON
+ ARROW_WITH_ZLIB: ON
+ ARROW_WITH_ZSTD: ON
+ BOOST_SOURCE: BUNDLED
+ CMAKE_CXX_STANDARD: "17"
+ CMAKE_GENERATOR: Ninja
+ CMAKE_INSTALL_PREFIX: /usr
+ CMAKE_UNITY_BUILD: ON
+ steps:
+ - name: Disable Crash Dialogs
+ run: |
+ reg add `
+ "HKCU\SOFTWARE\Microsoft\Windows\Windows Error Reporting" `
+ /v DontShowUI `
+ /t REG_DWORD `
+ /d 1 `
+ /f
+ - name: Checkout Arrow
+ uses: actions/checkout@v5
+ with:
+ fetch-depth: 0
+ submodules: recursive
+ - name: Download Timezone Database
+ shell: bash
+ run: ci/scripts/download_tz_database.sh
+ - name: Install msys2 (for tzdata for ORC tests)
+ uses: msys2/setup-msys2@v2
+ id: setup-msys2
+ - name: Install cmake
+ shell: bash
+ run: |
+ ci/scripts/install_cmake.sh 4.1.2 /usr
+ - name: Install ccache
+ shell: bash
+ run: |
+ ci/scripts/install_ccache.sh 4.12.1 /usr
+ - name: Setup ccache
+ shell: bash
+ run: |
+ ci/scripts/ccache_setup.sh
+ - name: ccache info
+ id: ccache-info
+ shell: bash
+ run: |
+ echo "cache-dir=$(ccache --get-config cache_dir)" >> $GITHUB_OUTPUT
+ - name: Cache ccache
+ uses: actions/cache@v4
+ with:
+ path: ${{ steps.ccache-info.outputs.cache-dir }}
+ key: cpp-ccache-windows-${{ inputs.arch }}-${{ hashFiles('cpp/**') }}
+ restore-keys: cpp-ccache-windows-${{ inputs.arch }}-
+ - name: Build
+ shell: cmd
+ run: |
+ call "C:\Program Files\Microsoft Visual
Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ inputs.arch }}
+ bash -c "ci/scripts/cpp_build.sh $(pwd) $(pwd)/build"
+ - name: Test
+ shell: cmd
+ run: |
+ call "C:\Program Files\Microsoft Visual
Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ inputs.arch }}
+ # For ORC
+ set TZDIR=${{ steps.setup-msys2.outputs.msys2-location
}}\usr\share\zoneinfo
+ bash -c "ci/scripts/cpp_test.sh $(pwd) $(pwd)/build"
diff --git a/ci/scripts/install_ccache.sh b/ci/scripts/install_ccache.sh
index 75ca81076d..824e4271b3 100755
--- a/ci/scripts/install_ccache.sh
+++ b/ci/scripts/install_ccache.sh
@@ -30,10 +30,19 @@ prefix=$2
mkdir -p /tmp/ccache
case $(uname) in
MINGW64*)
-
url="https://github.com/ccache/ccache/releases/download/v${version}/ccache-${version}-windows-x86_64.zip"
+ declare -A archs
+ archs=([64-bit]="x86_64"
+ [ARM 64-bit Processor]="aarch64")
+ arch=$(powershell -Command "(Get-CimInstance
Win32_OperatingSystem).OSArchitecture")
+ if [ -z "${archs[$arch]}" ]; then
+ echo "Unsupported architecture on Windows: ${arch}"
+ exit 0
+ fi
+ arch=${archs[$arch]}
+
url="https://github.com/ccache/ccache/releases/download/v${version}/ccache-${version}-windows-${arch}.zip"
pushd /tmp/ccache
curl --fail --location --remote-name "${url}"
- unzip -j "ccache-${version}-windows-x86_64.zip"
+ unzip -j "ccache-${version}-windows-${arch}.zip"
chmod +x ccache.exe
mv ccache.exe "${prefix}/bin/"
popd
diff --git a/ci/scripts/install_cmake.sh b/ci/scripts/install_cmake.sh
index a6916b255e..275b036a3d 100755
--- a/ci/scripts/install_cmake.sh
+++ b/ci/scripts/install_cmake.sh
@@ -24,17 +24,13 @@ if [ "$#" -ne 2 ]; then
exit 1
fi
-declare -A archs
-archs=([x86_64]=x86_64
- [arm64]=aarch64
- [aarch64]=aarch64)
+declare -A linux_archs
+linux_archs=([x86_64]="x86_64"
+ [aarch64]="aarch64")
-arch=$(uname -m)
-if [ -z "${archs[$arch]}" ]; then
- echo "Unsupported architecture: ${arch}"
- exit 0
-fi
-arch=${archs[$arch]}
+declare -A windows_archs
+windows_archs=([64-bit]="x86_64"
+ [ARM 64-bit Processor]="arm64")
version=$1
prefix=$2
@@ -43,12 +39,25 @@ platform=$(uname)
case ${platform} in
Linux)
platform=linux
+ arch=$(uname -m)
+ if [ -z "${linux_archs[$arch]}" ]; then
+ echo "Unsupported architecture on Linux: ${arch}"
+ exit 0
+ fi
+ arch=${linux_archs[$arch]}
;;
Darwin)
platform=macos
+ arch=universal
;;
MSYS_NT*|MINGW64_NT*)
platform=windows
+ arch=$(powershell -Command "(Get-CimInstance
Win32_OperatingSystem).OSArchitecture")
+ if [ -z "${windows_archs[$arch]}" ]; then
+ echo "Unsupported architecture on Windows: ${arch}"
+ exit 0
+ fi
+ arch=${windows_archs[$arch]}
;;
*)
echo "Unsupported platform: ${platform}"
@@ -59,22 +68,20 @@ esac
mkdir -p "${prefix}"
url="https://github.com/Kitware/CMake/releases/download/v${version}/cmake-${version}-${platform}-"
case ${platform} in
- macos)
- url+="universal.tar.gz"
- curl -L "${url}" | tar -xzf - --directory "${prefix}" --strip-components=1
- ln -s CMake.app/Contents/bin "${prefix}/bin"
- ;;
windows)
url+="${arch}.zip"
archive_name=$(basename "${url}")
curl -L -o "${archive_name}" "${url}"
unzip "${archive_name}"
base_name=$(basename "${archive_name}" .zip)
- mv "${base_name}"/* "${prefix}"
+ cp -a "${base_name}"/* "${prefix}"
rm -rf "${base_name}" "${archive_name}"
;;
*)
url+="${arch}.tar.gz"
curl -L "${url}" | tar -xzf - --directory "${prefix}" --strip-components=1
+ if [ "${platform}" = "macos" ]; then
+ ln -s CMake.app/Contents/bin "${prefix}/bin"
+ fi
;;
esac
diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake
b/cpp/cmake_modules/ThirdpartyToolchain.cmake
index 4ced2a66bf..17158ae331 100644
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake
+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake
@@ -1118,6 +1118,11 @@ function(build_boost)
# This is for https://github.com/boostorg/container/issues/305
string(APPEND CMAKE_C_FLAGS " -Wno-strict-prototypes")
endif()
+ if(MSVC AND "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ARM64")
+ set(BOOST_CONTEXT_IMPLEMENTATION
+ winfib
+ CACHE STRING "" FORCE)
+ endif()
set(CMAKE_UNITY_BUILD OFF)
fetchcontent_makeavailable(boost)