GH-29847: [C++] Build with Azure SDK for C++ - #36835

Merged
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk
Aug 30, 2023
Merged

GH-29847: [C++] Build with Azure SDK for C++#36835
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk

Conversation

@Tom-Newton

@Tom-NewtonTom-Newton commented Jul 24, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

We want to use the Azure SDK for C++ to read/write to Azure blob storage. Obviously this is pretty important for building an AzureFileSystem.

What changes are included in this PR?

Builds the the relevant parts of the azure SDK as a cmake external project. Adds a couple of simple tests that just assert that the Azure SDK is working and a couple of lines in AzureFileSystem to initialise the blob storage client to ensure the build is working correctly in all environments.

I started with the build setup from #12914 but I did make few changes.

  1. Although its atypical for this project we chose to switch from cmake's ExternalProject to FetchContent. FetchContent is recomended by the Azure docs https://github.com/Azure/azure-sdk-for-cpp#cmake-project--fetch-content. It also solves a few problems including: automatically linking system curl and ssl instead of bootstrapping vcpkg and installing curl and ssl from there.
  2. Only build one version of the Azure SDK for C++ because it contains all the components. Previously we were unnecessarily building 5 different versions of the whole thing on top of each other. This created race conditions for which version each component came from.
  3. We are using azure-core_1.10.2 which is a very recent version. There are a couple of important reasons for this 1. an important managed identity fix, 2. fixed support for curl versions < 7.71.0.

There will be follow up PRs to enable Azure in the manylinux builds. We need to update vcpkg first so we can get a version of the Azure SDK which contains an important managed identity fix.

Are these changes tested?

Yes. There is a simple test that just runs the Azure client against azurite. Additionally just initialising the client in AzureFileSystem goes a long way towards ensuring the build is working.

Are there any user-facing changes?

No

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #29847has been automatically assigned in GitHub to PR creator.

