From cb903ad7282855966a357e2461cece8fd83aaebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Cumplido?= Date: Mon, 10 Nov 2025 17:52:32 +0100 Subject: [PATCH 1/4] GH-48091: [C++] Use FetchContent for bundled c-ares --- cpp/cmake_modules/ThirdpartyToolchain.cmake | 90 +++++++++++++++------ 1 file changed, 66 insertions(+), 24 deletions(-) diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index 910f256c81e4..b34ddab01874 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -2951,32 +2951,68 @@ if(ARROW_WITH_UTF8PROC) endif() macro(build_cares) - message(STATUS "Building c-ares from source") + message(STATUS "Building c-ares from source using FetchContent") + set(CARES_VENDORED TRUE) set(CARES_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/cares_ep-install") - set(CARES_INCLUDE_DIR "${CARES_PREFIX}/include") - # If you set -DCARES_SHARED=ON then the build system names the library - # libcares_static.a - set(CARES_STATIC_LIB - "${CARES_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}cares${CMAKE_STATIC_LIBRARY_SUFFIX}" - ) + # Configure c-ares options before FetchContent + set(CARES_SHARED OFF) + set(CARES_STATIC ON) + set(CARES_INSTALL ON) + set(CARES_BUILD_TOOLS OFF) + set(CARES_BUILD_TESTS OFF) - set(CARES_CMAKE_ARGS "${EP_COMMON_CMAKE_ARGS}" "-DCMAKE_INSTALL_PREFIX=${CARES_PREFIX}" - -DCARES_SHARED=OFF -DCARES_STATIC=ON) + fetchcontent_declare(cares + URL ${CARES_SOURCE_URL} + URL_HASH "SHA256=${ARROW_CARES_BUILD_SHA256_CHECKSUM}") - externalproject_add(cares_ep - ${EP_COMMON_OPTIONS} - URL ${CARES_SOURCE_URL} - URL_HASH "SHA256=${ARROW_CARES_BUILD_SHA256_CHECKSUM}" - CMAKE_ARGS ${CARES_CMAKE_ARGS} - BUILD_BYPRODUCTS "${CARES_STATIC_LIB}") + prepare_fetchcontent() - file(MAKE_DIRECTORY ${CARES_INCLUDE_DIR}) + set(CMAKE_INSTALL_PREFIX_SAVED "${CMAKE_INSTALL_PREFIX}") + set(CMAKE_INSTALL_PREFIX "${CARES_PREFIX}") + fetchcontent_makeavailable(cares) - add_library(c-ares::cares STATIC IMPORTED) - set_target_properties(c-ares::cares PROPERTIES IMPORTED_LOCATION "${CARES_STATIC_LIB}") - target_include_directories(c-ares::cares BEFORE INTERFACE "${CARES_INCLUDE_DIR}") - add_dependencies(c-ares::cares cares_ep) + # Restore original install prefix + set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX_SAVED}") + cleanup_fetchcontent() + + # gRPC requires c-ares to be installed to a known location. + # We have to do this in two steps to avoid double installation of c-ares + # when Arrow is installed. + # This custom target ensures c-ares is built before we install + add_custom_target(cares_built DEPENDS c-ares::cares) + + # Disable c-ares's install script after it's built to prevent double installation + add_custom_command(OUTPUT "${cares_BINARY_DIR}/cmake_install.cmake.saved" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${cares_BINARY_DIR}/cmake_install.cmake" + "${cares_BINARY_DIR}/cmake_install.cmake.saved" + COMMAND ${CMAKE_COMMAND} -E echo + "# c-ares install disabled to prevent double installation with Arrow" + > "${cares_BINARY_DIR}/cmake_install.cmake" + DEPENDS cares_built + COMMENT "Disabling c-ares install to prevent double installation" + VERBATIM) + + add_custom_target(cares_install_disabled ALL + DEPENDS "${cares_BINARY_DIR}/cmake_install.cmake.saved") + + # Install c-ares to CARES_PREFIX for gRPC to find + add_custom_command(OUTPUT "${CARES_PREFIX}/.cares_installed" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${cares_BINARY_DIR}/cmake_install.cmake.saved" + "${cares_BINARY_DIR}/cmake_install.cmake.tmp" + COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${CARES_PREFIX} + -DCMAKE_INSTALL_CONFIG_NAME=$ -P + "${cares_BINARY_DIR}/cmake_install.cmake.tmp" || + ${CMAKE_COMMAND} -E true + COMMAND ${CMAKE_COMMAND} -E touch "${CARES_PREFIX}/.cares_installed" + DEPENDS cares_install_disabled + COMMENT "Installing c-ares to ${CARES_PREFIX} for gRPC" + VERBATIM) + + # Make cares_ep depend on the install completion marker + add_custom_target(cares_ep DEPENDS "${CARES_PREFIX}/.cares_installed") if(APPLE) # libresolv must be linked from c-ares version 1.16.1 @@ -2985,8 +3021,6 @@ macro(build_cares) "${LIBRESOLV_LIBRARY}") endif() - set(CARES_VENDORED TRUE) - list(APPEND ARROW_BUNDLED_STATIC_LIBS c-ares::cares) endmacro() @@ -3208,8 +3242,16 @@ macro(build_grpc) get_filename_component(GRPC_PB_ROOT "${GRPC_PROTOBUF_INCLUDE_DIR}" DIRECTORY) get_target_property(GRPC_Protobuf_PROTOC_LIBRARY ${ARROW_PROTOBUF_LIBPROTOC} IMPORTED_LOCATION) - get_target_property(GRPC_CARES_INCLUDE_DIR c-ares::cares INTERFACE_INCLUDE_DIRECTORIES) - get_filename_component(GRPC_CARES_ROOT "${GRPC_CARES_INCLUDE_DIR}" DIRECTORY) + + # For FetchContent c-ares, use the install prefix directly + if(CARES_VENDORED) + set(GRPC_CARES_ROOT "${CARES_PREFIX}") + else() + get_target_property(GRPC_CARES_INCLUDE_DIR c-ares::cares + INTERFACE_INCLUDE_DIRECTORIES) + get_filename_component(GRPC_CARES_ROOT "${GRPC_CARES_INCLUDE_DIR}" DIRECTORY) + endif() + get_target_property(GRPC_RE2_INCLUDE_DIR re2::re2 INTERFACE_INCLUDE_DIRECTORIES) get_filename_component(GRPC_RE2_ROOT "${GRPC_RE2_INCLUDE_DIR}" DIRECTORY) From 91f6b54c0888ac50ec2cff08313073586365adbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Cumplido?= Date: Mon, 17 Nov 2025 11:39:39 +0100 Subject: [PATCH 2/4] Move from macro build_cares to function --- cpp/cmake_modules/ThirdpartyToolchain.cmake | 40 ++++++++++----------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index b34ddab01874..622412823b7b 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -2950,17 +2950,16 @@ if(ARROW_WITH_UTF8PROC) resolve_dependency(${utf8proc_resolve_dependency_args}) endif() -macro(build_cares) +function(build_cares) + list(APPEND CMAKE_MESSAGE_INDENT "c-ares: ") message(STATUS "Building c-ares from source using FetchContent") - set(CARES_VENDORED TRUE) - set(CARES_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/cares_ep-install") - - # Configure c-ares options before FetchContent - set(CARES_SHARED OFF) - set(CARES_STATIC ON) - set(CARES_INSTALL ON) - set(CARES_BUILD_TOOLS OFF) - set(CARES_BUILD_TESTS OFF) + set(CARES_VENDORED + TRUE + PARENT_SCOPE) + set(CARES_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/cares_fc-install") + set(CARES_PREFIX + "${CARES_PREFIX}" + PARENT_SCOPE) fetchcontent_declare(cares URL ${CARES_SOURCE_URL} @@ -2968,14 +2967,13 @@ macro(build_cares) prepare_fetchcontent() - set(CMAKE_INSTALL_PREFIX_SAVED "${CMAKE_INSTALL_PREFIX}") - set(CMAKE_INSTALL_PREFIX "${CARES_PREFIX}") + set(CARES_SHARED OFF) + set(CARES_STATIC ON) + set(CARES_INSTALL ON) + set(CARES_BUILD_TOOLS OFF) + set(CARES_BUILD_TESTS OFF) fetchcontent_makeavailable(cares) - # Restore original install prefix - set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX_SAVED}") - cleanup_fetchcontent() - # gRPC requires c-ares to be installed to a known location. # We have to do this in two steps to avoid double installation of c-ares # when Arrow is installed. @@ -3011,8 +3009,8 @@ macro(build_cares) COMMENT "Installing c-ares to ${CARES_PREFIX} for gRPC" VERBATIM) - # Make cares_ep depend on the install completion marker - add_custom_target(cares_ep DEPENDS "${CARES_PREFIX}/.cares_installed") + # Make cares_fc depend on the install completion marker + add_custom_target(cares_fc DEPENDS "${CARES_PREFIX}/.cares_installed") if(APPLE) # libresolv must be linked from c-ares version 1.16.1 @@ -3021,8 +3019,8 @@ macro(build_cares) "${LIBRESOLV_LIBRARY}") endif() - list(APPEND ARROW_BUNDLED_STATIC_LIBS c-ares::cares) -endmacro() + list(POP_BACK CMAKE_MESSAGE_INDENT) +endfunction() # ---------------------------------------------------------------------- # Dependencies for Arrow Flight RPC @@ -3223,7 +3221,7 @@ macro(build_grpc) add_dependencies(grpc_dependencies absl_fc) endif() if(CARES_VENDORED) - add_dependencies(grpc_dependencies cares_ep) + add_dependencies(grpc_dependencies cares_fc) endif() if(GFLAGS_VENDORED) From 36e457b9d1f890cd985b86bc2f834d030d96db08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Cumplido?= Date: Tue, 18 Nov 2025 15:40:07 +0100 Subject: [PATCH 3/4] Keep c-ares as part of ARROW_BUNDLED_STATIC_LIBS --- cpp/cmake_modules/ThirdpartyToolchain.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index 622412823b7b..8f60ee0d100f 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -3019,6 +3019,9 @@ function(build_cares) "${LIBRESOLV_LIBRARY}") endif() + set(ARROW_BUNDLED_STATIC_LIBS + ${ARROW_BUNDLED_STATIC_LIBS} c-ares::cares + PARENT_SCOPE) list(POP_BACK CMAKE_MESSAGE_INDENT) endfunction() From 0b0a3d162a197f2a28a0adfb262da2c44fe0bdfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Cumplido?= Date: Tue, 18 Nov 2025 15:54:26 +0100 Subject: [PATCH 4/4] Fix for target on Abseil Alias on macOS bundled build --- cpp/cmake_modules/ThirdpartyToolchain.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index 8f60ee0d100f..835baec87ba6 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -3171,7 +3171,9 @@ function(build_absl) # This is due to upstream absl::cctz issue # https://github.com/abseil/abseil-cpp/issues/283 find_library(CoreFoundation CoreFoundation) - set_property(TARGET absl::time + # When ABSL_ENABLE_INSTALL is ON, the real target is "time" not "absl_time" + # Cannot use set_property on alias targets (absl::time is an alias) + set_property(TARGET time APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${CoreFoundation}) endif()