From cac716cea23e60d2e22c1c5e0449740315c27265 Mon Sep 17 00:00:00 2001 From: Nate Prewitt Date: Thu, 22 Jan 2026 13:22:28 -0700 Subject: [PATCH 1/2] Fix MSVC build for Azure --- cpp/src/arrow/filesystem/azurefs.cc | 7 +++++++ cpp/src/arrow/filesystem/azurefs.h | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/cpp/src/arrow/filesystem/azurefs.cc b/cpp/src/arrow/filesystem/azurefs.cc index 6580476d38c..da53f5f7d14 100644 --- a/cpp/src/arrow/filesystem/azurefs.cc +++ b/cpp/src/arrow/filesystem/azurefs.cc @@ -1363,6 +1363,7 @@ Result CheckIfHierarchicalNamespaceIsEnabled( directory_client.GetAccessControlList(); return HNSSupport::kEnabled; } catch (std::out_of_range& exception) { + ARROW_UNUSED(exception); // Azurite issue detected. DCHECK(IsDfsEmulator(options)); return HNSSupport::kDisabled; @@ -2500,6 +2501,7 @@ class AzureFileSystem::Impl { auto delete_result = deferred_response.GetResponse(); success = delete_result.Value.Deleted; } catch (const Core::RequestFailedException& exception) { + ARROW_UNUSED(exception); success = false; } if (!success) { @@ -3218,6 +3220,11 @@ class AzureFileSystem::Impl { std::atomic LeaseGuard::latest_known_expiry_time_ = SteadyClock::time_point{SteadyClock::duration::zero()}; +// Destructor must be defined here where Impl is a complete type. +// Defining it in the header (even as = default) causes MSVC to fail +// because it tries to instantiate std::default_delete before Impl is defined. +AzureFileSystem::~AzureFileSystem() {} + AzureFileSystem::AzureFileSystem(std::unique_ptr&& impl) : FileSystem(impl->io_context()), impl_(std::move(impl)) { default_async_is_sync_ = false; diff --git a/cpp/src/arrow/filesystem/azurefs.h b/cpp/src/arrow/filesystem/azurefs.h index ee0956afdd7..1a43153493f 100644 --- a/cpp/src/arrow/filesystem/azurefs.h +++ b/cpp/src/arrow/filesystem/azurefs.h @@ -251,7 +251,9 @@ class ARROW_EXPORT AzureFileSystem : public FileSystem { void ForceCachedHierarchicalNamespaceSupport(int hns_support); public: - ~AzureFileSystem() override = default; + // Destructor must be defined in the .cc file where Impl is complete, + // otherwise MSVC fails with "use of undefined type" for std::unique_ptr. + ~AzureFileSystem() override; static Result> Make( const AzureOptions& options, const io::IOContext& = io::default_io_context()); From 50d251114abeb7e429480b2c0c5688b52f56d5b0 Mon Sep 17 00:00:00 2001 From: Nate Prewitt Date: Thu, 22 Jan 2026 20:17:13 -0700 Subject: [PATCH 2/2] Add build tooling for Azure SDK --- .github/workflows/cpp_windows.yml | 2 ++ cpp/cmake_modules/ThirdpartyToolchain.cmake | 28 +++++++++++++++++++++ cpp/thirdparty/versions.txt | 3 +++ 3 files changed, 33 insertions(+) diff --git a/.github/workflows/cpp_windows.yml b/.github/workflows/cpp_windows.yml index 69bbfee28b9..3e1f2b4181e 100644 --- a/.github/workflows/cpp_windows.yml +++ b/.github/workflows/cpp_windows.yml @@ -41,12 +41,14 @@ jobs: runs-on: ${{ inputs.os }} timeout-minutes: 60 env: + ARROW_AZURE: ON 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_FILESYSTEM: ON ARROW_FLIGHT: OFF ARROW_HDFS: ON ARROW_HOME: /usr diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index b95d6491457..37a1cffbecc 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -595,6 +595,13 @@ else() ) endif() +if(DEFINED ENV{ARROW_WIL_URL}) + set(ARROW_WIL_URL "$ENV{ARROW_WIL_URL}") +else() + set_urls(ARROW_WIL_URL + "https://github.com/microsoft/wil/archive/${ARROW_WIL_BUILD_VERSION}.tar.gz") +endif() + if(DEFINED ENV{ARROW_BOOST_URL}) set(BOOST_SOURCE_URL "$ENV{ARROW_BOOST_URL}") else() @@ -4054,6 +4061,27 @@ endif() function(build_azure_sdk) message(STATUS "Building Azure SDK for C++ from source") + + # On Windows, Azure SDK's WinHTTP transport requires WIL (Windows Implementation Libraries). + # Fetch WIL before Azure SDK so the WIL::WIL target is available. + if(WIN32) + message(STATUS "Fetching WIL (Windows Implementation Libraries) for Azure SDK") + fetchcontent_declare(wil + ${FC_DECLARE_COMMON_OPTIONS} + URL ${ARROW_WIL_URL} + URL_HASH "SHA256=${ARROW_WIL_BUILD_SHA256_CHECKSUM}") + set(WIL_BUILD_PACKAGING OFF) + set(WIL_BUILD_TESTS OFF) + fetchcontent_makeavailable(wil) + # Create a minimal config file so Azure SDK's find_package(wil CONFIG) succeeds. + # The WIL::WIL target already exists from FetchContent above. + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/wil-config/wilConfig.cmake" + "# WIL loaded via FetchContent - target WIL::WIL already exists\n") + set(wil_DIR + "${CMAKE_CURRENT_BINARY_DIR}/wil-config" + CACHE PATH "" FORCE) + endif() + fetchcontent_declare(azure_sdk ${FC_DECLARE_COMMON_OPTIONS} URL ${ARROW_AZURE_SDK_URL} diff --git a/cpp/thirdparty/versions.txt b/cpp/thirdparty/versions.txt index 442cde2c9c0..c39847ca6d4 100644 --- a/cpp/thirdparty/versions.txt +++ b/cpp/thirdparty/versions.txt @@ -56,6 +56,9 @@ ARROW_AWSSDK_BUILD_SHA256_CHECKSUM=b9944ba9905a68d6e53abb4f36ab2b3bd18ac88d85716 # Despite the confusing version name this is still the whole Azure SDK for C++ including core, keyvault, storage-common, etc. ARROW_AZURE_SDK_BUILD_VERSION=azure-identity_1.9.0 ARROW_AZURE_SDK_BUILD_SHA256_CHECKSUM=97065bfc971ac8df450853ce805f820f52b59457bd7556510186a1569502e4a1 +# WIL (Windows Implementation Libraries) is required by Azure SDK on Windows for WinHTTP transport +ARROW_WIL_BUILD_VERSION=v1.0.250325.1 +ARROW_WIL_BUILD_SHA256_CHECKSUM=c9e667d5f86ded43d17b5669d243e95ca7b437e3a167c170805ffd4aa8a9a786 ARROW_BOOST_BUILD_VERSION=1.88.0 ARROW_BOOST_BUILD_SHA256_CHECKSUM=dcea50f40ba1ecfc448fdf886c0165cf3e525fef2c9e3e080b9804e8117b9694 ARROW_BROTLI_BUILD_VERSION=v1.0.9