@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 4e3e7a5 to d0f5b65CompareJuly 24, 2023 07:43
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from d0f5b65 to 8915352CompareAugust 1, 2023 22:36
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8915352 to 9d14eddCompareAugust 7, 2023 08:08
kou added a commit that referenced this pull request Aug 7, 2023
…C++ filesystem (#36988)
### Rationale for this change
We need to write tests for #18014. azurite is like a fake Azure blob storage so it can be used to write integration tests
### What changes are included in this PR?
Extract the `azurite` related changes from #12914 to create a smaller PR that's easier to review. I have made very minimal changes compared to that PR. Currently `azurite` is configured for all the environments where `ARROW_AZURE` was enabled by #35701. I assume its deliberate that its not enabled yet for windows, alpine, conda, debian or fedora builds. ### Are these changes tested?
Its tested by there aren't really any good tests in this PR. I used this `azurite` config in #36835 to make an integration test that uses the Azure C++ SDK. On its own we can't really write tests for this `azurite` setup PR. ### Are there any user-facing changes?
No
* Closes: #36886
Lead-authored-by: Thomas Newton <thomas.w.newton@gmail.com>
Co-authored-by: Sutou Kouhei <kou@cozmixng.org>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 9d14edd to 6ec7910CompareAugust 8, 2023 07:39
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Aug 12, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
@Tom-NewtonTom-Newton changed the title WIP GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with azure C++ sdkAug 12, 2023
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8aa551a to 2560cafCompareAugust 13, 2023 12:06
@Tom-Newton
Tom-Newton marked this pull request as ready for review August 13, 2023 12:07
@koukou changed the title GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with Azure SDK for C++Aug 14, 2023
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/vcpkg/vcpkg.json Outdated
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
Comment threadcpp/vcpkg.json Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Aug 14, 2023
@pitrou

Copy link
Copy Markdown
Member

I'm trying to build with gcc 12.3.0 and I get the following error:

In file included from /build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/src/environment_credential.cpp:6:
/build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/inc/azure/identity/client_certificate_credential.hpp:68:9: error: 'Azure::Identity::ClientCertificateCredential' declared with greater visibility than the type of its field 'Azure::Identity::ClientCertificateCredential::m_pkey' [-Werror=attributes]
68 | class ClientCertificateCredential final : public Core::Credentials::TokenCredential {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

@pitrou

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Comment threadcpp/src/arrow/filesystem/azurefs.cc
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@assignUser

Copy link
Copy Markdown
Member

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

@Tom-Newton the use of external project within arrow is 'historic' as we just recently increased our minimum cmake version enough to make use of fc. Eventually it would be great to move everything to fc so adding new deps with fc instead of ep is in my eyes encouraged!

@assignUser

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Contrary to external project things added via fetchcontent are configured with the parent project and inherit variables and flags as if using add_subdirectory. So it likely is not necessary but I haven't looked at our flags script recently so 🤷

Tom-Newtonand others added 2 commits August 24, 2023 22:11
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Aug 25, 2023
@Tom-Newton

Tom-Newton commented Aug 25, 2023

Copy link
Copy Markdown
ContributorAuthor

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

So what do we think is the best option today? Is disabling -Werror at a global level an acceptable solution? Being able to disable -Werror would also be helpful for supporting Ubuntu 20 #36835 (comment)

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

I'll provide a patch for -Werror later. Please wait for a few days...

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

This is an ad-hoc patch but this will work. We need a real improvement later.

diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake
index 1dfaf71b4..9ff91f978 100644
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake@@ -5082,6 +5082,13 @@ function(build_azure_sdk)
set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)
set(DISABLE_AZURE_CORE_OPENTELEMETRY TRUE)
set(ENV{AZURE_SDK_DISABLE_AUTO_VCPKG} TRUE)
+ if(MSVC)+ string(REPLACE "/WX" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "/WX" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ else()+ string(REPLACE "-Werror" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "-Werror" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ endif()
fetchcontent_makeavailable(azure_sdk)
set(AZURE_SDK_VENDORED
TRUE

@github-actionsgithub-actionsBot removed the awaiting changes Awaiting changes label Aug 26, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@kou

kou commented Aug 28, 2023

Copy link
Copy Markdown
Member

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: e3fb84c

Submitted crossbow builds: ursacomputing/crossbow @ actions-ea66ccd89b

TaskStatus
test-alpine-linux-cppGithub Actions
test-build-cpp-fuzzGithub Actions
test-conda-cppGithub Actions
test-conda-cpp-valgrindAzure
test-cuda-cppGithub Actions
test-debian-11-cpp-amd64Github Actions
test-debian-11-cpp-i386Github Actions
test-fedora-35-cppGithub Actions
test-ubuntu-20.04-cppGithub Actions
test-ubuntu-20.04-cpp-bundledGithub Actions
test-ubuntu-20.04-cpp-minimal-with-formatsGithub Actions
test-ubuntu-20.04-cpp-thread-sanitizerGithub Actions
test-ubuntu-22.04-cppGithub Actions
test-ubuntu-22.04-cpp-20Github Actions
test-ubuntu-22.04-cpp-no-threadingGithub Actions

kou
kou approved these changes Aug 29, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

I'll merge this tomorrow if nobody objects it.

@Tom-Newton

Copy link
Copy Markdown
ContributorAuthor

Thanks for your help on this @kou. I feel kind of bad about how much work I created for you during review, with my lack of C++ experience. Hopefully the native Azure support is worth it 🙂.

@felipecrv

Copy link
Copy Markdown
Contributor

Thank you for this PR @Tom-Newton!

@kou

kou commented Aug 31, 2023

Copy link
Copy Markdown
Member

Don't worry. :-)
I'm happy that we have more contributors like you!

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 3cb4481.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto 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.

[C++] Add azure-sdk-for-cpp to ThirdpartyToolchain

6 participants

@Tom-Newton@kou@srilman@pitrou@assignUser@felipecrv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

GH-29847: [C++] Build with Azure SDK for C++ - #36835

Merged
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk
Aug 30, 2023
Merged

GH-29847: [C++] Build with Azure SDK for C++#36835
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk

Conversation

@Tom-Newton

@Tom-NewtonTom-Newton commented Jul 24, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

We want to use the Azure SDK for C++ to read/write to Azure blob storage. Obviously this is pretty important for building an AzureFileSystem.

What changes are included in this PR?

Builds the the relevant parts of the azure SDK as a cmake external project. Adds a couple of simple tests that just assert that the Azure SDK is working and a couple of lines in AzureFileSystem to initialise the blob storage client to ensure the build is working correctly in all environments.

I started with the build setup from #12914 but I did make few changes.

  1. Although its atypical for this project we chose to switch from cmake's ExternalProject to FetchContent. FetchContent is recomended by the Azure docs https://github.com/Azure/azure-sdk-for-cpp#cmake-project--fetch-content. It also solves a few problems including: automatically linking system curl and ssl instead of bootstrapping vcpkg and installing curl and ssl from there.
  2. Only build one version of the Azure SDK for C++ because it contains all the components. Previously we were unnecessarily building 5 different versions of the whole thing on top of each other. This created race conditions for which version each component came from.
  3. We are using azure-core_1.10.2 which is a very recent version. There are a couple of important reasons for this 1. an important managed identity fix, 2. fixed support for curl versions < 7.71.0.

There will be follow up PRs to enable Azure in the manylinux builds. We need to update vcpkg first so we can get a version of the Azure SDK which contains an important managed identity fix.

Are these changes tested?

Yes. There is a simple test that just runs the Azure client against azurite. Additionally just initialising the client in AzureFileSystem goes a long way towards ensuring the build is working.

Are there any user-facing changes?

No

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #29847has been automatically assigned in GitHub to PR creator.

@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 4e3e7a5 to d0f5b65CompareJuly 24, 2023 07:43
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from d0f5b65 to 8915352CompareAugust 1, 2023 22:36
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8915352 to 9d14eddCompareAugust 7, 2023 08:08
kou added a commit that referenced this pull request Aug 7, 2023
…C++ filesystem (#36988)
### Rationale for this change
We need to write tests for #18014. azurite is like a fake Azure blob storage so it can be used to write integration tests
### What changes are included in this PR?
Extract the `azurite` related changes from #12914 to create a smaller PR that's easier to review. I have made very minimal changes compared to that PR. Currently `azurite` is configured for all the environments where `ARROW_AZURE` was enabled by #35701. I assume its deliberate that its not enabled yet for windows, alpine, conda, debian or fedora builds. ### Are these changes tested?
Its tested by there aren't really any good tests in this PR. I used this `azurite` config in #36835 to make an integration test that uses the Azure C++ SDK. On its own we can't really write tests for this `azurite` setup PR. ### Are there any user-facing changes?
No
* Closes: #36886
Lead-authored-by: Thomas Newton <thomas.w.newton@gmail.com>
Co-authored-by: Sutou Kouhei <kou@cozmixng.org>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 9d14edd to 6ec7910CompareAugust 8, 2023 07:39
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Aug 12, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
@Tom-NewtonTom-Newton changed the title WIP GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with azure C++ sdkAug 12, 2023
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8aa551a to 2560cafCompareAugust 13, 2023 12:06
@Tom-Newton
Tom-Newton marked this pull request as ready for review August 13, 2023 12:07
@koukou changed the title GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with Azure SDK for C++Aug 14, 2023
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/vcpkg/vcpkg.json Outdated
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
Comment threadcpp/vcpkg.json Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Aug 14, 2023
@pitrou

Copy link
Copy Markdown
Member

I'm trying to build with gcc 12.3.0 and I get the following error:

In file included from /build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/src/environment_credential.cpp:6:
/build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/inc/azure/identity/client_certificate_credential.hpp:68:9: error: 'Azure::Identity::ClientCertificateCredential' declared with greater visibility than the type of its field 'Azure::Identity::ClientCertificateCredential::m_pkey' [-Werror=attributes]
68 | class ClientCertificateCredential final : public Core::Credentials::TokenCredential {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

@pitrou

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Comment threadcpp/src/arrow/filesystem/azurefs.cc
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@assignUser

Copy link
Copy Markdown
Member

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

@Tom-Newton the use of external project within arrow is 'historic' as we just recently increased our minimum cmake version enough to make use of fc. Eventually it would be great to move everything to fc so adding new deps with fc instead of ep is in my eyes encouraged!

@assignUser

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Contrary to external project things added via fetchcontent are configured with the parent project and inherit variables and flags as if using add_subdirectory. So it likely is not necessary but I haven't looked at our flags script recently so 🤷

Tom-Newtonand others added 2 commits August 24, 2023 22:11
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Aug 25, 2023
@Tom-Newton

Tom-Newton commented Aug 25, 2023

Copy link
Copy Markdown
ContributorAuthor

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

So what do we think is the best option today? Is disabling -Werror at a global level an acceptable solution? Being able to disable -Werror would also be helpful for supporting Ubuntu 20 #36835 (comment)

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

I'll provide a patch for -Werror later. Please wait for a few days...

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

This is an ad-hoc patch but this will work. We need a real improvement later.

diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake
index 1dfaf71b4..9ff91f978 100644
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake@@ -5082,6 +5082,13 @@ function(build_azure_sdk)
set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)
set(DISABLE_AZURE_CORE_OPENTELEMETRY TRUE)
set(ENV{AZURE_SDK_DISABLE_AUTO_VCPKG} TRUE)
+ if(MSVC)+ string(REPLACE "/WX" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "/WX" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ else()+ string(REPLACE "-Werror" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "-Werror" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ endif()
fetchcontent_makeavailable(azure_sdk)
set(AZURE_SDK_VENDORED
TRUE

@github-actionsgithub-actionsBot removed the awaiting changes Awaiting changes label Aug 26, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@kou

kou commented Aug 28, 2023

Copy link
Copy Markdown
Member

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: e3fb84c

Submitted crossbow builds: ursacomputing/crossbow @ actions-ea66ccd89b

TaskStatus
test-alpine-linux-cppGithub Actions
test-build-cpp-fuzzGithub Actions
test-conda-cppGithub Actions
test-conda-cpp-valgrindAzure
test-cuda-cppGithub Actions
test-debian-11-cpp-amd64Github Actions
test-debian-11-cpp-i386Github Actions
test-fedora-35-cppGithub Actions
test-ubuntu-20.04-cppGithub Actions
test-ubuntu-20.04-cpp-bundledGithub Actions
test-ubuntu-20.04-cpp-minimal-with-formatsGithub Actions
test-ubuntu-20.04-cpp-thread-sanitizerGithub Actions
test-ubuntu-22.04-cppGithub Actions
test-ubuntu-22.04-cpp-20Github Actions
test-ubuntu-22.04-cpp-no-threadingGithub Actions

kou
kou approved these changes Aug 29, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

I'll merge this tomorrow if nobody objects it.

@Tom-Newton

Copy link
Copy Markdown
ContributorAuthor

Thanks for your help on this @kou. I feel kind of bad about how much work I created for you during review, with my lack of C++ experience. Hopefully the native Azure support is worth it 🙂.

@felipecrv

Copy link
Copy Markdown
Contributor

Thank you for this PR @Tom-Newton!

@kou

kou commented Aug 31, 2023

Copy link
Copy Markdown
Member

Don't worry. :-)
I'm happy that we have more contributors like you!

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 3cb4481.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto 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.

[C++] Add azure-sdk-for-cpp to ThirdpartyToolchain

6 participants

@Tom-Newton@kou@srilman@pitrou@assignUser@felipecrv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-29847: [C++] Build with Azure SDK for C++ - #36835

Merged
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk
Aug 30, 2023
Merged

GH-29847: [C++] Build with Azure SDK for C++#36835
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk

Conversation

@Tom-Newton

@Tom-NewtonTom-Newton commented Jul 24, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

We want to use the Azure SDK for C++ to read/write to Azure blob storage. Obviously this is pretty important for building an AzureFileSystem.

What changes are included in this PR?

Builds the the relevant parts of the azure SDK as a cmake external project. Adds a couple of simple tests that just assert that the Azure SDK is working and a couple of lines in AzureFileSystem to initialise the blob storage client to ensure the build is working correctly in all environments.

I started with the build setup from #12914 but I did make few changes.

  1. Although its atypical for this project we chose to switch from cmake's ExternalProject to FetchContent. FetchContent is recomended by the Azure docs https://github.com/Azure/azure-sdk-for-cpp#cmake-project--fetch-content. It also solves a few problems including: automatically linking system curl and ssl instead of bootstrapping vcpkg and installing curl and ssl from there.
  2. Only build one version of the Azure SDK for C++ because it contains all the components. Previously we were unnecessarily building 5 different versions of the whole thing on top of each other. This created race conditions for which version each component came from.
  3. We are using azure-core_1.10.2 which is a very recent version. There are a couple of important reasons for this 1. an important managed identity fix, 2. fixed support for curl versions < 7.71.0.

There will be follow up PRs to enable Azure in the manylinux builds. We need to update vcpkg first so we can get a version of the Azure SDK which contains an important managed identity fix.

Are these changes tested?

Yes. There is a simple test that just runs the Azure client against azurite. Additionally just initialising the client in AzureFileSystem goes a long way towards ensuring the build is working.

Are there any user-facing changes?

No

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #29847has been automatically assigned in GitHub to PR creator.

@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 4e3e7a5 to d0f5b65CompareJuly 24, 2023 07:43
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from d0f5b65 to 8915352CompareAugust 1, 2023 22:36
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8915352 to 9d14eddCompareAugust 7, 2023 08:08
kou added a commit that referenced this pull request Aug 7, 2023
…C++ filesystem (#36988)
### Rationale for this change
We need to write tests for #18014. azurite is like a fake Azure blob storage so it can be used to write integration tests
### What changes are included in this PR?
Extract the `azurite` related changes from #12914 to create a smaller PR that's easier to review. I have made very minimal changes compared to that PR. Currently `azurite` is configured for all the environments where `ARROW_AZURE` was enabled by #35701. I assume its deliberate that its not enabled yet for windows, alpine, conda, debian or fedora builds. ### Are these changes tested?
Its tested by there aren't really any good tests in this PR. I used this `azurite` config in #36835 to make an integration test that uses the Azure C++ SDK. On its own we can't really write tests for this `azurite` setup PR. ### Are there any user-facing changes?
No
* Closes: #36886
Lead-authored-by: Thomas Newton <thomas.w.newton@gmail.com>
Co-authored-by: Sutou Kouhei <kou@cozmixng.org>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 9d14edd to 6ec7910CompareAugust 8, 2023 07:39
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Aug 12, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
@Tom-NewtonTom-Newton changed the title WIP GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with azure C++ sdkAug 12, 2023
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8aa551a to 2560cafCompareAugust 13, 2023 12:06
@Tom-Newton
Tom-Newton marked this pull request as ready for review August 13, 2023 12:07
@koukou changed the title GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with Azure SDK for C++Aug 14, 2023
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/vcpkg/vcpkg.json Outdated
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
Comment threadcpp/vcpkg.json Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Aug 14, 2023
@pitrou

Copy link
Copy Markdown
Member

I'm trying to build with gcc 12.3.0 and I get the following error:

In file included from /build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/src/environment_credential.cpp:6:
/build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/inc/azure/identity/client_certificate_credential.hpp:68:9: error: 'Azure::Identity::ClientCertificateCredential' declared with greater visibility than the type of its field 'Azure::Identity::ClientCertificateCredential::m_pkey' [-Werror=attributes]
68 | class ClientCertificateCredential final : public Core::Credentials::TokenCredential {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

@pitrou

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Comment threadcpp/src/arrow/filesystem/azurefs.cc
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@assignUser

Copy link
Copy Markdown
Member

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

@Tom-Newton the use of external project within arrow is 'historic' as we just recently increased our minimum cmake version enough to make use of fc. Eventually it would be great to move everything to fc so adding new deps with fc instead of ep is in my eyes encouraged!

@assignUser

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Contrary to external project things added via fetchcontent are configured with the parent project and inherit variables and flags as if using add_subdirectory. So it likely is not necessary but I haven't looked at our flags script recently so 🤷

Tom-Newtonand others added 2 commits August 24, 2023 22:11
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Aug 25, 2023
@Tom-Newton

Tom-Newton commented Aug 25, 2023

Copy link
Copy Markdown
ContributorAuthor

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

So what do we think is the best option today? Is disabling -Werror at a global level an acceptable solution? Being able to disable -Werror would also be helpful for supporting Ubuntu 20 #36835 (comment)

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

I'll provide a patch for -Werror later. Please wait for a few days...

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

This is an ad-hoc patch but this will work. We need a real improvement later.

diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake
index 1dfaf71b4..9ff91f978 100644
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake@@ -5082,6 +5082,13 @@ function(build_azure_sdk)
set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)
set(DISABLE_AZURE_CORE_OPENTELEMETRY TRUE)
set(ENV{AZURE_SDK_DISABLE_AUTO_VCPKG} TRUE)
+ if(MSVC)+ string(REPLACE "/WX" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "/WX" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ else()+ string(REPLACE "-Werror" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "-Werror" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ endif()
fetchcontent_makeavailable(azure_sdk)
set(AZURE_SDK_VENDORED
TRUE

@github-actionsgithub-actionsBot removed the awaiting changes Awaiting changes label Aug 26, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@kou

kou commented Aug 28, 2023

Copy link
Copy Markdown
Member

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: e3fb84c

Submitted crossbow builds: ursacomputing/crossbow @ actions-ea66ccd89b

TaskStatus
test-alpine-linux-cppGithub Actions
test-build-cpp-fuzzGithub Actions
test-conda-cppGithub Actions
test-conda-cpp-valgrindAzure
test-cuda-cppGithub Actions
test-debian-11-cpp-amd64Github Actions
test-debian-11-cpp-i386Github Actions
test-fedora-35-cppGithub Actions
test-ubuntu-20.04-cppGithub Actions
test-ubuntu-20.04-cpp-bundledGithub Actions
test-ubuntu-20.04-cpp-minimal-with-formatsGithub Actions
test-ubuntu-20.04-cpp-thread-sanitizerGithub Actions
test-ubuntu-22.04-cppGithub Actions
test-ubuntu-22.04-cpp-20Github Actions
test-ubuntu-22.04-cpp-no-threadingGithub Actions

kou
kou approved these changes Aug 29, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

I'll merge this tomorrow if nobody objects it.

@Tom-Newton

Copy link
Copy Markdown
ContributorAuthor

Thanks for your help on this @kou. I feel kind of bad about how much work I created for you during review, with my lack of C++ experience. Hopefully the native Azure support is worth it 🙂.

@felipecrv

Copy link
Copy Markdown
Contributor

Thank you for this PR @Tom-Newton!

@kou

kou commented Aug 31, 2023

Copy link
Copy Markdown
Member

Don't worry. :-)
I'm happy that we have more contributors like you!

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 3cb4481.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto 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.

[C++] Add azure-sdk-for-cpp to ThirdpartyToolchain

6 participants

@Tom-Newton@kou@srilman@pitrou@assignUser@felipecrv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-29847: [C++] Build with Azure SDK for C++ - #36835

Merged
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk
Aug 30, 2023
Merged

GH-29847: [C++] Build with Azure SDK for C++#36835
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk

Conversation

@Tom-Newton

@Tom-NewtonTom-Newton commented Jul 24, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

We want to use the Azure SDK for C++ to read/write to Azure blob storage. Obviously this is pretty important for building an AzureFileSystem.

What changes are included in this PR?

Builds the the relevant parts of the azure SDK as a cmake external project. Adds a couple of simple tests that just assert that the Azure SDK is working and a couple of lines in AzureFileSystem to initialise the blob storage client to ensure the build is working correctly in all environments.

I started with the build setup from #12914 but I did make few changes.

  1. Although its atypical for this project we chose to switch from cmake's ExternalProject to FetchContent. FetchContent is recomended by the Azure docs https://github.com/Azure/azure-sdk-for-cpp#cmake-project--fetch-content. It also solves a few problems including: automatically linking system curl and ssl instead of bootstrapping vcpkg and installing curl and ssl from there.
  2. Only build one version of the Azure SDK for C++ because it contains all the components. Previously we were unnecessarily building 5 different versions of the whole thing on top of each other. This created race conditions for which version each component came from.
  3. We are using azure-core_1.10.2 which is a very recent version. There are a couple of important reasons for this 1. an important managed identity fix, 2. fixed support for curl versions < 7.71.0.

There will be follow up PRs to enable Azure in the manylinux builds. We need to update vcpkg first so we can get a version of the Azure SDK which contains an important managed identity fix.

Are these changes tested?

Yes. There is a simple test that just runs the Azure client against azurite. Additionally just initialising the client in AzureFileSystem goes a long way towards ensuring the build is working.

Are there any user-facing changes?

No

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #29847has been automatically assigned in GitHub to PR creator.

@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 4e3e7a5 to d0f5b65CompareJuly 24, 2023 07:43
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from d0f5b65 to 8915352CompareAugust 1, 2023 22:36
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8915352 to 9d14eddCompareAugust 7, 2023 08:08
kou added a commit that referenced this pull request Aug 7, 2023
…C++ filesystem (#36988)
### Rationale for this change
We need to write tests for #18014. azurite is like a fake Azure blob storage so it can be used to write integration tests
### What changes are included in this PR?
Extract the `azurite` related changes from #12914 to create a smaller PR that's easier to review. I have made very minimal changes compared to that PR. Currently `azurite` is configured for all the environments where `ARROW_AZURE` was enabled by #35701. I assume its deliberate that its not enabled yet for windows, alpine, conda, debian or fedora builds. ### Are these changes tested?
Its tested by there aren't really any good tests in this PR. I used this `azurite` config in #36835 to make an integration test that uses the Azure C++ SDK. On its own we can't really write tests for this `azurite` setup PR. ### Are there any user-facing changes?
No
* Closes: #36886
Lead-authored-by: Thomas Newton <thomas.w.newton@gmail.com>
Co-authored-by: Sutou Kouhei <kou@cozmixng.org>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 9d14edd to 6ec7910CompareAugust 8, 2023 07:39
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Aug 12, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
@Tom-NewtonTom-Newton changed the title WIP GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with azure C++ sdkAug 12, 2023
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8aa551a to 2560cafCompareAugust 13, 2023 12:06
@Tom-Newton
Tom-Newton marked this pull request as ready for review August 13, 2023 12:07
@koukou changed the title GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with Azure SDK for C++Aug 14, 2023
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/vcpkg/vcpkg.json Outdated
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
Comment threadcpp/vcpkg.json Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Aug 14, 2023
@pitrou

Copy link
Copy Markdown
Member

I'm trying to build with gcc 12.3.0 and I get the following error:

In file included from /build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/src/environment_credential.cpp:6:
/build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/inc/azure/identity/client_certificate_credential.hpp:68:9: error: 'Azure::Identity::ClientCertificateCredential' declared with greater visibility than the type of its field 'Azure::Identity::ClientCertificateCredential::m_pkey' [-Werror=attributes]
68 | class ClientCertificateCredential final : public Core::Credentials::TokenCredential {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

@pitrou

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Comment threadcpp/src/arrow/filesystem/azurefs.cc
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@assignUser

Copy link
Copy Markdown
Member

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

@Tom-Newton the use of external project within arrow is 'historic' as we just recently increased our minimum cmake version enough to make use of fc. Eventually it would be great to move everything to fc so adding new deps with fc instead of ep is in my eyes encouraged!

@assignUser

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Contrary to external project things added via fetchcontent are configured with the parent project and inherit variables and flags as if using add_subdirectory. So it likely is not necessary but I haven't looked at our flags script recently so 🤷

Tom-Newtonand others added 2 commits August 24, 2023 22:11
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Aug 25, 2023
@Tom-Newton

Tom-Newton commented Aug 25, 2023

Copy link
Copy Markdown
ContributorAuthor

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

So what do we think is the best option today? Is disabling -Werror at a global level an acceptable solution? Being able to disable -Werror would also be helpful for supporting Ubuntu 20 #36835 (comment)

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

I'll provide a patch for -Werror later. Please wait for a few days...

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

This is an ad-hoc patch but this will work. We need a real improvement later.

diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake
index 1dfaf71b4..9ff91f978 100644
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake@@ -5082,6 +5082,13 @@ function(build_azure_sdk)
set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)
set(DISABLE_AZURE_CORE_OPENTELEMETRY TRUE)
set(ENV{AZURE_SDK_DISABLE_AUTO_VCPKG} TRUE)
+ if(MSVC)+ string(REPLACE "/WX" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "/WX" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ else()+ string(REPLACE "-Werror" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "-Werror" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ endif()
fetchcontent_makeavailable(azure_sdk)
set(AZURE_SDK_VENDORED
TRUE

@github-actionsgithub-actionsBot removed the awaiting changes Awaiting changes label Aug 26, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@kou

kou commented Aug 28, 2023

Copy link
Copy Markdown
Member

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: e3fb84c

Submitted crossbow builds: ursacomputing/crossbow @ actions-ea66ccd89b

TaskStatus
test-alpine-linux-cppGithub Actions
test-build-cpp-fuzzGithub Actions
test-conda-cppGithub Actions
test-conda-cpp-valgrindAzure
test-cuda-cppGithub Actions
test-debian-11-cpp-amd64Github Actions
test-debian-11-cpp-i386Github Actions
test-fedora-35-cppGithub Actions
test-ubuntu-20.04-cppGithub Actions
test-ubuntu-20.04-cpp-bundledGithub Actions
test-ubuntu-20.04-cpp-minimal-with-formatsGithub Actions
test-ubuntu-20.04-cpp-thread-sanitizerGithub Actions
test-ubuntu-22.04-cppGithub Actions
test-ubuntu-22.04-cpp-20Github Actions
test-ubuntu-22.04-cpp-no-threadingGithub Actions

kou
kou approved these changes Aug 29, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

I'll merge this tomorrow if nobody objects it.

@Tom-Newton

Copy link
Copy Markdown
ContributorAuthor

Thanks for your help on this @kou. I feel kind of bad about how much work I created for you during review, with my lack of C++ experience. Hopefully the native Azure support is worth it 🙂.

@felipecrv

Copy link
Copy Markdown
Contributor

Thank you for this PR @Tom-Newton!

@kou

kou commented Aug 31, 2023

Copy link
Copy Markdown
Member

Don't worry. :-)
I'm happy that we have more contributors like you!

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 3cb4481.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto 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.

[C++] Add azure-sdk-for-cpp to ThirdpartyToolchain

6 participants

@Tom-Newton@kou@srilman@pitrou@assignUser@felipecrv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

GH-29847: [C++] Build with Azure SDK for C++ - #36835

Merged
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk
Aug 30, 2023
Merged

GH-29847: [C++] Build with Azure SDK for C++#36835
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk

Conversation

@Tom-Newton

@Tom-NewtonTom-Newton commented Jul 24, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

We want to use the Azure SDK for C++ to read/write to Azure blob storage. Obviously this is pretty important for building an AzureFileSystem.

What changes are included in this PR?

Builds the the relevant parts of the azure SDK as a cmake external project. Adds a couple of simple tests that just assert that the Azure SDK is working and a couple of lines in AzureFileSystem to initialise the blob storage client to ensure the build is working correctly in all environments.

I started with the build setup from #12914 but I did make few changes.

  1. Although its atypical for this project we chose to switch from cmake's ExternalProject to FetchContent. FetchContent is recomended by the Azure docs https://github.com/Azure/azure-sdk-for-cpp#cmake-project--fetch-content. It also solves a few problems including: automatically linking system curl and ssl instead of bootstrapping vcpkg and installing curl and ssl from there.
  2. Only build one version of the Azure SDK for C++ because it contains all the components. Previously we were unnecessarily building 5 different versions of the whole thing on top of each other. This created race conditions for which version each component came from.
  3. We are using azure-core_1.10.2 which is a very recent version. There are a couple of important reasons for this 1. an important managed identity fix, 2. fixed support for curl versions < 7.71.0.

There will be follow up PRs to enable Azure in the manylinux builds. We need to update vcpkg first so we can get a version of the Azure SDK which contains an important managed identity fix.

Are these changes tested?

Yes. There is a simple test that just runs the Azure client against azurite. Additionally just initialising the client in AzureFileSystem goes a long way towards ensuring the build is working.

Are there any user-facing changes?

No

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #29847has been automatically assigned in GitHub to PR creator.

@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 4e3e7a5 to d0f5b65CompareJuly 24, 2023 07:43
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from d0f5b65 to 8915352CompareAugust 1, 2023 22:36
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8915352 to 9d14eddCompareAugust 7, 2023 08:08
kou added a commit that referenced this pull request Aug 7, 2023
…C++ filesystem (#36988)
### Rationale for this change
We need to write tests for #18014. azurite is like a fake Azure blob storage so it can be used to write integration tests
### What changes are included in this PR?
Extract the `azurite` related changes from #12914 to create a smaller PR that's easier to review. I have made very minimal changes compared to that PR. Currently `azurite` is configured for all the environments where `ARROW_AZURE` was enabled by #35701. I assume its deliberate that its not enabled yet for windows, alpine, conda, debian or fedora builds. ### Are these changes tested?
Its tested by there aren't really any good tests in this PR. I used this `azurite` config in #36835 to make an integration test that uses the Azure C++ SDK. On its own we can't really write tests for this `azurite` setup PR. ### Are there any user-facing changes?
No
* Closes: #36886
Lead-authored-by: Thomas Newton <thomas.w.newton@gmail.com>
Co-authored-by: Sutou Kouhei <kou@cozmixng.org>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 9d14edd to 6ec7910CompareAugust 8, 2023 07:39
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Aug 12, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
@Tom-NewtonTom-Newton changed the title WIP GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with azure C++ sdkAug 12, 2023
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8aa551a to 2560cafCompareAugust 13, 2023 12:06
@Tom-Newton
Tom-Newton marked this pull request as ready for review August 13, 2023 12:07
@koukou changed the title GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with Azure SDK for C++Aug 14, 2023
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/vcpkg/vcpkg.json Outdated
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
Comment threadcpp/vcpkg.json Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Aug 14, 2023
@pitrou

Copy link
Copy Markdown
Member

I'm trying to build with gcc 12.3.0 and I get the following error:

In file included from /build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/src/environment_credential.cpp:6:
/build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/inc/azure/identity/client_certificate_credential.hpp:68:9: error: 'Azure::Identity::ClientCertificateCredential' declared with greater visibility than the type of its field 'Azure::Identity::ClientCertificateCredential::m_pkey' [-Werror=attributes]
68 | class ClientCertificateCredential final : public Core::Credentials::TokenCredential {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

@pitrou

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Comment threadcpp/src/arrow/filesystem/azurefs.cc
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@assignUser

Copy link
Copy Markdown
Member

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

@Tom-Newton the use of external project within arrow is 'historic' as we just recently increased our minimum cmake version enough to make use of fc. Eventually it would be great to move everything to fc so adding new deps with fc instead of ep is in my eyes encouraged!

@assignUser

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Contrary to external project things added via fetchcontent are configured with the parent project and inherit variables and flags as if using add_subdirectory. So it likely is not necessary but I haven't looked at our flags script recently so 🤷

Tom-Newtonand others added 2 commits August 24, 2023 22:11
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Aug 25, 2023
@Tom-Newton

Tom-Newton commented Aug 25, 2023

Copy link
Copy Markdown
ContributorAuthor

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

So what do we think is the best option today? Is disabling -Werror at a global level an acceptable solution? Being able to disable -Werror would also be helpful for supporting Ubuntu 20 #36835 (comment)

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

I'll provide a patch for -Werror later. Please wait for a few days...

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

This is an ad-hoc patch but this will work. We need a real improvement later.

diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake
index 1dfaf71b4..9ff91f978 100644
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake@@ -5082,6 +5082,13 @@ function(build_azure_sdk)
set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)
set(DISABLE_AZURE_CORE_OPENTELEMETRY TRUE)
set(ENV{AZURE_SDK_DISABLE_AUTO_VCPKG} TRUE)
+ if(MSVC)+ string(REPLACE "/WX" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "/WX" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ else()+ string(REPLACE "-Werror" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "-Werror" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ endif()
fetchcontent_makeavailable(azure_sdk)
set(AZURE_SDK_VENDORED
TRUE

@github-actionsgithub-actionsBot removed the awaiting changes Awaiting changes label Aug 26, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@kou

kou commented Aug 28, 2023

Copy link
Copy Markdown
Member

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: e3fb84c

Submitted crossbow builds: ursacomputing/crossbow @ actions-ea66ccd89b

TaskStatus
test-alpine-linux-cppGithub Actions
test-build-cpp-fuzzGithub Actions
test-conda-cppGithub Actions
test-conda-cpp-valgrindAzure
test-cuda-cppGithub Actions
test-debian-11-cpp-amd64Github Actions
test-debian-11-cpp-i386Github Actions
test-fedora-35-cppGithub Actions
test-ubuntu-20.04-cppGithub Actions
test-ubuntu-20.04-cpp-bundledGithub Actions
test-ubuntu-20.04-cpp-minimal-with-formatsGithub Actions
test-ubuntu-20.04-cpp-thread-sanitizerGithub Actions
test-ubuntu-22.04-cppGithub Actions
test-ubuntu-22.04-cpp-20Github Actions
test-ubuntu-22.04-cpp-no-threadingGithub Actions

kou
kou approved these changes Aug 29, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

I'll merge this tomorrow if nobody objects it.

@Tom-Newton

Copy link
Copy Markdown
ContributorAuthor

Thanks for your help on this @kou. I feel kind of bad about how much work I created for you during review, with my lack of C++ experience. Hopefully the native Azure support is worth it 🙂.

@felipecrv

Copy link
Copy Markdown
Contributor

Thank you for this PR @Tom-Newton!

@kou

kou commented Aug 31, 2023

Copy link
Copy Markdown
Member

Don't worry. :-)
I'm happy that we have more contributors like you!

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 3cb4481.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto 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.

[C++] Add azure-sdk-for-cpp to ThirdpartyToolchain

6 participants

@Tom-Newton@kou@srilman@pitrou@assignUser@felipecrv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-29847: [C++] Build with Azure SDK for C++ - #36835

Merged
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk
Aug 30, 2023
Merged

GH-29847: [C++] Build with Azure SDK for C++#36835
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk

Conversation

@Tom-Newton

@Tom-NewtonTom-Newton commented Jul 24, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

We want to use the Azure SDK for C++ to read/write to Azure blob storage. Obviously this is pretty important for building an AzureFileSystem.

What changes are included in this PR?

Builds the the relevant parts of the azure SDK as a cmake external project. Adds a couple of simple tests that just assert that the Azure SDK is working and a couple of lines in AzureFileSystem to initialise the blob storage client to ensure the build is working correctly in all environments.

I started with the build setup from #12914 but I did make few changes.

  1. Although its atypical for this project we chose to switch from cmake's ExternalProject to FetchContent. FetchContent is recomended by the Azure docs https://github.com/Azure/azure-sdk-for-cpp#cmake-project--fetch-content. It also solves a few problems including: automatically linking system curl and ssl instead of bootstrapping vcpkg and installing curl and ssl from there.
  2. Only build one version of the Azure SDK for C++ because it contains all the components. Previously we were unnecessarily building 5 different versions of the whole thing on top of each other. This created race conditions for which version each component came from.
  3. We are using azure-core_1.10.2 which is a very recent version. There are a couple of important reasons for this 1. an important managed identity fix, 2. fixed support for curl versions < 7.71.0.

There will be follow up PRs to enable Azure in the manylinux builds. We need to update vcpkg first so we can get a version of the Azure SDK which contains an important managed identity fix.

Are these changes tested?

Yes. There is a simple test that just runs the Azure client against azurite. Additionally just initialising the client in AzureFileSystem goes a long way towards ensuring the build is working.

Are there any user-facing changes?

No

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #29847has been automatically assigned in GitHub to PR creator.

@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 4e3e7a5 to d0f5b65CompareJuly 24, 2023 07:43
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from d0f5b65 to 8915352CompareAugust 1, 2023 22:36
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8915352 to 9d14eddCompareAugust 7, 2023 08:08
kou added a commit that referenced this pull request Aug 7, 2023
…C++ filesystem (#36988)
### Rationale for this change
We need to write tests for #18014. azurite is like a fake Azure blob storage so it can be used to write integration tests
### What changes are included in this PR?
Extract the `azurite` related changes from #12914 to create a smaller PR that's easier to review. I have made very minimal changes compared to that PR. Currently `azurite` is configured for all the environments where `ARROW_AZURE` was enabled by #35701. I assume its deliberate that its not enabled yet for windows, alpine, conda, debian or fedora builds. ### Are these changes tested?
Its tested by there aren't really any good tests in this PR. I used this `azurite` config in #36835 to make an integration test that uses the Azure C++ SDK. On its own we can't really write tests for this `azurite` setup PR. ### Are there any user-facing changes?
No
* Closes: #36886
Lead-authored-by: Thomas Newton <thomas.w.newton@gmail.com>
Co-authored-by: Sutou Kouhei <kou@cozmixng.org>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 9d14edd to 6ec7910CompareAugust 8, 2023 07:39
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Aug 12, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
@Tom-NewtonTom-Newton changed the title WIP GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with azure C++ sdkAug 12, 2023
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8aa551a to 2560cafCompareAugust 13, 2023 12:06
@Tom-Newton
Tom-Newton marked this pull request as ready for review August 13, 2023 12:07
@koukou changed the title GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with Azure SDK for C++Aug 14, 2023
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/vcpkg/vcpkg.json Outdated
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
Comment threadcpp/vcpkg.json Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Aug 14, 2023
@pitrou

Copy link
Copy Markdown
Member

I'm trying to build with gcc 12.3.0 and I get the following error:

In file included from /build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/src/environment_credential.cpp:6:
/build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/inc/azure/identity/client_certificate_credential.hpp:68:9: error: 'Azure::Identity::ClientCertificateCredential' declared with greater visibility than the type of its field 'Azure::Identity::ClientCertificateCredential::m_pkey' [-Werror=attributes]
68 | class ClientCertificateCredential final : public Core::Credentials::TokenCredential {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

@pitrou

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Comment threadcpp/src/arrow/filesystem/azurefs.cc
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@assignUser

Copy link
Copy Markdown
Member

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

@Tom-Newton the use of external project within arrow is 'historic' as we just recently increased our minimum cmake version enough to make use of fc. Eventually it would be great to move everything to fc so adding new deps with fc instead of ep is in my eyes encouraged!

@assignUser

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Contrary to external project things added via fetchcontent are configured with the parent project and inherit variables and flags as if using add_subdirectory. So it likely is not necessary but I haven't looked at our flags script recently so 🤷

Tom-Newtonand others added 2 commits August 24, 2023 22:11
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Aug 25, 2023
@Tom-Newton

Tom-Newton commented Aug 25, 2023

Copy link
Copy Markdown
ContributorAuthor

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

So what do we think is the best option today? Is disabling -Werror at a global level an acceptable solution? Being able to disable -Werror would also be helpful for supporting Ubuntu 20 #36835 (comment)

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

I'll provide a patch for -Werror later. Please wait for a few days...

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

This is an ad-hoc patch but this will work. We need a real improvement later.

diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake
index 1dfaf71b4..9ff91f978 100644
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake@@ -5082,6 +5082,13 @@ function(build_azure_sdk)
set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)
set(DISABLE_AZURE_CORE_OPENTELEMETRY TRUE)
set(ENV{AZURE_SDK_DISABLE_AUTO_VCPKG} TRUE)
+ if(MSVC)+ string(REPLACE "/WX" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "/WX" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ else()+ string(REPLACE "-Werror" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "-Werror" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ endif()
fetchcontent_makeavailable(azure_sdk)
set(AZURE_SDK_VENDORED
TRUE

@github-actionsgithub-actionsBot removed the awaiting changes Awaiting changes label Aug 26, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@kou

kou commented Aug 28, 2023

Copy link
Copy Markdown
Member

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: e3fb84c

Submitted crossbow builds: ursacomputing/crossbow @ actions-ea66ccd89b

TaskStatus
test-alpine-linux-cppGithub Actions
test-build-cpp-fuzzGithub Actions
test-conda-cppGithub Actions
test-conda-cpp-valgrindAzure
test-cuda-cppGithub Actions
test-debian-11-cpp-amd64Github Actions
test-debian-11-cpp-i386Github Actions
test-fedora-35-cppGithub Actions
test-ubuntu-20.04-cppGithub Actions
test-ubuntu-20.04-cpp-bundledGithub Actions
test-ubuntu-20.04-cpp-minimal-with-formatsGithub Actions
test-ubuntu-20.04-cpp-thread-sanitizerGithub Actions
test-ubuntu-22.04-cppGithub Actions
test-ubuntu-22.04-cpp-20Github Actions
test-ubuntu-22.04-cpp-no-threadingGithub Actions

kou
kou approved these changes Aug 29, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

I'll merge this tomorrow if nobody objects it.

@Tom-Newton

Copy link
Copy Markdown
ContributorAuthor

Thanks for your help on this @kou. I feel kind of bad about how much work I created for you during review, with my lack of C++ experience. Hopefully the native Azure support is worth it 🙂.

@felipecrv

Copy link
Copy Markdown
Contributor

Thank you for this PR @Tom-Newton!

@kou

kou commented Aug 31, 2023

Copy link
Copy Markdown
Member

Don't worry. :-)
I'm happy that we have more contributors like you!

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 3cb4481.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto 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.

[C++] Add azure-sdk-for-cpp to ThirdpartyToolchain

6 participants

@Tom-Newton@kou@srilman@pitrou@assignUser@felipecrv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-29847: [C++] Build with Azure SDK for C++ - #36835

Merged
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk
Aug 30, 2023
Merged

GH-29847: [C++] Build with Azure SDK for C++#36835
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk

Conversation

@Tom-Newton

@Tom-NewtonTom-Newton commented Jul 24, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

We want to use the Azure SDK for C++ to read/write to Azure blob storage. Obviously this is pretty important for building an AzureFileSystem.

What changes are included in this PR?

Builds the the relevant parts of the azure SDK as a cmake external project. Adds a couple of simple tests that just assert that the Azure SDK is working and a couple of lines in AzureFileSystem to initialise the blob storage client to ensure the build is working correctly in all environments.

I started with the build setup from #12914 but I did make few changes.

  1. Although its atypical for this project we chose to switch from cmake's ExternalProject to FetchContent. FetchContent is recomended by the Azure docs https://github.com/Azure/azure-sdk-for-cpp#cmake-project--fetch-content. It also solves a few problems including: automatically linking system curl and ssl instead of bootstrapping vcpkg and installing curl and ssl from there.
  2. Only build one version of the Azure SDK for C++ because it contains all the components. Previously we were unnecessarily building 5 different versions of the whole thing on top of each other. This created race conditions for which version each component came from.
  3. We are using azure-core_1.10.2 which is a very recent version. There are a couple of important reasons for this 1. an important managed identity fix, 2. fixed support for curl versions < 7.71.0.

There will be follow up PRs to enable Azure in the manylinux builds. We need to update vcpkg first so we can get a version of the Azure SDK which contains an important managed identity fix.

Are these changes tested?

Yes. There is a simple test that just runs the Azure client against azurite. Additionally just initialising the client in AzureFileSystem goes a long way towards ensuring the build is working.

Are there any user-facing changes?

No

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #29847has been automatically assigned in GitHub to PR creator.

@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 4e3e7a5 to d0f5b65CompareJuly 24, 2023 07:43
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from d0f5b65 to 8915352CompareAugust 1, 2023 22:36
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8915352 to 9d14eddCompareAugust 7, 2023 08:08
kou added a commit that referenced this pull request Aug 7, 2023
…C++ filesystem (#36988)
### Rationale for this change
We need to write tests for #18014. azurite is like a fake Azure blob storage so it can be used to write integration tests
### What changes are included in this PR?
Extract the `azurite` related changes from #12914 to create a smaller PR that's easier to review. I have made very minimal changes compared to that PR. Currently `azurite` is configured for all the environments where `ARROW_AZURE` was enabled by #35701. I assume its deliberate that its not enabled yet for windows, alpine, conda, debian or fedora builds. ### Are these changes tested?
Its tested by there aren't really any good tests in this PR. I used this `azurite` config in #36835 to make an integration test that uses the Azure C++ SDK. On its own we can't really write tests for this `azurite` setup PR. ### Are there any user-facing changes?
No
* Closes: #36886
Lead-authored-by: Thomas Newton <thomas.w.newton@gmail.com>
Co-authored-by: Sutou Kouhei <kou@cozmixng.org>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 9d14edd to 6ec7910CompareAugust 8, 2023 07:39
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Aug 12, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
@Tom-NewtonTom-Newton changed the title WIP GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with azure C++ sdkAug 12, 2023
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8aa551a to 2560cafCompareAugust 13, 2023 12:06
@Tom-Newton
Tom-Newton marked this pull request as ready for review August 13, 2023 12:07
@koukou changed the title GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with Azure SDK for C++Aug 14, 2023
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/vcpkg/vcpkg.json Outdated
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
Comment threadcpp/vcpkg.json Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Aug 14, 2023
@pitrou

Copy link
Copy Markdown
Member

I'm trying to build with gcc 12.3.0 and I get the following error:

In file included from /build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/src/environment_credential.cpp:6:
/build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/inc/azure/identity/client_certificate_credential.hpp:68:9: error: 'Azure::Identity::ClientCertificateCredential' declared with greater visibility than the type of its field 'Azure::Identity::ClientCertificateCredential::m_pkey' [-Werror=attributes]
68 | class ClientCertificateCredential final : public Core::Credentials::TokenCredential {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

@pitrou

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Comment threadcpp/src/arrow/filesystem/azurefs.cc
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@assignUser

Copy link
Copy Markdown
Member

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

@Tom-Newton the use of external project within arrow is 'historic' as we just recently increased our minimum cmake version enough to make use of fc. Eventually it would be great to move everything to fc so adding new deps with fc instead of ep is in my eyes encouraged!

@assignUser

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Contrary to external project things added via fetchcontent are configured with the parent project and inherit variables and flags as if using add_subdirectory. So it likely is not necessary but I haven't looked at our flags script recently so 🤷

Tom-Newtonand others added 2 commits August 24, 2023 22:11
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Aug 25, 2023
@Tom-Newton

Tom-Newton commented Aug 25, 2023

Copy link
Copy Markdown
ContributorAuthor

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

So what do we think is the best option today? Is disabling -Werror at a global level an acceptable solution? Being able to disable -Werror would also be helpful for supporting Ubuntu 20 #36835 (comment)

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

I'll provide a patch for -Werror later. Please wait for a few days...

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

This is an ad-hoc patch but this will work. We need a real improvement later.

diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake
index 1dfaf71b4..9ff91f978 100644
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake@@ -5082,6 +5082,13 @@ function(build_azure_sdk)
set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)
set(DISABLE_AZURE_CORE_OPENTELEMETRY TRUE)
set(ENV{AZURE_SDK_DISABLE_AUTO_VCPKG} TRUE)
+ if(MSVC)+ string(REPLACE "/WX" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "/WX" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ else()+ string(REPLACE "-Werror" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "-Werror" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ endif()
fetchcontent_makeavailable(azure_sdk)
set(AZURE_SDK_VENDORED
TRUE

@github-actionsgithub-actionsBot removed the awaiting changes Awaiting changes label Aug 26, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@kou

kou commented Aug 28, 2023

Copy link
Copy Markdown
Member

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: e3fb84c

Submitted crossbow builds: ursacomputing/crossbow @ actions-ea66ccd89b

TaskStatus
test-alpine-linux-cppGithub Actions
test-build-cpp-fuzzGithub Actions
test-conda-cppGithub Actions
test-conda-cpp-valgrindAzure
test-cuda-cppGithub Actions
test-debian-11-cpp-amd64Github Actions
test-debian-11-cpp-i386Github Actions
test-fedora-35-cppGithub Actions
test-ubuntu-20.04-cppGithub Actions
test-ubuntu-20.04-cpp-bundledGithub Actions
test-ubuntu-20.04-cpp-minimal-with-formatsGithub Actions
test-ubuntu-20.04-cpp-thread-sanitizerGithub Actions
test-ubuntu-22.04-cppGithub Actions
test-ubuntu-22.04-cpp-20Github Actions
test-ubuntu-22.04-cpp-no-threadingGithub Actions

kou
kou approved these changes Aug 29, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

I'll merge this tomorrow if nobody objects it.

@Tom-Newton

Copy link
Copy Markdown
ContributorAuthor

Thanks for your help on this @kou. I feel kind of bad about how much work I created for you during review, with my lack of C++ experience. Hopefully the native Azure support is worth it 🙂.

@felipecrv

Copy link
Copy Markdown
Contributor

Thank you for this PR @Tom-Newton!

@kou

kou commented Aug 31, 2023

Copy link
Copy Markdown
Member

Don't worry. :-)
I'm happy that we have more contributors like you!

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 3cb4481.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto 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.

[C++] Add azure-sdk-for-cpp to ThirdpartyToolchain

6 participants

@Tom-Newton@kou@srilman@pitrou@assignUser@felipecrv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

GH-29847: [C++] Build with Azure SDK for C++ - #36835

Merged
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk
Aug 30, 2023
Merged

GH-29847: [C++] Build with Azure SDK for C++#36835
kou merged 93 commits into
apache:mainfrom
Tom-Newton:tomnewton/build_azure_sdk

Conversation

@Tom-Newton

@Tom-NewtonTom-Newton commented Jul 24, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

We want to use the Azure SDK for C++ to read/write to Azure blob storage. Obviously this is pretty important for building an AzureFileSystem.

What changes are included in this PR?

Builds the the relevant parts of the azure SDK as a cmake external project. Adds a couple of simple tests that just assert that the Azure SDK is working and a couple of lines in AzureFileSystem to initialise the blob storage client to ensure the build is working correctly in all environments.

I started with the build setup from #12914 but I did make few changes.

  1. Although its atypical for this project we chose to switch from cmake's ExternalProject to FetchContent. FetchContent is recomended by the Azure docs https://github.com/Azure/azure-sdk-for-cpp#cmake-project--fetch-content. It also solves a few problems including: automatically linking system curl and ssl instead of bootstrapping vcpkg and installing curl and ssl from there.
  2. Only build one version of the Azure SDK for C++ because it contains all the components. Previously we were unnecessarily building 5 different versions of the whole thing on top of each other. This created race conditions for which version each component came from.
  3. We are using azure-core_1.10.2 which is a very recent version. There are a couple of important reasons for this 1. an important managed identity fix, 2. fixed support for curl versions < 7.71.0.

There will be follow up PRs to enable Azure in the manylinux builds. We need to update vcpkg first so we can get a version of the Azure SDK which contains an important managed identity fix.

Are these changes tested?

Yes. There is a simple test that just runs the Azure client against azurite. Additionally just initialising the client in AzureFileSystem goes a long way towards ensuring the build is working.

Are there any user-facing changes?

No

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #29847has been automatically assigned in GitHub to PR creator.

@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 4e3e7a5 to d0f5b65CompareJuly 24, 2023 07:43
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from d0f5b65 to 8915352CompareAugust 1, 2023 22:36
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8915352 to 9d14eddCompareAugust 7, 2023 08:08
kou added a commit that referenced this pull request Aug 7, 2023
…C++ filesystem (#36988)
### Rationale for this change
We need to write tests for #18014. azurite is like a fake Azure blob storage so it can be used to write integration tests
### What changes are included in this PR?
Extract the `azurite` related changes from #12914 to create a smaller PR that's easier to review. I have made very minimal changes compared to that PR. Currently `azurite` is configured for all the environments where `ARROW_AZURE` was enabled by #35701. I assume its deliberate that its not enabled yet for windows, alpine, conda, debian or fedora builds. ### Are these changes tested?
Its tested by there aren't really any good tests in this PR. I used this `azurite` config in #36835 to make an integration test that uses the Azure C++ SDK. On its own we can't really write tests for this `azurite` setup PR. ### Are there any user-facing changes?
No
* Closes: #36886
Lead-authored-by: Thomas Newton <thomas.w.newton@gmail.com>
Co-authored-by: Sutou Kouhei <kou@cozmixng.org>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 9d14edd to 6ec7910CompareAugust 8, 2023 07:39
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Aug 12, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
@Tom-NewtonTom-Newton changed the title WIP GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with azure C++ sdkAug 12, 2023
@Tom-Newton
Tom-Newtonforce-pushed the tomnewton/build_azure_sdk branch from 8aa551a to 2560cafCompareAugust 13, 2023 12:06
@Tom-Newton
Tom-Newton marked this pull request as ready for review August 13, 2023 12:07
@koukou changed the title GH-29847: [C++] Build with azure C++ sdkGH-29847: [C++] Build with Azure SDK for C++Aug 14, 2023
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/scripts/python_wheel_manylinux_build.sh Outdated
Comment threadci/vcpkg/vcpkg.json Outdated
Comment threadci/docker/ubuntu-20.04-cpp.dockerfile Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/thirdparty/versions.txt Outdated
Comment threadcpp/vcpkg.json Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Aug 14, 2023
@pitrou

Copy link
Copy Markdown
Member

I'm trying to build with gcc 12.3.0 and I get the following error:

In file included from /build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/src/environment_credential.cpp:6:
/build/build-test/_deps/azure_sdk-src/sdk/identity/azure-identity/inc/azure/identity/client_certificate_credential.hpp:68:9: error: 'Azure::Identity::ClientCertificateCredential' declared with greater visibility than the type of its field 'Azure::Identity::ClientCertificateCredential::m_pkey' [-Werror=attributes]
68 | class ClientCertificateCredential final : public Core::Credentials::TokenCredential {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

@pitrou

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Comment threadcpp/src/arrow/filesystem/azurefs.cc
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@assignUser

Copy link
Copy Markdown
Member

It seems like we're passing -Wall -Werror when building bundled dependencies? It makes us heavily dependent on maintenance policies of third-party projects.

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

@Tom-Newton the use of external project within arrow is 'historic' as we just recently increased our minimum cmake version enough to make use of fc. Eventually it would be great to move everything to fc so adding new deps with fc instead of ep is in my eyes encouraged!

@assignUser

Copy link
Copy Markdown
Member

We normally use the EP_CXX_FLAGS cmake variable when compiling bundled dependencies, but it seems that isn't forwarded by the FetchContent-based directives?

Contrary to external project things added via fetchcontent are configured with the parent project and inherit variables and flags as if using add_subdirectory. So it likely is not necessary but I haven't looked at our flags script recently so 🤷

Tom-Newtonand others added 2 commits August 24, 2023 22:11
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Aug 25, 2023
@Tom-Newton

Tom-Newton commented Aug 25, 2023

Copy link
Copy Markdown
ContributorAuthor

I agree dependencies should not be build with -Werror etc. This is an issue with the use of the flag variables directly. As we can now use cmake 3.16 we should move to target based properties vs global flags but that is of course a major refactor...

So what do we think is the best option today? Is disabling -Werror at a global level an acceptable solution? Being able to disable -Werror would also be helpful for supporting Ubuntu 20 #36835 (comment)

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

I'll provide a patch for -Werror later. Please wait for a few days...

@kou

kou commented Aug 26, 2023

Copy link
Copy Markdown
Member

This is an ad-hoc patch but this will work. We need a real improvement later.

diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake
index 1dfaf71b4..9ff91f978 100644
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake@@ -5082,6 +5082,13 @@ function(build_azure_sdk)
set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)
set(DISABLE_AZURE_CORE_OPENTELEMETRY TRUE)
set(ENV{AZURE_SDK_DISABLE_AUTO_VCPKG} TRUE)
+ if(MSVC)+ string(REPLACE "/WX" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "/WX" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ else()+ string(REPLACE "-Werror" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")+ string(REPLACE "-Werror" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")+ endif()
fetchcontent_makeavailable(azure_sdk)
set(AZURE_SDK_VENDORED
TRUE

@github-actionsgithub-actionsBot removed the awaiting changes Awaiting changes label Aug 26, 2023
Comment threadcpp/cmake_modules/ThirdpartyToolchain.cmake Outdated
@kou

kou commented Aug 28, 2023

Copy link
Copy Markdown
Member

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: e3fb84c

Submitted crossbow builds: ursacomputing/crossbow @ actions-ea66ccd89b

TaskStatus
test-alpine-linux-cppGithub Actions
test-build-cpp-fuzzGithub Actions
test-conda-cppGithub Actions
test-conda-cpp-valgrindAzure
test-cuda-cppGithub Actions
test-debian-11-cpp-amd64Github Actions
test-debian-11-cpp-i386Github Actions
test-fedora-35-cppGithub Actions
test-ubuntu-20.04-cppGithub Actions
test-ubuntu-20.04-cpp-bundledGithub Actions
test-ubuntu-20.04-cpp-minimal-with-formatsGithub Actions
test-ubuntu-20.04-cpp-thread-sanitizerGithub Actions
test-ubuntu-22.04-cppGithub Actions
test-ubuntu-22.04-cpp-20Github Actions
test-ubuntu-22.04-cpp-no-threadingGithub Actions

kou
kou approved these changes Aug 29, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

I'll merge this tomorrow if nobody objects it.

@Tom-Newton

Copy link
Copy Markdown
ContributorAuthor

Thanks for your help on this @kou. I feel kind of bad about how much work I created for you during review, with my lack of C++ experience. Hopefully the native Azure support is worth it 🙂.

@felipecrv

Copy link
Copy Markdown
Contributor

Thank you for this PR @Tom-Newton!

@kou

kou commented Aug 31, 2023

Copy link
Copy Markdown
Member

Don't worry. :-)
I'm happy that we have more contributors like you!

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 3cb4481.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto 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.

[C++] Add azure-sdk-for-cpp to ThirdpartyToolchain

6 participants

@Tom-Newton@kou@srilman@pitrou@assignUser@felipecrv