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