diff --git a/ci/scripts/cpp_test.sh b/ci/scripts/cpp_test.sh index 18c301c5fdac..0863afc13a28 100755 --- a/ci/scripts/cpp_test.sh +++ b/ci/scripts/cpp_test.sh @@ -146,12 +146,19 @@ if [ "${ARROW_USE_MESON:-OFF}" = "OFF" ] && \ cmake \ -S "${source_dir}/examples/minimal_build" \ -B "${build_dir}/examples/minimal_build" \ + -DARROW_EXAMPLE_S3_STATIC_CHECK=ON \ -DCMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}" cmake --build "${build_dir}/examples/minimal_build" pushd "${source_dir}/examples/minimal_build" # PATH= is for Windows. PATH="${CMAKE_INSTALL_PREFIX:-${ARROW_HOME}}/bin:${PATH}" \ "${build_dir}/examples/minimal_build/arrow-example" + # Test static linking with S3 + s3_example="${build_dir}/examples/minimal_build/arrow-example-s3-static" + if [ -x "${s3_example}" ]; then + PATH="${CMAKE_INSTALL_PREFIX:-${ARROW_HOME}}/bin:${PATH}" \ + "${s3_example}" + fi popd fi diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index 2b703a3e1ca3..9d2e1d2756bf 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -1419,6 +1419,27 @@ macro(find_curl ARROW_CURL_PACKAGE_PREFIX) endif() endmacro() +# ---------------------------------------------------------------------- +# pkg-config + +# SDK libraries (on macOS) may be available without .pc files +macro(arrow_append_pc_system_library PC_PACKAGE PC_PREFIX FALLBACK) + find_package(PkgConfig QUIET) + if(PkgConfig_FOUND) + pkg_check_modules(${PC_PREFIX} + ${PC_PACKAGE} + NO_CMAKE_PATH + NO_CMAKE_ENVIRONMENT_PATH + QUIET) + endif() + if(PkgConfig_FOUND AND ${PC_PREFIX}_FOUND) + string(APPEND ARROW_PC_REQUIRES_PRIVATE " ${PC_PACKAGE}") + else() + message(STATUS "No .pc for ${PC_PACKAGE}. Using ${FALLBACK} in arrow.pc") + string(APPEND ARROW_PC_LIBS_PRIVATE " ${FALLBACK}") + endif() +endmacro() + # ---------------------------------------------------------------------- # Snappy @@ -4346,6 +4367,25 @@ if(ARROW_WITH_AZURE_SDK) resolve_dependency(Azure REQUIRED_VERSION 1.10.2) set(AZURE_SDK_LINK_LIBRARIES Azure::azure-storage-files-datalake Azure::azure-storage-blobs Azure::azure-identity) + if(AZURE_SDK_VENDORED AND NOT WIN32) + find_curl(ARROW) + find_package(LibXml2 REQUIRED) + list(APPEND ARROW_SYSTEM_DEPENDENCIES LibXml2) + endif() +endif() + +if(ARROW_BUILD_STATIC) + if((ARROW_GCS AND google_cloud_cpp_storage_SOURCE STREQUAL "BUNDLED") + OR (ARROW_AZURE + AND AZURE_SDK_VENDORED + AND NOT WIN32)) + arrow_append_pc_system_library("libcurl" ARROW_CURL_PC "-lcurl") + endif() + if(ARROW_AZURE + AND AZURE_SDK_VENDORED + AND NOT WIN32) + arrow_append_pc_system_library("libxml-2.0" ARROW_LIBXML2_PC "-lxml2") + endif() endif() # ---------------------------------------------------------------------- diff --git a/cpp/examples/minimal_build/CMakeLists.txt b/cpp/examples/minimal_build/CMakeLists.txt index d0a0a1e0a221..e1a9217401f2 100644 --- a/cpp/examples/minimal_build/CMakeLists.txt +++ b/cpp/examples/minimal_build/CMakeLists.txt @@ -49,3 +49,21 @@ if(ARROW_LINK_SHARED) else() target_link_libraries(arrow-example PRIVATE Arrow::arrow_static) endif() + +option(ARROW_EXAMPLE_S3_STATIC_CHECK "Verify S3 and static linking" OFF) +# Check only when Arrow got built with S3 by ArrowOptions.cmake via find_package +if(ARROW_EXAMPLE_S3_STATIC_CHECK + AND ARROW_S3 + AND TARGET Arrow::arrow_static) + find_package(ArrowS3 REQUIRED) + if(NOT TARGET ArrowS3::arrow_s3_static) + message(FATAL_ERROR "ArrowS3::arrow_s3_static not found") + endif() + add_executable(arrow-example-s3-static example.cc) + target_compile_definitions(arrow-example-s3-static + PRIVATE ARROW_EXAMPLE_S3_STATIC_CHECK) + target_link_libraries(arrow-example-s3-static PRIVATE ArrowS3::arrow_s3_static) +elseif(ARROW_EXAMPLE_S3_STATIC_CHECK) + message(STATUS "Skipping arrow-example-s3-static: " + "requires ARROW_S3 and Arrow::arrow_static") +endif() diff --git a/cpp/examples/minimal_build/example.cc b/cpp/examples/minimal_build/example.cc index 9bfb9953edca..f600f9429d6f 100644 --- a/cpp/examples/minimal_build/example.cc +++ b/cpp/examples/minimal_build/example.cc @@ -16,6 +16,9 @@ // under the License. #include +#ifdef ARROW_EXAMPLE_S3_STATIC_CHECK +# include +#endif #include #include #include @@ -54,6 +57,12 @@ Status RunMain(int argc, char** argv) { ARROW_RETURN_NOT_OK(batch_writer->WriteTable(*table)); ARROW_RETURN_NOT_OK(batch_writer->Close()); +#ifdef ARROW_EXAMPLE_S3_STATIC_CHECK + std::cerr << "* Verify S3 initializes and finalizes" << std::endl; + ARROW_RETURN_NOT_OK(arrow::fs::EnsureS3Initialized()); + ARROW_RETURN_NOT_OK(arrow::fs::EnsureS3Finalized()); +#endif + return Status::OK(); } diff --git a/cpp/src/arrow/CMakeLists.txt b/cpp/src/arrow/CMakeLists.txt index d2b3eac7792e..21aeabfa153c 100644 --- a/cpp/src/arrow/CMakeLists.txt +++ b/cpp/src/arrow/CMakeLists.txt @@ -36,6 +36,18 @@ set(ARROW_STATIC_INSTALL_INTERFACE_LIBS) if(ARROW_GCS) if(google_cloud_cpp_storage_SOURCE STREQUAL "SYSTEM") list(APPEND ARROW_STATIC_INSTALL_INTERFACE_LIBS google-cloud-cpp::storage) + elseif(google_cloud_cpp_storage_SOURCE STREQUAL "BUNDLED") + list(APPEND ARROW_STATIC_INSTALL_INTERFACE_LIBS CURL::libcurl) + endif() +endif() + +if(ARROW_AZURE) + if(Azure_SOURCE STREQUAL "SYSTEM") + list(APPEND ARROW_STATIC_INSTALL_INTERFACE_LIBS ${AZURE_SDK_LINK_LIBRARIES}) + elseif(Azure_SOURCE STREQUAL "BUNDLED") + if(NOT WIN32) + list(APPEND ARROW_STATIC_INSTALL_INTERFACE_LIBS CURL::libcurl LibXml2::LibXml2) + endif() endif() endif() diff --git a/dev/tasks/linux-packages/apache-arrow/apt/debian-forky/Dockerfile b/dev/tasks/linux-packages/apache-arrow/apt/debian-forky/Dockerfile index 674e16d705a8..d9246d37c917 100644 --- a/dev/tasks/linux-packages/apache-arrow/apt/debian-forky/Dockerfile +++ b/dev/tasks/linux-packages/apache-arrow/apt/debian-forky/Dockerfile @@ -68,6 +68,7 @@ RUN \ libssl-dev \ libthrift-dev \ libutf8proc-dev \ + libxml2-dev \ libxxhash-dev \ libzstd-dev \ llvm-dev \ diff --git a/dev/tasks/linux-packages/apache-arrow/apt/debian-trixie/Dockerfile b/dev/tasks/linux-packages/apache-arrow/apt/debian-trixie/Dockerfile index 2c9927684181..66548e8c2f00 100644 --- a/dev/tasks/linux-packages/apache-arrow/apt/debian-trixie/Dockerfile +++ b/dev/tasks/linux-packages/apache-arrow/apt/debian-trixie/Dockerfile @@ -68,6 +68,7 @@ RUN \ libssl-dev \ libthrift-dev \ libutf8proc-dev \ + libxml2-dev \ libxxhash-dev \ libzstd-dev \ llvm-dev \ diff --git a/dev/tasks/linux-packages/apache-arrow/apt/ubuntu-jammy/Dockerfile b/dev/tasks/linux-packages/apache-arrow/apt/ubuntu-jammy/Dockerfile index 644bc695bbd9..a5b732689bac 100644 --- a/dev/tasks/linux-packages/apache-arrow/apt/ubuntu-jammy/Dockerfile +++ b/dev/tasks/linux-packages/apache-arrow/apt/ubuntu-jammy/Dockerfile @@ -60,6 +60,7 @@ RUN \ libssl-dev \ libthrift-dev \ libutf8proc-dev \ + libxml2-dev \ libxxhash-dev \ libzstd-dev \ llvm-dev \ diff --git a/dev/tasks/linux-packages/apache-arrow/apt/ubuntu-noble/Dockerfile b/dev/tasks/linux-packages/apache-arrow/apt/ubuntu-noble/Dockerfile index 496609a8925b..7e9119d313ed 100644 --- a/dev/tasks/linux-packages/apache-arrow/apt/ubuntu-noble/Dockerfile +++ b/dev/tasks/linux-packages/apache-arrow/apt/ubuntu-noble/Dockerfile @@ -61,6 +61,7 @@ RUN \ libssl-dev \ libthrift-dev \ libutf8proc-dev \ + libxml2-dev \ libxxhash-dev \ libzstd-dev \ llvm-dev \ diff --git a/dev/tasks/linux-packages/apache-arrow/apt/ubuntu-resolute/Dockerfile b/dev/tasks/linux-packages/apache-arrow/apt/ubuntu-resolute/Dockerfile index 19f1434b7f6d..b1bc2f4dd173 100644 --- a/dev/tasks/linux-packages/apache-arrow/apt/ubuntu-resolute/Dockerfile +++ b/dev/tasks/linux-packages/apache-arrow/apt/ubuntu-resolute/Dockerfile @@ -61,6 +61,7 @@ RUN \ libssl-dev \ libthrift-dev \ libutf8proc-dev \ + libxml2-dev \ libxxhash-dev \ libzstd-dev \ llvm-dev \ diff --git a/dev/tasks/linux-packages/apache-arrow/debian/control.in b/dev/tasks/linux-packages/apache-arrow/debian/control.in index b66fe53dbaaf..2aad235b9362 100644 --- a/dev/tasks/linux-packages/apache-arrow/debian/control.in +++ b/dev/tasks/linux-packages/apache-arrow/debian/control.in @@ -26,6 +26,7 @@ Build-Depends: libssl-dev, libthrift-dev, libutf8proc-dev, + libxml2-dev, libxxhash-dev, libzstd-dev, meson, @@ -185,6 +186,7 @@ Depends: libsnappy-dev, libssl-dev, libutf8proc-dev, + libxml2-dev, libxxhash-dev, libzstd-dev, nlohmann-json-dev | nlohmann-json3-dev, diff --git a/dev/tasks/linux-packages/apache-arrow/yum/arrow.spec.in b/dev/tasks/linux-packages/apache-arrow/yum/arrow.spec.in index 5e6646f3864e..91255b8c2740 100644 --- a/dev/tasks/linux-packages/apache-arrow/yum/arrow.spec.in +++ b/dev/tasks/linux-packages/apache-arrow/yum/arrow.spec.in @@ -277,6 +277,7 @@ Requires: curl-devel %if %{use_gcs} && !%{use_bundled_nlohmann_json} Requires: json-devel %endif +Requires: libxml2-devel Requires: libzstd-devel Requires: lz4-devel %{lz4_requirement} Requires: openssl-devel