diff --git a/ci/scripts/PKGBUILD b/ci/scripts/PKGBUILD index 38f28a23282..b9b0194f5c8 100644 --- a/ci/scripts/PKGBUILD +++ b/ci/scripts/PKGBUILD @@ -111,6 +111,7 @@ build() { -DARROW_S3="${ARROW_S3}" \ -DARROW_SNAPPY_USE_SHARED=OFF \ -DARROW_USE_GLOG=OFF \ + -DARROW_UTF8PROC_USE_SHARED=OFF \ -DARROW_WITH_LZ4=ON \ -DARROW_WITH_RE2="${ARROW_WITH_RE2}" \ -DARROW_WITH_SNAPPY=ON \ diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index ec12feab3d2..23e0ba311f3 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -691,11 +691,20 @@ endif() # Linker and Dependencies # -# Libraries to link statically with libarrow.so -set(ARROW_LINK_LIBS) -set(ARROW_STATIC_LINK_LIBS) +# Libraries to link statically with libarrow.so. +# +# Note that arrow::hadoop is a header only target that refers +# cpp/thirdparty/hadoop/include/. See +# cpp/cmake_modules/ThirdpartyToolchain.cmake for details. +set(ARROW_LINK_LIBS arrow::flatbuffers arrow::hadoop) +set(ARROW_STATIC_LINK_LIBS arrow::flatbuffers arrow::hadoop) set(ARROW_STATIC_INSTALL_INTERFACE_LIBS) +if(ARROW_USE_BOOST) + list(APPEND ARROW_LINK_LIBS Boost::headers) + list(APPEND ARROW_STATIC_LINK_LIBS Boost::headers) +endif() + if(ARROW_USE_OPENSSL) set(ARROW_OPENSSL_LIBS OpenSSL::Crypto OpenSSL::SSL) list(APPEND ARROW_LINK_LIBS ${ARROW_OPENSSL_LIBS}) @@ -808,6 +817,16 @@ if(ARROW_WITH_RE2) endif() endif() +if(ARROW_WITH_RAPIDJSON) + list(APPEND ARROW_LINK_LIBS rapidjson::rapidjson) + list(APPEND ARROW_STATIC_LINK_LIBS rapidjson::rapidjson) +endif() + +if(ARROW_USE_XSIMD) + list(APPEND ARROW_LINK_LIBS xsimd) + list(APPEND ARROW_STATIC_LINK_LIBS xsimd) +endif() + add_custom_target(arrow_dependencies) add_custom_target(arrow_benchmark_dependencies) add_custom_target(arrow_test_dependencies) @@ -830,26 +849,18 @@ endif() set(ARROW_SHARED_PRIVATE_LINK_LIBS ${ARROW_STATIC_LINK_LIBS}) -# boost::filesystem is needed for S3 and Flight tests as a boost::process dependency. -if(((ARROW_FLIGHT - OR ARROW_S3 - OR ARROW_GCS) - AND (ARROW_BUILD_TESTS OR ARROW_BUILD_INTEGRATION) - )) - list(APPEND ARROW_TEST_LINK_LIBS ${BOOST_FILESYSTEM_LIBRARY} ${BOOST_SYSTEM_LIBRARY}) -endif() - if(NOT MSVC_TOOLCHAIN) list(APPEND ARROW_LINK_LIBS ${CMAKE_DL_LIBS}) list(APPEND ARROW_SHARED_INSTALL_INTERFACE_LIBS ${CMAKE_DL_LIBS}) endif() set(ARROW_TEST_LINK_TOOLCHAIN + arrow::flatbuffers GTest::gtest_main GTest::gtest GTest::gmock - ${BOOST_FILESYSTEM_LIBRARY} - ${BOOST_SYSTEM_LIBRARY}) + Boost::filesystem + Boost::system) if(ARROW_BUILD_TESTS) add_dependencies(arrow_test_dependencies ${ARROW_TEST_LINK_TOOLCHAIN}) diff --git a/cpp/cmake_modules/BuildUtils.cmake b/cpp/cmake_modules/BuildUtils.cmake index 174b1c515a7..f3e3269d4fe 100644 --- a/cpp/cmake_modules/BuildUtils.cmake +++ b/cpp/cmake_modules/BuildUtils.cmake @@ -30,25 +30,9 @@ set(ARROW_LIBRARY_PATH_SUFFIXES "Library/bin") set(ARROW_INCLUDE_PATH_SUFFIXES "include" "Library" "Library/include") -set(ARROW_BOOST_PROCESS_COMPILE_DEFINITIONS) -if(WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - # boost/process/detail/windows/handle_workaround.hpp doesn't work - # without BOOST_USE_WINDOWS_H with MinGW because MinGW doesn't - # provide __kernel_entry without winternl.h. - # - # See also: - # https://github.com/boostorg/process/blob/develop/include/boost/process/detail/windows/handle_workaround.hpp - # - # You can use this like the following: - # - # target_compile_definitions(target PRIVATE - # ${ARROW_BOOST_PROCESS_COMPILE_DEFINITIONS}) - list(APPEND ARROW_BOOST_PROCESS_COMPILE_DEFINITIONS "BOOST_USE_WINDOWS_H=1") -endif() - -function(ADD_THIRDPARTY_LIB LIB_NAME) +function(add_thirdparty_lib LIB_NAME LIB_TYPE LIB) set(options) - set(one_value_args SHARED_LIB STATIC_LIB) + set(one_value_args) set(multi_value_args DEPS INCLUDE_DIRECTORIES) cmake_parse_arguments(ARG "${options}" @@ -59,78 +43,25 @@ function(ADD_THIRDPARTY_LIB LIB_NAME) message(SEND_ERROR "Error: unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}") endif() - if(ARG_STATIC_LIB AND ARG_SHARED_LIB) - set(AUG_LIB_NAME "${LIB_NAME}_static") - add_library(${AUG_LIB_NAME} STATIC IMPORTED) - set_target_properties(${AUG_LIB_NAME} PROPERTIES IMPORTED_LOCATION - "${ARG_STATIC_LIB}") - if(ARG_DEPS) - set_target_properties(${AUG_LIB_NAME} PROPERTIES INTERFACE_LINK_LIBRARIES - "${ARG_DEPS}") - endif() - message(STATUS "Added static library dependency ${AUG_LIB_NAME}: ${ARG_STATIC_LIB}") - if(ARG_INCLUDE_DIRECTORIES) - set_target_properties(${AUG_LIB_NAME} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "${ARG_INCLUDE_DIRECTORIES}") - endif() - - set(AUG_LIB_NAME "${LIB_NAME}_shared") - add_library(${AUG_LIB_NAME} SHARED IMPORTED) - - if(WIN32) - # Mark the ".lib" location as part of a Windows DLL - set_target_properties(${AUG_LIB_NAME} PROPERTIES IMPORTED_IMPLIB - "${ARG_SHARED_LIB}") - else() - set_target_properties(${AUG_LIB_NAME} PROPERTIES IMPORTED_LOCATION - "${ARG_SHARED_LIB}") - endif() - if(ARG_DEPS) - set_target_properties(${AUG_LIB_NAME} PROPERTIES INTERFACE_LINK_LIBRARIES - "${ARG_DEPS}") - endif() - message(STATUS "Added shared library dependency ${AUG_LIB_NAME}: ${ARG_SHARED_LIB}") - if(ARG_INCLUDE_DIRECTORIES) - set_target_properties(${AUG_LIB_NAME} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "${ARG_INCLUDE_DIRECTORIES}") - endif() - elseif(ARG_STATIC_LIB) - set(AUG_LIB_NAME "${LIB_NAME}_static") - add_library(${AUG_LIB_NAME} STATIC IMPORTED) - set_target_properties(${AUG_LIB_NAME} PROPERTIES IMPORTED_LOCATION - "${ARG_STATIC_LIB}") - if(ARG_DEPS) - set_target_properties(${AUG_LIB_NAME} PROPERTIES INTERFACE_LINK_LIBRARIES - "${ARG_DEPS}") - endif() - message(STATUS "Added static library dependency ${AUG_LIB_NAME}: ${ARG_STATIC_LIB}") - if(ARG_INCLUDE_DIRECTORIES) - set_target_properties(${AUG_LIB_NAME} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "${ARG_INCLUDE_DIRECTORIES}") - endif() - elseif(ARG_SHARED_LIB) - set(AUG_LIB_NAME "${LIB_NAME}_shared") - add_library(${AUG_LIB_NAME} SHARED IMPORTED) - + add_library(${LIB_NAME} ${LIB_TYPE} IMPORTED) + if(${LIB_TYPE} STREQUAL "STATIC") + set_target_properties(${LIB_NAME} PROPERTIES IMPORTED_LOCATION "${LIB}") + message(STATUS "Added static library dependency ${LIB_NAME}: ${LIB}") + else() if(WIN32) # Mark the ".lib" location as part of a Windows DLL - set_target_properties(${AUG_LIB_NAME} PROPERTIES IMPORTED_IMPLIB - "${ARG_SHARED_LIB}") + set_target_properties(${LIB_NAME} PROPERTIES IMPORTED_IMPLIB "${LIB}") else() - set_target_properties(${AUG_LIB_NAME} PROPERTIES IMPORTED_LOCATION - "${ARG_SHARED_LIB}") - endif() - message(STATUS "Added shared library dependency ${AUG_LIB_NAME}: ${ARG_SHARED_LIB}") - if(ARG_DEPS) - set_target_properties(${AUG_LIB_NAME} PROPERTIES INTERFACE_LINK_LIBRARIES - "${ARG_DEPS}") - endif() - if(ARG_INCLUDE_DIRECTORIES) - set_target_properties(${AUG_LIB_NAME} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "${ARG_INCLUDE_DIRECTORIES}") + set_target_properties(${LIB_NAME} PROPERTIES IMPORTED_LOCATION "${LIB}") endif() - else() - message(FATAL_ERROR "No static or shared library provided for ${LIB_NAME}") + message(STATUS "Added shared library dependency ${LIB_NAME}: ${LIB}") + endif() + if(ARG_DEPS) + set_target_properties(${LIB_NAME} PROPERTIES INTERFACE_LINK_LIBRARIES "${ARG_DEPS}") + endif() + if(ARG_INCLUDE_DIRECTORIES) + set_target_properties(${LIB_NAME} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${ARG_INCLUDE_DIRECTORIES}") endif() endfunction() @@ -271,11 +202,16 @@ function(ADD_ARROW_LIB LIB_NAME) set(OUTPUT_PATH ${BUILD_OUTPUT_ROOT_DIRECTORY}) endif() - if(WIN32 OR (CMAKE_GENERATOR STREQUAL Xcode)) + if(WIN32 + OR (CMAKE_GENERATOR STREQUAL Xcode) + OR CMAKE_VERSION VERSION_LESS 3.12) # We need to compile C++ separately for each library kind (shared and static) # because of dllexport declarations on Windows. # The Xcode generator doesn't reliably work with Xcode as target names are not # guessed correctly. + # We can't use target for object library with CMake 3.11 or earlier. + # See also: Object Libraries: + # https://cmake.org/cmake/help/latest/command/add_library.html#object-libraries set(USE_OBJLIB OFF) else() set(USE_OBJLIB ON) @@ -310,6 +246,9 @@ function(ADD_ARROW_LIB LIB_NAME) if(ARG_PRIVATE_INCLUDES) target_include_directories(${LIB_NAME}_objlib PRIVATE ${ARG_PRIVATE_INCLUDES}) endif() + target_link_libraries(${LIB_NAME}_objlib + PRIVATE ${ARG_SHARED_LINK_LIBS} ${ARG_SHARED_PRIVATE_LINK_LIBS} + ${ARG_STATIC_LINK_LIBS}) else() # Prepare arguments for separate compilation of static and shared libs below # TODO: add PCH directives diff --git a/cpp/cmake_modules/DefineOptions.cmake b/cpp/cmake_modules/DefineOptions.cmake index ab7d2edf567..f3d94353abc 100644 --- a/cpp/cmake_modules/DefineOptions.cmake +++ b/cpp/cmake_modules/DefineOptions.cmake @@ -352,6 +352,9 @@ if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") "Rely on Protocol Buffers shared libraries where relevant" ${ARROW_DEPENDENCY_USE_SHARED}) + define_option(ARROW_SNAPPY_USE_SHARED "Rely on snappy shared libraries where relevant" + ${ARROW_DEPENDENCY_USE_SHARED}) + if(WIN32) # It seems that Thrift doesn't support DLL well yet. # MSYS2, conda-forge and vcpkg don't build shared library. @@ -366,13 +369,6 @@ if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") "Rely on utf8proc shared libraries where relevant" ${ARROW_DEPENDENCY_USE_SHARED}) - define_option(ARROW_SNAPPY_USE_SHARED "Rely on snappy shared libraries where relevant" - ${ARROW_DEPENDENCY_USE_SHARED}) - - define_option(ARROW_UTF8PROC_USE_SHARED - "Rely on utf8proc shared libraries where relevant" - ${ARROW_DEPENDENCY_USE_SHARED}) - define_option(ARROW_ZSTD_USE_SHARED "Rely on zstd shared libraries where relevant" ${ARROW_DEPENDENCY_USE_SHARED}) diff --git a/cpp/cmake_modules/FindBoostAlt.cmake b/cpp/cmake_modules/FindBoostAlt.cmake deleted file mode 100644 index 072e267c1fb..00000000000 --- a/cpp/cmake_modules/FindBoostAlt.cmake +++ /dev/null @@ -1,63 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -if(DEFINED ENV{BOOST_ROOT} OR DEFINED BOOST_ROOT) - # In older versions of CMake (such as 3.2), the system paths for Boost will - # be looked in first even if we set $BOOST_ROOT or pass -DBOOST_ROOT - set(Boost_NO_SYSTEM_PATHS ON) -endif() - -set(BoostAlt_FIND_PACKAGE_OPTIONS) -if(BoostAlt_FIND_VERSION) - list(APPEND BoostAlt_FIND_PACKAGE_OPTIONS ${BoostAlt_FIND_VERSION}) -endif() -if(BoostAlt_FIND_REQUIRED) - list(APPEND BoostAlt_FIND_PACKAGE_OPTIONS REQUIRED) -endif() -if(BoostAlt_FIND_QUIETLY) - list(APPEND BoostAlt_FIND_PACKAGE_OPTIONS QUIET) -endif() - -if(ARROW_BOOST_USE_SHARED) - # Find shared Boost libraries. - set(Boost_USE_STATIC_LIBS OFF) - set(BUILD_SHARED_LIBS_KEEP ${BUILD_SHARED_LIBS}) - set(BUILD_SHARED_LIBS ON) - - find_package(Boost ${BoostAlt_FIND_PACKAGE_OPTIONS} COMPONENTS system filesystem) - set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_KEEP}) - unset(BUILD_SHARED_LIBS_KEEP) -else() - # Find static boost headers and libs - # TODO Differentiate here between release and debug builds - set(Boost_USE_STATIC_LIBS ON) - find_package(Boost ${BoostAlt_FIND_PACKAGE_OPTIONS} COMPONENTS system filesystem) -endif() - -if(Boost_FOUND) - set(BoostAlt_FOUND ON) - if(MSVC_TOOLCHAIN) - # disable autolinking in boost - add_definitions(-DBOOST_ALL_NO_LIB) - if(ARROW_BOOST_USE_SHARED) - # force all boost libraries to dynamic link - add_definitions(-DBOOST_ALL_DYN_LINK) - endif() - endif() -else() - set(BoostAlt_FOUND OFF) -endif() diff --git a/cpp/cmake_modules/Findutf8proc.cmake b/cpp/cmake_modules/Findutf8proc.cmake index 4d732f18694..867361cd104 100644 --- a/cpp/cmake_modules/Findutf8proc.cmake +++ b/cpp/cmake_modules/Findutf8proc.cmake @@ -95,7 +95,7 @@ if(utf8proc_FOUND) INTERFACE_INCLUDE_DIRECTORIES "${utf8proc_INCLUDE_DIR}") if(NOT ARROW_UTF8PROC_USE_SHARED) - set_target_properties(utf8proc::utf8proc PROPERTIES INTERFACE_COMPILER_DEFINITIONS + set_target_properties(utf8proc::utf8proc PROPERTIES INTERFACE_COMPILE_DEFINITIONS "UTF8PROC_STATIC") endif() endif() diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index 865406e705b..32669b2c072 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -200,7 +200,7 @@ endmacro() macro(resolve_dependency DEPENDENCY_NAME) set(options) set(one_value_args HAVE_ALT IS_RUNTIME_DEPENDENCY REQUIRED_VERSION USE_CONFIG) - set(multi_value_args PC_PACKAGE_NAMES) + set(multi_value_args COMPONENTS PC_PACKAGE_NAMES) cmake_parse_arguments(ARG "${options}" "${one_value_args}" @@ -225,6 +225,9 @@ macro(resolve_dependency DEPENDENCY_NAME) if(ARG_USE_CONFIG) list(APPEND FIND_PACKAGE_ARGUMENTS CONFIG) endif() + if(ARG_COMPONENTS) + list(APPEND FIND_PACKAGE_ARGUMENTS COMPONENTS ${ARG_COMPONENTS}) + endif() if(${DEPENDENCY_NAME}_SOURCE STREQUAL "AUTO") find_package(${FIND_PACKAGE_ARGUMENTS}) if(${${PACKAGE_NAME}_FOUND}) @@ -260,8 +263,15 @@ endmacro() set(THIRDPARTY_DIR "${arrow_SOURCE_DIR}/thirdparty") -# Include vendored Flatbuffers -include_directories(SYSTEM "${THIRDPARTY_DIR}/flatbuffers/include") +add_library(arrow::flatbuffers INTERFACE IMPORTED) +if(CMAKE_VERSION VERSION_LESS 3.11) + set_target_properties(arrow::flatbuffers + PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${THIRDPARTY_DIR}/flatbuffers/include") +else() + target_include_directories(arrow::flatbuffers + INTERFACE "${THIRDPARTY_DIR}/flatbuffers/include") +endif() # ---------------------------------------------------------------------- # Some EP's require other EP's @@ -770,6 +780,7 @@ macro(build_boost) # This is needed by the thrift_ep build set(BOOST_ROOT ${BOOST_PREFIX}) + set(Boost_INCLUDE_DIR "${BOOST_PREFIX}") if(ARROW_BOOST_REQUIRE_LIBRARY) set(BOOST_LIB_DIR "${BOOST_PREFIX}/stage/lib") @@ -829,9 +840,16 @@ macro(build_boost) set(BOOST_BUILD_PRODUCTS ${BOOST_STATIC_SYSTEM_LIBRARY} ${BOOST_STATIC_FILESYSTEM_LIBRARY}) - add_thirdparty_lib(boost_system STATIC_LIB "${BOOST_STATIC_SYSTEM_LIBRARY}") - - add_thirdparty_lib(boost_filesystem STATIC_LIB "${BOOST_STATIC_FILESYSTEM_LIBRARY}") + add_thirdparty_lib(Boost::system + STATIC + "${BOOST_STATIC_SYSTEM_LIBRARY}" + INCLUDE_DIRECTORIES + "${Boost_INCLUDE_DIR}") + add_thirdparty_lib(Boost::filesystem + STATIC + "${BOOST_STATIC_FILESYSTEM_LIBRARY}" + INCLUDE_DIRECTORIES + "${Boost_INCLUDE_DIR}") externalproject_add(boost_ep URL ${BOOST_SOURCE_URL} @@ -841,8 +859,8 @@ macro(build_boost) CONFIGURE_COMMAND ${BOOST_CONFIGURE_COMMAND} BUILD_COMMAND ${BOOST_BUILD_COMMAND} INSTALL_COMMAND "" ${EP_LOG_OPTIONS}) - add_dependencies(boost_system_static boost_ep) - add_dependencies(boost_filesystem_static boost_ep) + add_dependencies(Boost::system boost_ep) + add_dependencies(Boost::filesystem boost_ep) else() externalproject_add(boost_ep ${EP_LOG_OPTIONS} @@ -852,9 +870,27 @@ macro(build_boost) URL ${BOOST_SOURCE_URL} URL_HASH "SHA256=${ARROW_BOOST_BUILD_SHA256_CHECKSUM}") endif() - set(Boost_INCLUDE_DIR "${BOOST_PREFIX}") - set(Boost_INCLUDE_DIRS "${Boost_INCLUDE_DIR}") - add_dependencies(toolchain boost_ep) + add_library(Boost::headers INTERFACE IMPORTED) + if(CMAKE_VERSION VERSION_LESS 3.11) + set_target_properties(Boost::headers PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${Boost_INCLUDE_DIR}") + else() + target_include_directories(Boost::headers INTERFACE "${Boost_INCLUDE_DIR}") + endif() + add_dependencies(Boost::headers boost_ep) + # If Boost is found but one of system or filesystem components aren't found, + # Boost::disable_autolinking and Boost::dynamic_linking are already defined. + if(NOT TARGET Boost::disable_autolinking) + add_library(Boost::disable_autolinking INTERFACE IMPORTED) + if(WIN32) + target_compile_definitions(Boost::disable_autolinking INTERFACE "BOOST_ALL_NO_LIB") + endif() + endif() + if(NOT TARGET Boost::dynamic_linking) + # This doesn't add BOOST_ALL_DYN_LINK because bundled Boost is a static library. + add_library(Boost::dynamic_linking INTERFACE IMPORTED) + add_dependencies(toolchain boost_ep) + endif() set(BOOST_VENDORED TRUE) endmacro() @@ -954,43 +990,83 @@ if(ARROW_BUILD_INTEGRATION OR ARROW_BUILD_TESTS OR (ARROW_FLIGHT AND ARROW_BUILD_BENCHMARKS) OR (ARROW_S3 AND ARROW_BUILD_BENCHMARKS)) - set(ARROW_BOOST_REQUIRED TRUE) + set(ARROW_USE_BOOST TRUE) set(ARROW_BOOST_REQUIRE_LIBRARY TRUE) elseif(ARROW_GANDIVA OR (ARROW_WITH_THRIFT AND THRIFT_REQUIRES_BOOST) OR (NOT ARROW_USE_NATIVE_INT128)) - set(ARROW_BOOST_REQUIRED TRUE) + set(ARROW_USE_BOOST TRUE) set(ARROW_BOOST_REQUIRE_LIBRARY FALSE) else() - set(ARROW_BOOST_REQUIRED FALSE) + set(ARROW_USE_BOOST FALSE) endif() -if(ARROW_BOOST_REQUIRED) +if(ARROW_USE_BOOST) + if(ARROW_BOOST_USE_SHARED) + # Find shared Boost libraries. + set(Boost_USE_STATIC_LIBS OFF) + set(BUILD_SHARED_LIBS_KEEP ${BUILD_SHARED_LIBS}) + set(BUILD_SHARED_LIBS ON) + else() + # Find static boost headers and libs + set(Boost_USE_STATIC_LIBS ON) + endif() resolve_dependency(Boost - HAVE_ALT - TRUE REQUIRED_VERSION ${ARROW_BOOST_REQUIRED_VERSION} + COMPONENTS + system + filesystem IS_RUNTIME_DEPENDENCY # libarrow.so doesn't depend on libboost*. FALSE) + if(ARROW_BOOST_USE_SHARED) + set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_KEEP}) + unset(BUILD_SHARED_LIBS_KEEP) + endif() - if(TARGET Boost::system) - set(BOOST_SYSTEM_LIBRARY Boost::system) - set(BOOST_FILESYSTEM_LIBRARY Boost::filesystem) - elseif(BoostAlt_FOUND) - set(BOOST_SYSTEM_LIBRARY ${Boost_SYSTEM_LIBRARY}) - set(BOOST_FILESYSTEM_LIBRARY ${Boost_FILESYSTEM_LIBRARY}) - else() - set(BOOST_SYSTEM_LIBRARY boost_system_static) - set(BOOST_FILESYSTEM_LIBRARY boost_filesystem_static) + # For CMake < 3.15 + if(NOT TARGET Boost::headers) + add_library(Boost::headers INTERFACE IMPORTED) + if(CMAKE_VERSION VERSION_LESS 3.11) + set_target_properties(Boost::headers PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${Boost_INCLUDE_DIR}") + else() + target_include_directories(Boost::headers INTERFACE "${Boost_INCLUDE_DIR}") + endif() endif() - set(ARROW_BOOST_LIBS ${BOOST_SYSTEM_LIBRARY} ${BOOST_FILESYSTEM_LIBRARY}) - message(STATUS "Boost include dir: ${Boost_INCLUDE_DIR}") - message(STATUS "Boost libraries: ${ARROW_BOOST_LIBS}") + foreach(BOOST_LIBRARY Boost::headers Boost::filesystem Boost::system) + if(NOT TARGET ${BOOST_LIBRARY}) + continue() + endif() + if(CMAKE_VERSION VERSION_LESS 3.11) + set_target_properties(${BOOST_LIBRARY} PROPERTIES INTERFACE_LINK_LIBRARIES + Boost::disable_autolinking) + else() + target_link_libraries(${BOOST_LIBRARY} INTERFACE Boost::disable_autolinking) + endif() + if(ARROW_BOOST_USE_SHARED) + if(CMAKE_VERSION VERSION_LESS 3.11) + set_target_properties(${BOOST_LIBRARY} PROPERTIES INTERFACE_LINK_LIBRARIES + Boost::dynamic_linking) + else() + target_link_libraries(${BOOST_LIBRARY} INTERFACE Boost::dynamic_linking) + endif() + endif() + endforeach() - include_directories(SYSTEM ${Boost_INCLUDE_DIR}) + if(WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + # boost/process/detail/windows/handle_workaround.hpp doesn't work + # without BOOST_USE_WINDOWS_H with MinGW because MinGW doesn't + # provide __kernel_entry without winternl.h. + # + # See also: + # https://github.com/boostorg/process/blob/develop/include/boost/process/detail/windows/handle_workaround.hpp + target_compile_definitions(Boost::headers INTERFACE "BOOST_USE_WINDOWS_H=1") + endif() + + message(STATUS "Boost include dir: ${Boost_INCLUDE_DIR}") endif() # ---------------------------------------------------------------------- @@ -1056,9 +1132,6 @@ if(ARROW_WITH_SNAPPY) get_target_property(SNAPPY_LIB Snappy::snappy IMPORTED_LOCATION) string(APPEND ARROW_PC_LIBS_PRIVATE " ${SNAPPY_LIB}") endif() - # TODO: Don't use global includes but rather target_include_directories - get_target_property(SNAPPY_INCLUDE_DIRS Snappy::snappy INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${SNAPPY_INCLUDE_DIRS}) endif() # ---------------------------------------------------------------------- @@ -1122,10 +1195,6 @@ endmacro() if(ARROW_WITH_BROTLI) resolve_dependency(Brotli PC_PACKAGE_NAMES libbrotlidec libbrotlienc) - # TODO: Don't use global includes but rather target_include_directories - get_target_property(BROTLI_INCLUDE_DIR Brotli::brotlicommon - INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${BROTLI_INCLUDE_DIR}) endif() if(PARQUET_REQUIRE_ENCRYPTION AND NOT ARROW_PARQUET) @@ -1177,9 +1246,7 @@ if(ARROW_USE_OPENSSL) message(STATUS "Found OpenSSL Crypto Library: ${OPENSSL_CRYPTO_LIBRARY}") message(STATUS "Building with OpenSSL (Version: ${OPENSSL_VERSION}) support") - list(APPEND ARROW_SYSTEM_DEPENDENCIES "OpenSSL") - - include_directories(SYSTEM ${OPENSSL_INCLUDE_DIR}) + list(APPEND ARROW_SYSTEM_DEPENDENCIES OpenSSL) else() message(STATUS "Building without OpenSSL support. Minimum OpenSSL version ${ARROW_OPENSSL_REQUIRED_VERSION} required." ) @@ -1242,9 +1309,6 @@ endmacro() if(ARROW_USE_GLOG) resolve_dependency(GLOG PC_PACKAGE_NAMES libglog) - # TODO: Don't use global includes but rather target_include_directories - get_target_property(GLOG_INCLUDE_DIR glog::glog INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${GLOG_INCLUDE_DIR}) endif() # ---------------------------------------------------------------------- @@ -1296,8 +1360,8 @@ macro(build_gflags) add_dependencies(toolchain gflags_ep) - add_thirdparty_lib(gflags STATIC_LIB ${GFLAGS_STATIC_LIB}) - set(GFLAGS_LIBRARY gflags_static) + add_thirdparty_lib(gflags::gflags_static STATIC ${GFLAGS_STATIC_LIB}) + set(GFLAGS_LIBRARY gflags::gflags_static) set_target_properties(${GFLAGS_LIBRARY} PROPERTIES INTERFACE_COMPILE_DEFINITIONS "GFLAGS_IS_A_DLL=0" INTERFACE_INCLUDE_DIRECTORIES "${GFLAGS_INCLUDE_DIR}") @@ -1309,7 +1373,7 @@ macro(build_gflags) set(GFLAGS_VENDORED TRUE) - list(APPEND ARROW_BUNDLED_STATIC_LIBS gflags_static) + list(APPEND ARROW_BUNDLED_STATIC_LIBS gflags::gflags_static) endmacro() if(ARROW_NEED_GFLAGS) @@ -1321,11 +1385,11 @@ if(ARROW_NEED_GFLAGS) ${ARROW_GFLAGS_REQUIRED_VERSION} IS_RUNTIME_DEPENDENCY FALSE) - # TODO: Don't use global includes but rather target_include_directories - include_directories(SYSTEM ${GFLAGS_INCLUDE_DIR}) if(NOT TARGET ${GFLAGS_LIBRARIES}) - if(TARGET gflags-shared) + if(TARGET gflags::gflags_shared) + set(GFLAGS_LIBRARIES gflags::gflags_shared) + elseif(TARGET gflags-shared) set(GFLAGS_LIBRARIES gflags-shared) elseif(TARGET gflags_shared) set(GFLAGS_LIBRARIES gflags_shared) @@ -1405,6 +1469,12 @@ macro(build_thrift) set_target_properties(thrift::thrift PROPERTIES IMPORTED_LOCATION "${THRIFT_STATIC_LIB}" INTERFACE_INCLUDE_DIRECTORIES "${THRIFT_INCLUDE_DIR}") + if(CMAKE_VERSION VERSION_LESS 3.11) + set_target_properties(${BOOST_LIBRARY} PROPERTIES INTERFACE_LINK_LIBRARIES + Boost::headers) + else() + target_link_libraries(thrift::thrift INTERFACE Boost::headers) + endif() add_dependencies(toolchain thrift_ep) add_dependencies(thrift::thrift thrift_ep) set(THRIFT_VERSION ${ARROW_THRIFT_BUILD_VERSION}) @@ -1423,8 +1493,6 @@ if(ARROW_WITH_THRIFT) PC_PACKAGE_NAMES thrift) endif() - # TODO: Don't use global includes but rather target_include_directories - include_directories(SYSTEM ${THRIFT_INCLUDE_DIR}) string(REPLACE "." ";" VERSION_LIST ${THRIFT_VERSION}) list(GET VERSION_LIST 0 THRIFT_VERSION_MAJOR) @@ -1512,6 +1580,8 @@ macro(build_protobuf) URL_HASH "SHA256=${ARROW_PROTOBUF_BUILD_SHA256_CHECKSUM}") file(MAKE_DIRECTORY "${PROTOBUF_INCLUDE_DIR}") + # For compatibility of CMake's FindProtobuf.cmake. + set(Protobuf_INCLUDE_DIRS "${PROTOBUF_INCLUDE_DIR}") add_library(arrow::protobuf::libprotobuf STATIC IMPORTED) set_target_properties(arrow::protobuf::libprotobuf @@ -1558,9 +1628,6 @@ if(ARROW_WITH_PROTOBUF) add_definitions(-DPROTOBUF_USE_DLLS) endif() - # TODO: Don't use global includes but rather target_include_directories - include_directories(SYSTEM ${PROTOBUF_INCLUDE_DIR}) - if(TARGET arrow::protobuf::libprotobuf) set(ARROW_PROTOBUF_LIBPROTOBUF arrow::protobuf::libprotobuf) else() @@ -1760,15 +1827,15 @@ if(ARROW_JEMALLOC) # Don't use the include directory directly so that we can point to a path # that is unique to our codebase. - include_directories(SYSTEM "${CMAKE_CURRENT_BINARY_DIR}/jemalloc_ep-prefix/src/") + set(JEMALLOC_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/jemalloc_ep-prefix/src/") # The include directory must exist before it is referenced by a target. - file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/jemalloc_ep-prefix/src/") + file(MAKE_DIRECTORY "${JEMALLOC_INCLUDE_DIR}") add_library(jemalloc::jemalloc STATIC IMPORTED) set_target_properties(jemalloc::jemalloc PROPERTIES INTERFACE_LINK_LIBRARIES Threads::Threads IMPORTED_LOCATION "${JEMALLOC_STATIC_LIB}" INTERFACE_INCLUDE_DIRECTORIES - "${CMAKE_CURRENT_BINARY_DIR}/jemalloc_ep-prefix/src") + "${JEMALLOC_INCLUDE_DIR}") add_dependencies(jemalloc::jemalloc jemalloc_ep) list(APPEND ARROW_BUNDLED_STATIC_LIBS jemalloc::jemalloc) @@ -1810,7 +1877,6 @@ if(ARROW_MIMALLOC) CMAKE_ARGS ${MIMALLOC_CMAKE_ARGS} BUILD_BYPRODUCTS "${MIMALLOC_STATIC_LIB}") - include_directories(SYSTEM ${MIMALLOC_INCLUDE_DIR}) file(MAKE_DIRECTORY ${MIMALLOC_INCLUDE_DIR}) add_library(mimalloc::mimalloc STATIC IMPORTED) @@ -2003,10 +2069,6 @@ if(ARROW_TESTING) # endif() # set(CMAKE_REQUIRED_LIBRARIES) endif() - - get_target_property(GTEST_INCLUDE_DIR GTest::gtest INTERFACE_INCLUDE_DIRECTORIES) - # TODO: Don't use global includes but rather target_include_directories - include_directories(SYSTEM ${GTEST_INCLUDE_DIR}) endif() macro(build_benchmark) @@ -2077,10 +2139,6 @@ if(ARROW_BUILD_BENCHMARKS) ${BENCHMARK_REQUIRED_VERSION} IS_RUNTIME_DEPENDENCY FALSE) - # TODO: Don't use global includes but rather target_include_directories - get_target_property(BENCHMARK_INCLUDE_DIR benchmark::benchmark - INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${BENCHMARK_INCLUDE_DIR}) endif() macro(build_rapidjson) @@ -2102,6 +2160,8 @@ macro(build_rapidjson) CMAKE_ARGS ${RAPIDJSON_CMAKE_ARGS}) set(RAPIDJSON_INCLUDE_DIR "${RAPIDJSON_PREFIX}/include") + # The include directory must exist before it is referenced by a target. + file(MAKE_DIRECTORY "${RAPIDJSON_INCLUDE_DIR}") add_dependencies(toolchain rapidjson_ep) add_dependencies(toolchain-tests rapidjson_ep) @@ -2123,9 +2183,20 @@ if(ARROW_WITH_RAPIDJSON) if(RapidJSON_INCLUDE_DIR) set(RAPIDJSON_INCLUDE_DIR "${RapidJSON_INCLUDE_DIR}") endif() + if(WIN32 AND "${RAPIDJSON_INCLUDE_DIR}" MATCHES "^/") + # MSYS2 + execute_process(COMMAND "cygpath" "--windows" "${RAPIDJSON_INCLUDE_DIR}" + OUTPUT_VARIABLE RAPIDJSON_INCLUDE_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() - # TODO: Don't use global includes but rather target_include_directories - include_directories(SYSTEM ${RAPIDJSON_INCLUDE_DIR}) + add_library(rapidjson::rapidjson INTERFACE IMPORTED) + if(CMAKE_VERSION VERSION_LESS 3.11) + set_target_properties(rapidjson::rapidjson PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${RAPIDJSON_INCLUDE_DIR}") + else() + target_include_directories(rapidjson::rapidjson INTERFACE "${RAPIDJSON_INCLUDE_DIR}") + endif() endif() macro(build_xsimd) @@ -2141,6 +2212,8 @@ macro(build_xsimd) CMAKE_ARGS ${XSIMD_CMAKE_ARGS}) set(XSIMD_INCLUDE_DIR "${XSIMD_PREFIX}/include") + # The include directory must exist before it is referenced by a target. + file(MAKE_DIRECTORY "${XSIMD_INCLUDE_DIR}") add_dependencies(toolchain xsimd_ep) add_dependencies(toolchain-tests xsimd_ep) @@ -2150,10 +2223,21 @@ endmacro() if((NOT ARROW_SIMD_LEVEL STREQUAL "NONE") OR (NOT ARROW_RUNTIME_SIMD_LEVEL STREQUAL "NONE" )) + set(ARROW_USE_XSIMD TRUE) +else() + set(ARROW_USE_XSIMD FALSE) +endif() +if(ARROW_USE_XSIMD) set(xsimd_SOURCE "BUNDLED") resolve_dependency(xsimd) - # TODO: Don't use global includes but rather target_include_directories - include_directories(SYSTEM ${XSIMD_INCLUDE_DIR}) + + add_library(xsimd INTERFACE IMPORTED) + if(CMAKE_VERSION VERSION_LESS 3.11) + set_target_properties(xsimd PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${XSIMD_INCLUDE_DIR}") + else() + target_include_directories(xsimd INTERFACE "${XSIMD_INCLUDE_DIR}") + endif() endif() macro(build_zlib) @@ -2195,10 +2279,6 @@ endmacro() if(ARROW_WITH_ZLIB) resolve_dependency(ZLIB PC_PACKAGE_NAMES zlib) - - # TODO: Don't use global includes but rather target_include_directories - get_target_property(ZLIB_INCLUDE_DIR ZLIB::ZLIB INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${ZLIB_INCLUDE_DIR}) endif() macro(build_lz4) @@ -2253,10 +2333,6 @@ endmacro() if(ARROW_WITH_LZ4) resolve_dependency(Lz4 PC_PACKAGE_NAMES liblz4) - - # TODO: Don't use global includes but rather target_include_directories - get_target_property(LZ4_INCLUDE_DIR LZ4::lz4 INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${LZ4_INCLUDE_DIR}) endif() macro(build_zstd) @@ -2339,11 +2415,6 @@ if(ARROW_WITH_ZSTD) endif() endif() endif() - - # TODO: Don't use global includes but rather target_include_directories - get_target_property(ZSTD_INCLUDE_DIR ${ARROW_ZSTD_LIBZSTD} - INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${ZSTD_INCLUDE_DIR}) endif() # ---------------------------------------------------------------------- @@ -2399,10 +2470,6 @@ if(ARROW_WITH_RE2) string(APPEND ARROW_PC_LIBS_PRIVATE " ${RE2_LIB}") endif() add_definitions(-DARROW_WITH_RE2) - - # TODO: Don't use global includes but rather target_include_directories - get_target_property(RE2_INCLUDE_DIR re2::re2 INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${RE2_INCLUDE_DIR}) endif() macro(build_bzip2) @@ -2465,7 +2532,6 @@ if(ARROW_WITH_BZ2) PROPERTIES IMPORTED_LOCATION "${BZIP2_LIBRARIES}" INTERFACE_INCLUDE_DIRECTORIES "${BZIP2_INCLUDE_DIR}") endif() - include_directories(SYSTEM "${BZIP2_INCLUDE_DIR}") endif() macro(build_utf8proc) @@ -2498,7 +2564,7 @@ macro(build_utf8proc) add_library(utf8proc::utf8proc STATIC IMPORTED) set_target_properties(utf8proc::utf8proc PROPERTIES IMPORTED_LOCATION "${UTF8PROC_STATIC_LIB}" - INTERFACE_COMPILER_DEFINITIONS "UTF8PROC_STATIC" + INTERFACE_COMPILE_DEFINITIONS "UTF8PROC_STATIC" INTERFACE_INCLUDE_DIRECTORIES "${UTF8PROC_PREFIX}/include") @@ -2514,22 +2580,7 @@ if(ARROW_WITH_UTF8PROC) "2.2.0" PC_PACKAGE_NAMES libutf8proc) - add_definitions(-DARROW_WITH_UTF8PROC) - - # TODO: Don't use global definitions but rather - # target_compile_definitions or target_link_libraries - get_target_property(UTF8PROC_COMPILER_DEFINITIONS utf8proc::utf8proc - INTERFACE_COMPILER_DEFINITIONS) - if(UTF8PROC_COMPILER_DEFINITIONS) - add_definitions(-D${UTF8PROC_COMPILER_DEFINITIONS}) - endif() - - # TODO: Don't use global includes but rather - # target_include_directories or target_link_libraries - get_target_property(UTF8PROC_INCLUDE_DIR utf8proc::utf8proc - INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${UTF8PROC_INCLUDE_DIR}) endif() macro(build_cares) @@ -3450,9 +3501,6 @@ macro(build_grpc) TRUE PC_PACKAGE_NAMES libcares) - # TODO: Don't use global includes but rather target_include_directories - get_target_property(c-ares_INCLUDE_DIR c-ares::cares INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${c-ares_INCLUDE_DIR}) # First need Abseil resolve_dependency_absl() @@ -3708,10 +3756,6 @@ if(ARROW_WITH_GRPC) PC_PACKAGE_NAMES grpc++) - # TODO: Don't use global includes but rather target_include_directories - get_target_property(GRPC_INCLUDE_DIR gRPC::grpc++ INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${GRPC_INCLUDE_DIR}) - if(GRPC_VENDORED) set(GRPCPP_PP_INCLUDE TRUE) # Examples need to link to static Arrow if we're using static gRPC @@ -3719,6 +3763,7 @@ if(ARROW_WITH_GRPC) else() # grpc++ headers may reside in ${GRPC_INCLUDE_DIR}/grpc++ or ${GRPC_INCLUDE_DIR}/grpcpp # depending on the gRPC version. + get_target_property(GRPC_INCLUDE_DIR gRPC::grpc++ INTERFACE_INCLUDE_DIRECTORIES) if(EXISTS "${GRPC_INCLUDE_DIR}/grpcpp/impl/codegen/config_protobuf.h") set(GRPCPP_PP_INCLUDE TRUE) elseif(EXISTS "${GRPC_INCLUDE_DIR}/grpc++/impl/codegen/config_protobuf.h") @@ -3802,7 +3847,6 @@ if(ARROW_WITH_NLOHMANN_JSON) resolve_dependency(nlohmann_json) get_target_property(nlohmann_json_INCLUDE_DIR nlohmann_json::nlohmann_json INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${nlohmann_json_INCLUDE_DIR}) message(STATUS "Found nlohmann_json headers: ${nlohmann_json_INCLUDE_DIR}") endif() @@ -3932,9 +3976,6 @@ if(ARROW_WITH_GOOGLE_CLOUD_CPP) resolve_dependency(google_cloud_cpp_storage) get_target_property(google_cloud_cpp_storage_INCLUDE_DIR google-cloud-cpp::storage INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${google_cloud_cpp_storage_INCLUDE_DIR}) - get_target_property(absl_base_INCLUDE_DIR absl::base INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${absl_base_INCLUDE_DIR}) message(STATUS "Found google-cloud-cpp::storage headers: ${google_cloud_cpp_storage_INCLUDE_DIR}" ) endif() @@ -3956,9 +3997,15 @@ set(HDFS_H_PATH "${HADOOP_HOME}/include/hdfs.h") if(NOT EXISTS ${HDFS_H_PATH}) message(FATAL_ERROR "Did not find hdfs.h at ${HDFS_H_PATH}") endif() -message(STATUS "Found hdfs.h at: " ${HDFS_H_PATH}) +message(STATUS "Found hdfs.h at: ${HDFS_H_PATH}") -include_directories(SYSTEM "${HADOOP_HOME}/include") +add_library(arrow::hadoop INTERFACE IMPORTED) +if(CMAKE_VERSION VERSION_LESS 3.11) + set_target_properties(arrow::hadoop PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${HADOOP_HOME}/include") +else() + target_include_directories(arrow::hadoop INTERFACE "${HADOOP_HOME}/include") +endif() # ---------------------------------------------------------------------- # Apache ORC @@ -4043,7 +4090,6 @@ endmacro() if(ARROW_ORC) resolve_dependency(ORC) - include_directories(SYSTEM ${ORC_INCLUDE_DIR}) message(STATUS "Found ORC static library: ${ORC_STATIC_LIB}") message(STATUS "Found ORC headers: ${ORC_INCLUDE_DIR}") endif() @@ -4260,7 +4306,6 @@ if(ARROW_WITH_OPENTELEMETRY) resolve_dependency(opentelemetry-cpp) get_target_property(OPENTELEMETRY_INCLUDE_DIR opentelemetry-cpp::api INTERFACE_INCLUDE_DIRECTORIES) - include_directories(SYSTEM ${OPENTELEMETRY_INCLUDE_DIR}) message(STATUS "Found OpenTelemetry headers: ${OPENTELEMETRY_INCLUDE_DIR}") endif() @@ -4486,7 +4531,6 @@ if(ARROW_S3) endif() endif() - include_directories(SYSTEM ${AWSSDK_INCLUDE_DIR}) message(STATUS "Found AWS SDK headers: ${AWSSDK_INCLUDE_DIR}") message(STATUS "Found AWS SDK libraries: ${AWSSDK_LINK_LIBRARIES}") diff --git a/cpp/examples/parquet/parquet_arrow/CMakeLists.txt b/cpp/examples/parquet/parquet_arrow/CMakeLists.txt index eb5bb869170..32f980060c9 100644 --- a/cpp/examples/parquet/parquet_arrow/CMakeLists.txt +++ b/cpp/examples/parquet/parquet_arrow/CMakeLists.txt @@ -38,7 +38,5 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Arrow REQUIRED) find_package(Parquet REQUIRED) -include_directories(SYSTEM ${ARROW_INCLUDE_DIR} ${PARQUET_INCLUDE_DIR}) - add_executable(parquet-arrow-example reader_writer.cc) -target_link_libraries(parquet-arrow-example ${PARQUET_SHARED_LIB} ${ARROW_SHARED_LIB}) +target_link_libraries(parquet-arrow-example parquet_shared arrow_shared) diff --git a/cpp/src/arrow/CMakeLists.txt b/cpp/src/arrow/CMakeLists.txt index 690c51a4a62..3b49f4ca00a 100644 --- a/cpp/src/arrow/CMakeLists.txt +++ b/cpp/src/arrow/CMakeLists.txt @@ -622,10 +622,15 @@ if(ARROW_TESTING) DEPENDENCIES arrow_test_dependencies SHARED_LINK_LIBS + arrow::flatbuffers + rapidjson::rapidjson arrow_shared GTest::gtest STATIC_LINK_LIBS - arrow_static) + arrow::flatbuffers + rapidjson::rapidjson + arrow_static + GTest::gtest) add_custom_target(arrow_testing) add_dependencies(arrow_testing ${ARROW_TESTING_LIBRARIES}) diff --git a/cpp/src/arrow/dataset/CMakeLists.txt b/cpp/src/arrow/dataset/CMakeLists.txt index 6aa4794a3fa..478c13691b0 100644 --- a/cpp/src/arrow/dataset/CMakeLists.txt +++ b/cpp/src/arrow/dataset/CMakeLists.txt @@ -30,7 +30,7 @@ set(ARROW_DATASET_SRCS projector.cc scanner.cc) -set(ARROW_DATASET_LINK_STATIC arrow_static) +set(ARROW_DATASET_LINK_STATIC arrow_static ${ARROW_STATIC_LINK_LIBS}) set(ARROW_DATASET_LINK_SHARED arrow_shared) if(ARROW_CSV) diff --git a/cpp/src/arrow/filesystem/CMakeLists.txt b/cpp/src/arrow/filesystem/CMakeLists.txt index c301a57bade..44b71ed27f5 100644 --- a/cpp/src/arrow/filesystem/CMakeLists.txt +++ b/cpp/src/arrow/filesystem/CMakeLists.txt @@ -40,7 +40,7 @@ if(ARROW_S3) EXTRA_LABELS filesystem) if(TARGET arrow-s3fs-test) - set(ARROW_S3FS_TEST_COMPILE_DEFINITIONS ${ARROW_BOOST_PROCESS_COMPILE_DEFINITIONS}) + set(ARROW_S3FS_TEST_COMPILE_DEFINITIONS) get_target_property(AWS_CPP_SDK_S3_TYPE aws-cpp-sdk-s3 TYPE) # We need to initialize AWS C++ SDK for direct use (not via # arrow::fs::S3FileSystem) in arrow-s3fs-test if we use static AWS @@ -74,8 +74,6 @@ if(ARROW_S3) SOURCES s3fs_benchmark.cc s3_test_util.cc) - target_compile_definitions(arrow-filesystem-s3fs-benchmark - PRIVATE ${ARROW_BOOST_PROCESS_COMPILE_DEFINITIONS}) if(ARROW_TEST_LINKAGE STREQUAL "static") target_link_libraries(arrow-filesystem-s3fs-benchmark PRIVATE parquet_static) else() diff --git a/cpp/src/arrow/flight/CMakeLists.txt b/cpp/src/arrow/flight/CMakeLists.txt index f9d135654b4..c09159eb151 100644 --- a/cpp/src/arrow/flight/CMakeLists.txt +++ b/cpp/src/arrow/flight/CMakeLists.txt @@ -58,6 +58,13 @@ else() list(APPEND ARROW_FLIGHT_TEST_LINK_LIBS arrow_cuda_shared) endif() endif() +list(APPEND + ARROW_FLIGHT_TEST_INTERFACE_LIBS + Boost::headers + Boost::filesystem + Boost::system + GTest::gtest + GTest::gmock) # Needed for Flight SQL and integration set(ARROW_FLIGHT_TEST_LINK_LIBS @@ -250,22 +257,19 @@ if(ARROW_TESTING) arrow_shared arrow_flight_shared arrow_testing_shared - ${BOOST_FILESYSTEM_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - GTest::gtest ${ARROW_FLIGHT_TEST_INTERFACE_LIBS} STATIC_LINK_LIBS arrow_static arrow_flight_static arrow_testing_static - ${ARROW_FLIGHT_TEST_INTERFACE_LIBS}) -endif() + ${ARROW_FLIGHT_TEST_INTERFACE_LIBS} + PRIVATE_INCLUDES + "${Protobuf_INCLUDE_DIRS}") -foreach(LIB_TARGET ${ARROW_FLIGHT_TESTING_LIBRARIES}) - target_compile_definitions(${LIB_TARGET} - PRIVATE ARROW_FLIGHT_EXPORTING - ${ARROW_BOOST_PROCESS_COMPILE_DEFINITIONS}) -endforeach() + foreach(LIB_TARGET ${ARROW_FLIGHT_TESTING_LIBRARIES}) + target_compile_definitions(${LIB_TARGET} PRIVATE ARROW_FLIGHT_EXPORTING) + endforeach() +endif() add_arrow_test(flight_internals_test STATIC_LINK_LIBS diff --git a/cpp/src/arrow/flight/sql/CMakeLists.txt b/cpp/src/arrow/flight/sql/CMakeLists.txt index 6efe6e76bfe..6a3c9222105 100644 --- a/cpp/src/arrow/flight/sql/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/CMakeLists.txt @@ -59,7 +59,9 @@ add_arrow_lib(arrow_flight_sql SHARED_LINK_LIBS arrow_flight_shared STATIC_LINK_LIBS - arrow_flight_static) + arrow_flight_static + PRIVATE_INCLUDES + "${Protobuf_INCLUDE_DIRS}") if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") set(ARROW_FLIGHT_SQL_TEST_LINK_LIBS arrow_flight_sql_static diff --git a/cpp/src/arrow/flight/transport/ucx/CMakeLists.txt b/cpp/src/arrow/flight/transport/ucx/CMakeLists.txt index 6e315b68d6c..8e28c105b4f 100644 --- a/cpp/src/arrow/flight/transport/ucx/CMakeLists.txt +++ b/cpp/src/arrow/flight/transport/ucx/CMakeLists.txt @@ -29,7 +29,6 @@ set(ARROW_FLIGHT_TRANSPORT_UCX_SRCS util_internal.cc) set(ARROW_FLIGHT_TRANSPORT_UCX_LINK_LIBS) -include_directories(SYSTEM ${UCX_INCLUDE_DIRS}) list(APPEND ARROW_FLIGHT_TRANSPORT_UCX_LINK_LIBS PkgConfig::UCX) add_arrow_lib(arrow_flight_transport_ucx diff --git a/cpp/src/arrow/gpu/CMakeLists.txt b/cpp/src/arrow/gpu/CMakeLists.txt index 7a66622f847..934a11f810c 100644 --- a/cpp/src/arrow/gpu/CMakeLists.txt +++ b/cpp/src/arrow/gpu/CMakeLists.txt @@ -29,6 +29,7 @@ if(DEFINED ENV{CUDA_HOME}) set(CUDA_TOOLKIT_ROOT_DIR "$ENV{CUDA_HOME}") endif() +set(ARROW_CUDA_LINK_LIBS arrow::flatbuffers) if(CMAKE_VERSION VERSION_LESS 3.17) find_package(CUDA REQUIRED) set(ARROW_CUDA_SHARED_LINK_LIBS ${CUDA_CUDA_LIBRARY}) @@ -39,7 +40,6 @@ else() # CUDAToolkit is only available in CMake >= 3.17 find_package(CUDAToolkit REQUIRED) set(ARROW_CUDA_SHARED_LINK_LIBS CUDA::cuda_driver) - include_directories(SYSTEM ${CUDAToolkit_INCLUDE_DIRS}) endif() set(ARROW_CUDA_SRCS cuda_arrow_ipc.cc cuda_context.cc cuda_internal.cc cuda_memory.cc) @@ -57,9 +57,11 @@ add_arrow_lib(arrow_cuda ${ARROW_VERSION_SCRIPT_FLAGS} # Defined in cpp/arrow/CMakeLists.txt SHARED_LINK_LIBS arrow_shared + ${ARROW_CUDA_LINK_LIBS} ${ARROW_CUDA_SHARED_LINK_LIBS} # Static arrow_cuda must also link against CUDA shared libs STATIC_LINK_LIBS + ${ARROW_CUDA_LINK_LIBS} ${ARROW_CUDA_SHARED_LINK_LIBS}) add_dependencies(arrow_cuda ${ARROW_CUDA_LIBRARIES}) diff --git a/cpp/src/arrow/python/CMakeLists.txt b/cpp/src/arrow/python/CMakeLists.txt index 34dea64df5a..c37240a426c 100644 --- a/cpp/src/arrow/python/CMakeLists.txt +++ b/cpp/src/arrow/python/CMakeLists.txt @@ -71,13 +71,19 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL endif() set(ARROW_PYTHON_SHARED_LINK_LIBS arrow_shared) +set(ARROW_PYTHON_SHARED_PRIVATE_LINK_LIBS) +set(ARROW_PYTHON_STATIC_LINK_LIBS ${PYTHON_OTHER_LIBS}) + if(WIN32) list(APPEND ARROW_PYTHON_SHARED_LINK_LIBS ${PYTHON_LIBRARIES} ${PYTHON_OTHER_LIBS}) endif() - if(PARQUET_REQUIRE_ENCRYPTION) list(APPEND ARROW_PYTHON_SHARED_LINK_LIBS parquet_shared) endif() +if(ARROW_USE_XSIMD) + list(APPEND ARROW_PYTHON_SHARED_PRIVATE_LINK_LIBS xsimd) + list(APPEND ARROW_PYTHON_STATIC_LINK_LIBS xsimd) +endif() set(ARROW_PYTHON_INCLUDES ${NUMPY_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS}) @@ -98,8 +104,10 @@ add_arrow_lib(arrow_python ${ARROW_VERSION_SCRIPT_FLAGS} # Defined in cpp/arrow/CMakeLists.txt SHARED_LINK_LIBS ${ARROW_PYTHON_SHARED_LINK_LIBS} + SHARED_PRIVATE_LINK_LIBS + ${ARROW_PYTHON_SHARED_PRIVATE_LINK_LIBS} STATIC_LINK_LIBS - ${PYTHON_OTHER_LIBS} + ${ARROW_PYTHON_STATIC_LINK_LIBS} EXTRA_INCLUDES "${ARROW_PYTHON_INCLUDES}") @@ -138,7 +146,9 @@ if(ARROW_FLIGHT AND ARROW_BUILD_SHARED) STATIC_LINK_LIBS ${PYTHON_OTHER_LIBS} EXTRA_INCLUDES - "${ARROW_PYTHON_INCLUDES}") + "${ARROW_PYTHON_INCLUDES}" + PRIVATE_INCLUDES + "${Protobuf_INCLUDE_DIRS}") add_dependencies(arrow_python ${ARROW_PYFLIGHT_LIBRARIES}) diff --git a/cpp/src/gandiva/CMakeLists.txt b/cpp/src/gandiva/CMakeLists.txt index 71faf9a38ec..2c8564b918e 100644 --- a/cpp/src/gandiva/CMakeLists.txt +++ b/cpp/src/gandiva/CMakeLists.txt @@ -99,9 +99,21 @@ set(SRC_FILES ${GANDIVA_PRECOMPILED_CC_PATH}) set(GANDIVA_SHARED_PRIVATE_LINK_LIBS arrow_shared LLVM::LLVM_INTERFACE - ${GANDIVA_OPENSSL_LIBS}) - -set(GANDIVA_STATIC_LINK_LIBS arrow_static LLVM::LLVM_INTERFACE ${GANDIVA_OPENSSL_LIBS}) + ${GANDIVA_OPENSSL_LIBS} Boost::headers) +set(GANDIVA_STATIC_LINK_LIBS arrow_static LLVM::LLVM_INTERFACE ${GANDIVA_OPENSSL_LIBS} + Boost::headers) +if(ARROW_WITH_RE2) + list(APPEND GANDIVA_SHARED_PRIVATE_LINK_LIBS re2::re2) + list(APPEND GANDIVA_STATIC_LINK_LIBS re2::re2) +endif() +if(ARROW_WITH_UTF8PROC) + list(APPEND GANDIVA_SHARED_PRIVATE_LINK_LIBS utf8proc::utf8proc) + list(APPEND GANDIVA_STATIC_LINK_LIBS utf8proc::utf8proc) +endif() +if(ARROW_USE_XSIMD) + list(APPEND GANDIVA_SHARED_PRIVATE_LINK_LIBS xsimd) + list(APPEND GANDIVA_STATIC_LINK_LIBS xsimd) +endif() if(ARROW_GANDIVA_STATIC_LIBSTDCPP AND (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX )) diff --git a/cpp/src/parquet/CMakeLists.txt b/cpp/src/parquet/CMakeLists.txt index 4dcda67acf7..28e4f00caca 100644 --- a/cpp/src/parquet/CMakeLists.txt +++ b/cpp/src/parquet/CMakeLists.txt @@ -105,13 +105,14 @@ endfunction() # TODO(wesm): Handling of ABI/SO version if(ARROW_BUILD_STATIC) - set(PARQUET_STATIC_LINK_LIBS arrow_static) - set(ARROW_LIBRARIES_FOR_STATIC_TESTS arrow_testing_static arrow_static) + set(PARQUET_STATIC_LINK_LIBS arrow_static ${ARROW_STATIC_LINK_LIBS}) + set(ARROW_LIBRARIES_FOR_STATIC_TESTS arrow_testing_static arrow_static + ${ARROW_STATIC_LINK_LIBS}) else() set(ARROW_LIBRARIES_FOR_STATIC_TESTS arrow_testing_shared arrow_shared) endif() -set(PARQUET_MIN_TEST_LIBS GTest::gtest_main GTest::gtest) +set(PARQUET_MIN_TEST_LIBS GTest::gtest_main GTest::gtest Boost::headers) if(APPLE) set(PARQUET_MIN_TEST_LIBS ${PARQUET_MIN_TEST_LIBS} ${CMAKE_DL_LIBS}) @@ -218,18 +219,6 @@ if(NOT PARQUET_MINIMAL_DEPENDENCY) # Link publicly with parquet_static (because internal users need to # transitively link all dependencies) set(PARQUET_STATIC_LINK_LIBS ${PARQUET_STATIC_LINK_LIBS} thrift::thrift) - - # Although we don't link parquet_objlib against anything, we need it to depend - # on these libs as we may generate their headers via ExternalProject_Add - if(ARROW_BUILD_SHARED) - set(PARQUET_DEPENDENCIES ${PARQUET_DEPENDENCIES} ${PARQUET_SHARED_LINK_LIBS} - ${PARQUET_SHARED_PRIVATE_LINK_LIBS}) - endif() - - if(ARROW_BUILD_STATIC) - set(PARQUET_DEPENDENCIES ${PARQUET_DEPENDENCIES} ${PARQUET_STATIC_LINK_LIBS}) - endif() - endif(NOT PARQUET_MINIMAL_DEPENDENCY) if(CXX_LINKER_SUPPORTS_VERSION_SCRIPT) @@ -248,8 +237,6 @@ add_arrow_lib(parquet "$<$:parquet/pch.h>" OUTPUTS PARQUET_LIBRARIES - DEPENDENCIES - ${PARQUET_DEPENDENCIES} SHARED_LINK_FLAGS ${PARQUET_SHARED_LINK_FLAGS} SHARED_LINK_LIBS @@ -263,7 +250,7 @@ if(WIN32 AND NOT (ARROW_TEST_LINKAGE STREQUAL "static")) add_library(parquet_test_support STATIC "${ARROW_SOURCE_DIR}/src/generated/parquet_constants.cpp" "${ARROW_SOURCE_DIR}/src/generated/parquet_types.cpp") - add_dependencies(parquet_test_support thrift::thrift) + target_link_libraries(parquet_test_support thrift::thrift) set(PARQUET_SHARED_TEST_LINK_LIBS ${PARQUET_SHARED_TEST_LINK_LIBS} parquet_test_support) set(PARQUET_LIBRARIES ${PARQUET_LIBRARIES} parquet_test_support) endif() diff --git a/cpp/src/plasma/CMakeLists.txt b/cpp/src/plasma/CMakeLists.txt index 46603d6f85c..d78a5ccfdcc 100644 --- a/cpp/src/plasma/CMakeLists.txt +++ b/cpp/src/plasma/CMakeLists.txt @@ -52,8 +52,8 @@ set(PLASMA_STORE_SRCS store.cc thirdparty/ae/ae.c) -set(PLASMA_LINK_LIBS arrow_shared) -set(PLASMA_STATIC_LINK_LIBS arrow_static) +set(PLASMA_LINK_LIBS arrow::flatbuffers arrow_shared) +set(PLASMA_STATIC_LINK_LIBS arrow::flatbuffers arrow_static) if(ARROW_CUDA) list(INSERT PLASMA_LINK_LIBS 0 arrow_cuda_shared) @@ -113,13 +113,13 @@ list(APPEND PLASMA_EXTERNAL_STORE_SOURCES "external_store.cc" "hash_table_store. # We use static libraries for the plasma-store-server executable so that it can # be copied around and used in different locations. add_executable(plasma-store-server ${PLASMA_EXTERNAL_STORE_SOURCES} ${PLASMA_STORE_SRCS}) -target_link_libraries(plasma-store-server ${GFLAGS_LIBRARIES}) if(ARROW_BUILD_STATIC) target_link_libraries(plasma-store-server plasma_static ${PLASMA_STATIC_LINK_LIBS}) else() # Fallback to shared libs in the case that static libraries are not build. target_link_libraries(plasma-store-server plasma_shared ${PLASMA_LINK_LIBS}) endif() +target_link_libraries(plasma-store-server ${GFLAGS_LIBRARIES}) add_dependencies(plasma plasma-store-server) if(ARROW_RPATH_ORIGIN)