Skip to content

Commit 7e7f084

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

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
@@ -2962,32 +2962,68 @@ if(ARROW_WITH_UTF8PROC)
29622962
endif()
29632963

29642964
macro(build_cares)
2965-
message(STATUS "Building c-ares from source")
2965+
message(STATUS "Building c-ares from source using FetchContent")
2966+
set(CARES_VENDORED TRUE)
29662967
set(CARES_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/cares_ep-install")
2967-
set(CARES_INCLUDE_DIR "${CARES_PREFIX}/include")
29682968

2969-
# If you set -DCARES_SHARED=ON then the build system names the library
2970-
# libcares_static.a
2971-
set(CARES_STATIC_LIB
2972-
"${CARES_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}cares${CMAKE_STATIC_LIBRARY_SUFFIX}"
2973-
)
2969+
# Configure c-ares options before FetchContent
2970+
set(CARES_SHARED OFF)
2971+
set(CARES_STATIC ON)
2972+
set(CARES_INSTALL ON)
2973+
set(CARES_BUILD_TOOLS OFF)
2974+
set(CARES_BUILD_TESTS OFF)
29742975

2975-
set(CARES_CMAKE_ARGS "${EP_COMMON_CMAKE_ARGS}" "-DCMAKE_INSTALL_PREFIX=${CARES_PREFIX}"
2976-
-DCARES_SHARED=OFF -DCARES_STATIC=ON)
2976+
fetchcontent_declare(cares
2977+
URL ${CARES_SOURCE_URL}
2978+
URL_HASH "SHA256=${ARROW_CARES_BUILD_SHA256_CHECKSUM}")
29772979

2978-
externalproject_add(cares_ep
2979-
${EP_COMMON_OPTIONS}
2980-
URL ${CARES_SOURCE_URL}
2981-
URL_HASH "SHA256=${ARROW_CARES_BUILD_SHA256_CHECKSUM}"
2982-
CMAKE_ARGS ${CARES_CMAKE_ARGS}
2983-
BUILD_BYPRODUCTS "${CARES_STATIC_LIB}")
2980+
prepare_fetchcontent()
29842981

2985-
file(MAKE_DIRECTORY ${CARES_INCLUDE_DIR})
2982+
set(CMAKE_INSTALL_PREFIX_SAVED "${CMAKE_INSTALL_PREFIX}")
2983+
set(CMAKE_INSTALL_PREFIX "${CARES_PREFIX}")
2984+
fetchcontent_makeavailable(cares)
2985+
2986+
# Restore original install prefix
2987+
set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX_SAVED}")
2988+
cleanup_fetchcontent()
2989+
2990+
# gRPC requires c-ares to be installed to a known location.
2991+
# We have to do this in two steps to avoid double installation of c-ares
2992+
# when Arrow is installed.
2993+
# This custom target ensures c-ares is built before we install
2994+
add_custom_target(cares_built DEPENDS c-ares::cares)
2995+
2996+
# Disable c-ares's install script after it's built to prevent double installation
2997+
add_custom_command(OUTPUT "${cares_BINARY_DIR}/cmake_install.cmake.saved"
2998+
COMMAND ${CMAKE_COMMAND} -E copy_if_different
2999+
"${cares_BINARY_DIR}/cmake_install.cmake"
3000+
"${cares_BINARY_DIR}/cmake_install.cmake.saved"
3001+
COMMAND ${CMAKE_COMMAND} -E echo
3002+
"# c-ares install disabled to prevent double installation with Arrow"
3003+
> "${cares_BINARY_DIR}/cmake_install.cmake"
3004+
DEPENDS cares_built
3005+
COMMENT "Disabling c-ares install to prevent double installation"
3006+
VERBATIM)
29863007

2987-
add_library(c-ares::cares STATIC IMPORTED)
2988-
set_target_properties(c-ares::cares PROPERTIES IMPORTED_LOCATION "${CARES_STATIC_LIB}")
2989-
target_include_directories(c-ares::cares BEFORE INTERFACE "${CARES_INCLUDE_DIR}")
2990-
add_dependencies(c-ares::cares cares_ep)
3008+
add_custom_target(cares_install_disabled ALL
3009+
DEPENDS "${cares_BINARY_DIR}/cmake_install.cmake.saved")
3010+
3011+
# Install c-ares to CARES_PREFIX for gRPC to find
3012+
add_custom_command(OUTPUT "${CARES_PREFIX}/.cares_installed"
3013+
COMMAND ${CMAKE_COMMAND} -E copy_if_different
3014+
"${cares_BINARY_DIR}/cmake_install.cmake.saved"
3015+
"${cares_BINARY_DIR}/cmake_install.cmake.tmp"
3016+
COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${CARES_PREFIX}
3017+
-DCMAKE_INSTALL_CONFIG_NAME=$<CONFIG> -P
3018+
"${cares_BINARY_DIR}/cmake_install.cmake.tmp" ||
3019+
${CMAKE_COMMAND} -E true
3020+
COMMAND ${CMAKE_COMMAND} -E touch "${CARES_PREFIX}/.cares_installed"
3021+
DEPENDS cares_install_disabled
3022+
COMMENT "Installing c-ares to ${CARES_PREFIX} for gRPC"
3023+
VERBATIM)
3024+
3025+
# Make cares_ep depend on the install completion marker
3026+
add_custom_target(cares_ep DEPENDS "${CARES_PREFIX}/.cares_installed")
29913027

29923028
if(APPLE)
29933029
# libresolv must be linked from c-ares version 1.16.1
@@ -2996,8 +3032,6 @@ macro(build_cares)
29963032
"${LIBRESOLV_LIBRARY}")
29973033
endif()
29983034

2999-
set(CARES_VENDORED TRUE)
3000-
30013035
list(APPEND ARROW_BUNDLED_STATIC_LIBS c-ares::cares)
30023036
endmacro()
30033037

@@ -3221,8 +3255,16 @@ macro(build_grpc)
32213255
get_filename_component(GRPC_PB_ROOT "${GRPC_PROTOBUF_INCLUDE_DIR}" DIRECTORY)
32223256
get_target_property(GRPC_Protobuf_PROTOC_LIBRARY ${ARROW_PROTOBUF_LIBPROTOC}
32233257
IMPORTED_LOCATION)
3224-
get_target_property(GRPC_CARES_INCLUDE_DIR c-ares::cares INTERFACE_INCLUDE_DIRECTORIES)
3225-
get_filename_component(GRPC_CARES_ROOT "${GRPC_CARES_INCLUDE_DIR}" DIRECTORY)
3258+
3259+
# For FetchContent c-ares, use the install prefix directly
3260+
if(CARES_VENDORED)
3261+
set(GRPC_CARES_ROOT "${CARES_PREFIX}")
3262+
else()
3263+
get_target_property(GRPC_CARES_INCLUDE_DIR c-ares::cares
3264+
INTERFACE_INCLUDE_DIRECTORIES)
3265+
get_filename_component(GRPC_CARES_ROOT "${GRPC_CARES_INCLUDE_DIR}" DIRECTORY)
3266+
endif()
3267+
32263268
get_target_property(GRPC_RE2_INCLUDE_DIR re2::re2 INTERFACE_INCLUDE_DIRECTORIES)
32273269
get_filename_component(GRPC_RE2_ROOT "${GRPC_RE2_INCLUDE_DIR}" DIRECTORY)
32283270

0 commit comments

Comments
 (0)