Skip to content

Commit cb903ad

Browse files
committed
GH-48091: [C++] Use FetchContent for bundled c-ares
1 parent 7c3d486 commit cb903ad

File tree

1 file changed

+66
-24
lines changed

1 file changed

+66
-24
lines changed

cpp/cmake_modules/ThirdpartyToolchain.cmake

Lines changed: 66 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2951,32 +2951,68 @@ if(ARROW_WITH_UTF8PROC)
29512951
endif()
29522952

29532953
macro(build_cares)
2954-
message(STATUS "Building c-ares from source")
2954+
message(STATUS "Building c-ares from source using FetchContent")
2955+
set(CARES_VENDORED TRUE)
29552956
set(CARES_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/cares_ep-install")
2956-
set(CARES_INCLUDE_DIR "${CARES_PREFIX}/include")
29572957

2958-
# If you set -DCARES_SHARED=ON then the build system names the library
2959-
# libcares_static.a
2960-
set(CARES_STATIC_LIB
2961-
"${CARES_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}cares${CMAKE_STATIC_LIBRARY_SUFFIX}"
2962-
)
2958+
# Configure c-ares options before FetchContent
2959+
set(CARES_SHARED OFF)
2960+
set(CARES_STATIC ON)
2961+
set(CARES_INSTALL ON)
2962+
set(CARES_BUILD_TOOLS OFF)
2963+
set(CARES_BUILD_TESTS OFF)
29632964

2964-
set(CARES_CMAKE_ARGS "${EP_COMMON_CMAKE_ARGS}" "-DCMAKE_INSTALL_PREFIX=${CARES_PREFIX}"
2965-
-DCARES_SHARED=OFF -DCARES_STATIC=ON)
2965+
fetchcontent_declare(cares
2966+
URL ${CARES_SOURCE_URL}
2967+
URL_HASH "SHA256=${ARROW_CARES_BUILD_SHA256_CHECKSUM}")
29662968

2967-
externalproject_add(cares_ep
2968-
${EP_COMMON_OPTIONS}
2969-
URL ${CARES_SOURCE_URL}
2970-
URL_HASH "SHA256=${ARROW_CARES_BUILD_SHA256_CHECKSUM}"
2971-
CMAKE_ARGS ${CARES_CMAKE_ARGS}
2972-
BUILD_BYPRODUCTS "${CARES_STATIC_LIB}")
2969+
prepare_fetchcontent()
29732970

2974-
file(MAKE_DIRECTORY ${CARES_INCLUDE_DIR})
2971+
set(CMAKE_INSTALL_PREFIX_SAVED "${CMAKE_INSTALL_PREFIX}")
2972+
set(CMAKE_INSTALL_PREFIX "${CARES_PREFIX}")
2973+
fetchcontent_makeavailable(cares)
29752974

2976-
add_library(c-ares::cares STATIC IMPORTED)
2977-
set_target_properties(c-ares::cares PROPERTIES IMPORTED_LOCATION "${CARES_STATIC_LIB}")
2978-
target_include_directories(c-ares::cares BEFORE INTERFACE "${CARES_INCLUDE_DIR}")
2979-
add_dependencies(c-ares::cares cares_ep)
2975+
# Restore original install prefix
2976+
set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX_SAVED}")
2977+
cleanup_fetchcontent()
2978+
2979+
# gRPC requires c-ares to be installed to a known location.
2980+
# We have to do this in two steps to avoid double installation of c-ares
2981+
# when Arrow is installed.
2982+
# This custom target ensures c-ares is built before we install
2983+
add_custom_target(cares_built DEPENDS c-ares::cares)
2984+
2985+
# Disable c-ares's install script after it's built to prevent double installation
2986+
add_custom_command(OUTPUT "${cares_BINARY_DIR}/cmake_install.cmake.saved"
2987+
COMMAND ${CMAKE_COMMAND} -E copy_if_different
2988+
"${cares_BINARY_DIR}/cmake_install.cmake"
2989+
"${cares_BINARY_DIR}/cmake_install.cmake.saved"
2990+
COMMAND ${CMAKE_COMMAND} -E echo
2991+
"# c-ares install disabled to prevent double installation with Arrow"
2992+
> "${cares_BINARY_DIR}/cmake_install.cmake"
2993+
DEPENDS cares_built
2994+
COMMENT "Disabling c-ares install to prevent double installation"
2995+
VERBATIM)
2996+
2997+
add_custom_target(cares_install_disabled ALL
2998+
DEPENDS "${cares_BINARY_DIR}/cmake_install.cmake.saved")
2999+
3000+
# Install c-ares to CARES_PREFIX for gRPC to find
3001+
add_custom_command(OUTPUT "${CARES_PREFIX}/.cares_installed"
3002+
COMMAND ${CMAKE_COMMAND} -E copy_if_different
3003+
"${cares_BINARY_DIR}/cmake_install.cmake.saved"
3004+
"${cares_BINARY_DIR}/cmake_install.cmake.tmp"
3005+
COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${CARES_PREFIX}
3006+
-DCMAKE_INSTALL_CONFIG_NAME=$<CONFIG> -P
3007+
"${cares_BINARY_DIR}/cmake_install.cmake.tmp" ||
3008+
${CMAKE_COMMAND} -E true
3009+
COMMAND ${CMAKE_COMMAND} -E touch "${CARES_PREFIX}/.cares_installed"
3010+
DEPENDS cares_install_disabled
3011+
COMMENT "Installing c-ares to ${CARES_PREFIX} for gRPC"
3012+
VERBATIM)
3013+
3014+
# Make cares_ep depend on the install completion marker
3015+
add_custom_target(cares_ep DEPENDS "${CARES_PREFIX}/.cares_installed")
29803016

29813017
if(APPLE)
29823018
# libresolv must be linked from c-ares version 1.16.1
@@ -2985,8 +3021,6 @@ macro(build_cares)
29853021
"${LIBRESOLV_LIBRARY}")
29863022
endif()
29873023

2988-
set(CARES_VENDORED TRUE)
2989-
29903024
list(APPEND ARROW_BUNDLED_STATIC_LIBS c-ares::cares)
29913025
endmacro()
29923026

@@ -3208,8 +3242,16 @@ macro(build_grpc)
32083242
get_filename_component(GRPC_PB_ROOT "${GRPC_PROTOBUF_INCLUDE_DIR}" DIRECTORY)
32093243
get_target_property(GRPC_Protobuf_PROTOC_LIBRARY ${ARROW_PROTOBUF_LIBPROTOC}
32103244
IMPORTED_LOCATION)
3211-
get_target_property(GRPC_CARES_INCLUDE_DIR c-ares::cares INTERFACE_INCLUDE_DIRECTORIES)
3212-
get_filename_component(GRPC_CARES_ROOT "${GRPC_CARES_INCLUDE_DIR}" DIRECTORY)
3245+
3246+
# For FetchContent c-ares, use the install prefix directly
3247+
if(CARES_VENDORED)
3248+
set(GRPC_CARES_ROOT "${CARES_PREFIX}")
3249+
else()
3250+
get_target_property(GRPC_CARES_INCLUDE_DIR c-ares::cares
3251+
INTERFACE_INCLUDE_DIRECTORIES)
3252+
get_filename_component(GRPC_CARES_ROOT "${GRPC_CARES_INCLUDE_DIR}" DIRECTORY)
3253+
endif()
3254+
32133255
get_target_property(GRPC_RE2_INCLUDE_DIR re2::re2 INTERFACE_INCLUDE_DIRECTORIES)
32143256
get_filename_component(GRPC_RE2_ROOT "${GRPC_RE2_INCLUDE_DIR}" DIRECTORY)
32153257

0 commit comments

Comments
 (0)