From 76f02945f3ef29dc1cb449d90ad70c8a4f4e7e4d Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Fri, 26 Sep 2025 16:53:51 +0800 Subject: [PATCH 1/2] ORC-2013: [C++] Bump to CMake 3.25+ to use FetchContent --- .github/workflows/build_and_test.yml | 6 +- CMakeLists.txt | 3 +- c++/src/CMakeLists.txt | 10 +- c++/src/wrap/orc-proto-wrapper.cc | 1 + c++/src/wrap/orc-proto-wrapper.hh | 1 + c++/test/CMakeLists.txt | 5 - .../{FindGTest.cmake => FindGTestAlt.cmake} | 8 +- .../{FindLZ4.cmake => FindLZ4Alt.cmake} | 10 +- ...ndProtobuf.cmake => FindProtobufAlt.cmake} | 12 +- .../{FindSnappy.cmake => FindSnappyAlt.cmake} | 10 +- .../{FindZLIB.cmake => FindZLIBAlt.cmake} | 10 +- .../{FindZSTD.cmake => FindZSTDAlt.cmake} | 10 +- cmake_modules/ThirdpartyToolchain.cmake | 648 +++++++++++------- tools/test/CMakeLists.txt | 3 - 14 files changed, 424 insertions(+), 313 deletions(-) rename cmake_modules/{FindGTest.cmake => FindGTestAlt.cmake} (95%) rename cmake_modules/{FindLZ4.cmake => FindLZ4Alt.cmake} (94%) rename cmake_modules/{FindProtobuf.cmake => FindProtobufAlt.cmake} (96%) rename cmake_modules/{FindSnappy.cmake => FindSnappyAlt.cmake} (94%) rename cmake_modules/{FindZLIB.cmake => FindZLIBAlt.cmake} (94%) rename cmake_modules/{FindZSTD.cmake => FindZSTDAlt.cmake} (95%) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 5484e7cff3..105552cdbf 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -270,16 +270,12 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v5 - - name: Install dependencies - run: | - brew update - brew install protobuf - name: Test run: | CMAKE_PREFIX_PATH=$(brew --prefix protobuf) mkdir -p build cd build - cmake .. -DBUILD_JAVA=OFF -DPROTOBUF_HOME=${CMAKE_PREFIX_PATH} + cmake .. -DBUILD_JAVA=OFF make package test-out meson: diff --git a/CMakeLists.txt b/CMakeLists.txt index acb2fbe753..c24060095c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. -cmake_minimum_required (VERSION 3.12.0) +cmake_minimum_required (VERSION 3.25.0) if (POLICY CMP0048) cmake_policy(SET CMP0048 NEW) endif () @@ -99,6 +99,7 @@ endif () # Set the package format SET(CPACK_GENERATOR "TGZ") +SET(CPACK_SOURCE_GENERATOR "TGZ") SET(CPACK_PACKAGE_VENDOR "Apache ORC") SET(CPACK_PACKAGE_CONTACT "Apache ORC ") diff --git a/c++/src/CMakeLists.txt b/c++/src/CMakeLists.txt index 8cfc33ddac..2f81bb8023 100644 --- a/c++/src/CMakeLists.txt +++ b/c++/src/CMakeLists.txt @@ -119,8 +119,8 @@ CHECK_CXX_SOURCE_RUNS(" HAS_POST_2038 ) -set(CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIR}) -set(CMAKE_REQUIRED_LIBRARIES orc_zlib) +set(CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIRS}) +set(CMAKE_REQUIRED_LIBRARIES ${ZLIB_LIBRARIES}) CHECK_CXX_SOURCE_COMPILES(" #define Z_PREFIX #include @@ -205,14 +205,14 @@ add_library (orc STATIC ${SOURCE_FILES}) target_link_libraries (orc INTERFACE ${ORC_INSTALL_INTERFACE_TARGETS} - PRIVATE + PUBLIC $ $ - $ + $ $ $ $ - $ + $> ) target_include_directories (orc diff --git a/c++/src/wrap/orc-proto-wrapper.cc b/c++/src/wrap/orc-proto-wrapper.cc index 2c9c927c35..30771507bc 100644 --- a/c++/src/wrap/orc-proto-wrapper.cc +++ b/c++/src/wrap/orc-proto-wrapper.cc @@ -23,6 +23,7 @@ DIAGNOSTIC_IGNORE("-Warray-bounds") DIAGNOSTIC_IGNORE("-Wconversion") DIAGNOSTIC_IGNORE("-Wdeprecated") +DIAGNOSTIC_IGNORE("-Wdeprecated-declarations") DIAGNOSTIC_IGNORE("-Wignored-qualifiers") DIAGNOSTIC_IGNORE("-Wpadded") DIAGNOSTIC_IGNORE("-Wsign-compare") diff --git a/c++/src/wrap/orc-proto-wrapper.hh b/c++/src/wrap/orc-proto-wrapper.hh index 014c7d6570..a1afaccddf 100644 --- a/c++/src/wrap/orc-proto-wrapper.hh +++ b/c++/src/wrap/orc-proto-wrapper.hh @@ -27,6 +27,7 @@ DIAGNOSTIC_PUSH #if defined(__GNUC__) || defined(__clang__) DIAGNOSTIC_IGNORE("-Wconversion") DIAGNOSTIC_IGNORE("-Wdeprecated") +DIAGNOSTIC_IGNORE("-Wdeprecated-declarations") DIAGNOSTIC_IGNORE("-Wsign-conversion") DIAGNOSTIC_IGNORE("-Wunused-parameter") #endif diff --git a/c++/test/CMakeLists.txt b/c++/test/CMakeLists.txt index 374cb45b28..93b066db64 100644 --- a/c++/test/CMakeLists.txt +++ b/c++/test/CMakeLists.txt @@ -62,10 +62,6 @@ add_executable (orc-test target_link_libraries (orc-test orc - orc::lz4 - orc::protobuf - orc::snappy - orc::zlib orc::gtest orc::gmock ) @@ -76,7 +72,6 @@ add_executable (create-test-files target_link_libraries (create-test-files orc - orc::protobuf ) if (TEST_VALGRIND_MEMCHECK) diff --git a/cmake_modules/FindGTest.cmake b/cmake_modules/FindGTestAlt.cmake similarity index 95% rename from cmake_modules/FindGTest.cmake rename to cmake_modules/FindGTestAlt.cmake index ee40378ac2..33e42c8c31 100644 --- a/cmake_modules/FindGTest.cmake +++ b/cmake_modules/FindGTestAlt.cmake @@ -22,7 +22,7 @@ # GTEST_LIBRARY: path to libgtest # GMOCK_STATIC_LIB: is set to gmock.a static library # GTEST_STATIC_LIB: is set to gtest.a static library -# GTEST_FOUND is set if GTEST is found +# GTESTAlt_FOUND is set if GTEST is found if (NOT "${GTEST_HOME}" STREQUAL "") message (STATUS "GTEST_HOME set: ${GTEST_HOME}") @@ -52,14 +52,14 @@ find_library (GTEST_STATIC_LIB NAMES ${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_ PATH_SUFFIXES "lib") if (GTEST_INCLUDE_DIR AND GMOCK_LIBRARY) - set (GTEST_FOUND TRUE) + set (GTESTAlt_FOUND TRUE) set (GTEST_HEADER_NAME gmock/gmock.h) set (GTEST_HEADER ${GTEST_INCLUDE_DIR}/${GTEST_HEADER_NAME}) else () - set (GTEST_FOUND FALSE) + set (GTESTAlt_FOUND FALSE) endif () -if (GTEST_FOUND) +if (GTESTAlt_FOUND) message (STATUS "Found the GTest header: ${GTEST_HEADER}") message (STATUS "Found the GTest library: ${GTEST_LIBRARY}") message (STATUS "Found the GMock library: ${GMOCK_LIBRARY}") diff --git a/cmake_modules/FindLZ4.cmake b/cmake_modules/FindLZ4Alt.cmake similarity index 94% rename from cmake_modules/FindLZ4.cmake rename to cmake_modules/FindLZ4Alt.cmake index 3b9cc7fbd1..dc599836e6 100644 --- a/cmake_modules/FindLZ4.cmake +++ b/cmake_modules/FindLZ4Alt.cmake @@ -20,7 +20,7 @@ # LZ4_INCLUDE_DIR: directory containing headers # LZ4_LIBRARY: path to liblz4 # LZ4_STATIC_LIB: path to lz4.a -# LZ4_FOUND: whether LZ4 has been found +# LZ4Alt_FOUND: whether LZ4 has been found if (NOT LZ4_HOME) if (DEFINED ENV{LZ4_HOME}) @@ -52,14 +52,14 @@ find_library (LZ4_STATIC_LIB NAMES ${CMAKE_STATIC_LIBRARY_PREFIX}${LZ4_LIB_NAME} PATH_SUFFIXES "lib" "lib64") if (LZ4_INCLUDE_DIR AND LZ4_LIBRARY) - set (LZ4_FOUND TRUE) + set (LZ4Alt_FOUND TRUE) set (LZ4_HEADER_NAME lz4.h) set (LZ4_HEADER ${LZ4_INCLUDE_DIR}/${LZ4_HEADER_NAME}) else () - set (LZ4_FOUND FALSE) + set (LZ4Alt_FOUND FALSE) endif () -if (LZ4_FOUND) +if (LZ4Alt_FOUND) message (STATUS "Found the LZ4 header: ${LZ4_HEADER}") message (STATUS "Found the LZ4 library: ${LZ4_LIBRARY}") if (LZ4_STATIC_LIB) @@ -85,7 +85,7 @@ mark_as_advanced ( LZ4_LIBRARY ) -if(LZ4_FOUND AND NOT TARGET LZ4::lz4) +if(LZ4Alt_FOUND AND NOT TARGET LZ4::lz4) add_library(LZ4::lz4 UNKNOWN IMPORTED) set_target_properties(LZ4::lz4 PROPERTIES IMPORTED_LOCATION "${LZ4_LIBRARY}" diff --git a/cmake_modules/FindProtobuf.cmake b/cmake_modules/FindProtobufAlt.cmake similarity index 96% rename from cmake_modules/FindProtobuf.cmake rename to cmake_modules/FindProtobufAlt.cmake index ca91fb5ade..efc004136e 100644 --- a/cmake_modules/FindProtobuf.cmake +++ b/cmake_modules/FindProtobufAlt.cmake @@ -17,7 +17,7 @@ # PROTOBUF_HOME environmental variable is used to check for Protobuf headers and static library -# Protobuf_FOUND is set if Protobuf is found +# ProtobufAlt_FOUND is set if Protobuf is found # PROTOBUF_INCLUDE_DIR: directory containing headers # PROTOBUF_LIBRARY: location of libprotobuf # PROTOBUF_STATIC_LIB: location of protobuf.a @@ -54,7 +54,7 @@ if (NOT DEFINED CMAKE_STATIC_LIBRARY_SUFFIX) endif () find_package (Protobuf CONFIG) -if (Protobuf_FOUND) +if (ProtobufAlt_FOUND) if (TARGET protobuf::libprotobuf) set (PROTOBUF_LIBRARY protobuf::libprotobuf) set (PROTOBUF_STATIC_LIB PROTOBUF_STATIC_LIB-NOTFOUND) @@ -127,14 +127,14 @@ else() endif () if (PROTOBUF_INCLUDE_DIR AND PROTOBUF_LIBRARY AND PROTOC_LIBRARY AND PROTOBUF_EXECUTABLE) - set (Protobuf_FOUND TRUE) + set (ProtobufAlt_FOUND TRUE) set (PROTOBUF_LIB_NAME protobuf) set (PROTOC_LIB_NAME protoc) else () - set (Protobuf_FOUND FALSE) + set (ProtobufAlt_FOUND FALSE) endif () -if (Protobuf_FOUND) +if (ProtobufAlt_FOUND) message (STATUS "Found the Protobuf headers: ${PROTOBUF_INCLUDE_DIR}") message (STATUS "Found the Protobuf library: ${PROTOBUF_LIBRARY}") message (STATUS "Found the Protoc library: ${PROTOC_LIBRARY}") @@ -167,7 +167,7 @@ mark_as_advanced ( PROTOC_LIBRARY ) -if(Protobuf_FOUND AND NOT TARGET protobuf::libprotobuf) +if(ProtobufAlt_FOUND AND NOT TARGET protobuf::libprotobuf) add_library(protobuf::libprotobuf UNKNOWN IMPORTED) set_target_properties(protobuf::libprotobuf PROPERTIES IMPORTED_LOCATION "${PROTOBUF_LIBRARY}" diff --git a/cmake_modules/FindSnappy.cmake b/cmake_modules/FindSnappyAlt.cmake similarity index 94% rename from cmake_modules/FindSnappy.cmake rename to cmake_modules/FindSnappyAlt.cmake index 1ad9914542..e9a5eb7c82 100644 --- a/cmake_modules/FindSnappy.cmake +++ b/cmake_modules/FindSnappyAlt.cmake @@ -20,7 +20,7 @@ # SNAPPY_INCLUDE_DIR: directory containing headers # SNAPPY_LIBRARY: path to libsnappy # SNAPPY_STATIC_LIB: path to libsnappy.a -# Snappy_FOUND: whether snappy has been found +# SnappyAlt_FOUND: whether snappy has been found if (NOT SNAPPY_HOME) if (DEFINED ENV{SNAPPY_HOME}) @@ -56,14 +56,14 @@ find_library (SNAPPY_STATIC_LIB NAMES ${CMAKE_STATIC_LIBRARY_PREFIX}${SNAPPY_LIB PATH_SUFFIXES "lib" "lib64") if (SNAPPY_INCLUDE_DIR AND SNAPPY_LIBRARY) - set (Snappy_FOUND TRUE) + set (SnappyAlt_FOUND TRUE) set (SNAPPY_HEADER_NAME snappy.h) set (SNAPPY_HEADER ${SNAPPY_INCLUDE_DIR}/${SNAPPY_HEADER_NAME}) else () - set (Snappy_FOUND FALSE) + set (SnappyAlt_FOUND FALSE) endif () -if (Snappy_FOUND) +if (SnappyAlt_FOUND) message (STATUS "Found the Snappy header: ${SNAPPY_HEADER}") message (STATUS "Found the Snappy library: ${SNAPPY_LIBRARY}") if (SNAPPY_STATIC_LIB) @@ -89,7 +89,7 @@ mark_as_advanced ( SNAPPY_LIBRARY ) -if(Snappy_FOUND AND NOT TARGET Snappy::snappy) +if(SnappyAlt_FOUND AND NOT TARGET Snappy::snappy) add_library(Snappy::snappy UNKNOWN IMPORTED) set_target_properties(Snappy::snappy PROPERTIES IMPORTED_LOCATION "${SNAPPY_LIBRARY}" diff --git a/cmake_modules/FindZLIB.cmake b/cmake_modules/FindZLIBAlt.cmake similarity index 94% rename from cmake_modules/FindZLIB.cmake rename to cmake_modules/FindZLIBAlt.cmake index 374814a7f9..9623271287 100644 --- a/cmake_modules/FindZLIB.cmake +++ b/cmake_modules/FindZLIBAlt.cmake @@ -20,7 +20,7 @@ # ZLIB_INCLUDE_DIR: directory containing headers # ZLIB_LIBRARY: path to libz/libzlib # ZLIB_STATIC_LIB: path to zlib.a -# ZLIB_FOUND: whether ZLIB has been found +# ZLIBAlt_FOUND: whether ZLIB has been found if (NOT ZLIB_HOME) if (DEFINED ENV{ZLIB_HOME}) @@ -56,14 +56,14 @@ find_library (ZLIB_STATIC_LIB NAMES ${CMAKE_STATIC_LIBRARY_PREFIX}${ZLIB_STATIC_ PATH_SUFFIXES "lib") if (ZLIB_INCLUDE_DIR AND ZLIB_LIBRARY) - set (ZLIB_FOUND TRUE) + set (ZLIBAlt_FOUND TRUE) set (ZLIB_HEADER_NAME zlib.h) set (ZLIB_HEADER ${ZLIB_INCLUDE_DIR}/${ZLIB_HEADER_NAME}) else () - set (ZLIB_FOUND FALSE) + set (ZLIBAlt_FOUND FALSE) endif () -if (ZLIB_FOUND) +if (ZLIBAlt_FOUND) message (STATUS "Found the ZLIB header: ${ZLIB_HEADER}") message (STATUS "Found the ZLIB library: ${ZLIB_LIBRARY}") if (ZLIB_STATIC_LIB) @@ -89,7 +89,7 @@ mark_as_advanced ( ZLIB_LIBRARY ) -if(ZLIB_FOUND AND NOT TARGET ZLIB::ZLIB) +if(ZLIBAlt_FOUND AND NOT TARGET ZLIB::ZLIB) add_library(ZLIB::ZLIB UNKNOWN IMPORTED) set_target_properties(ZLIB::ZLIB PROPERTIES IMPORTED_LOCATION "${ZLIB_LIBRARY}" diff --git a/cmake_modules/FindZSTD.cmake b/cmake_modules/FindZSTDAlt.cmake similarity index 95% rename from cmake_modules/FindZSTD.cmake rename to cmake_modules/FindZSTDAlt.cmake index 581719453c..402f70514d 100644 --- a/cmake_modules/FindZSTD.cmake +++ b/cmake_modules/FindZSTDAlt.cmake @@ -20,7 +20,7 @@ # ZSTD_INCLUDE_DIR: directory containing headers # ZSTD_LIBRARY: path to libzstd # ZSTD_STATIC_LIB: path to libzstd.a -# ZSTD_FOUND: whether zstd has been found +# ZSTDAlt_FOUND: whether zstd has been found if (NOT ZSTD_HOME) if (DEFINED ENV{ZSTD_HOME}) @@ -52,14 +52,14 @@ find_library (ZSTD_STATIC_LIB NAMES ${CMAKE_STATIC_LIBRARY_PREFIX}zstd${CMAKE_ST PATH_SUFFIXES "lib") if (ZSTD_INCLUDE_DIR AND ZSTD_LIBRARY) - set (ZSTD_FOUND TRUE) + set (ZSTDAlt_FOUND TRUE) set (ZSTD_HEADER_NAME zstd.h) set (ZSTD_HEADER ${ZSTD_INCLUDE_DIR}/${ZSTD_HEADER_NAME}) else () - set (ZSTD_FOUND FALSE) + set (ZSTDAlt_FOUND FALSE) endif () -if (ZSTD_FOUND) +if (ZSTDAlt_FOUND) message (STATUS "Found the zstd header: ${ZSTD_HEADER}") message (STATUS "Found the zstd library: ${ZSTD_LIBRARY}") if (ZSTD_STATIC_LIB) @@ -85,7 +85,7 @@ mark_as_advanced ( ZSTD_LIBRARY ) -if(ZSTD_FOUND) +if(ZSTDAlt_FOUND) if(NOT TARGET zstd::libzstd_static AND ZSTD_STATIC_LIB) add_library(zstd::libzstd_static STATIC IMPORTED) set_target_properties(zstd::libzstd_static diff --git a/cmake_modules/ThirdpartyToolchain.cmake b/cmake_modules/ThirdpartyToolchain.cmake index 9103ace122..b05d2d284f 100644 --- a/cmake_modules/ThirdpartyToolchain.cmake +++ b/cmake_modules/ThirdpartyToolchain.cmake @@ -16,6 +16,7 @@ # under the License. INCLUDE(ExternalProject) +INCLUDE(FetchContent) set(ORC_VENDOR_DEPENDENCIES) set(ORC_SYSTEM_DEPENDENCIES) @@ -137,6 +138,33 @@ function(orc_provide_find_module PACKAGE_NAME) orc_provide_cmake_module("Find${PACKAGE_NAME}") endfunction() +# ---------------------------------------------------------------------- +# FetchContent + +include(FetchContent) +set(FC_DECLARE_COMMON_OPTIONS) +if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28) + list(APPEND FC_DECLARE_COMMON_OPTIONS EXCLUDE_FROM_ALL TRUE) +endif() + +macro(prepare_fetchcontent) + set(BUILD_SHARED_LIBS OFF) + set(BUILD_STATIC_LIBS ON) + set(CMAKE_COMPILE_WARNING_AS_ERROR OFF) + set(CMAKE_WARN_DEPRECATED OFF) + set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY ON) + set(CMAKE_POLICY_VERSION_MINIMUM 3.25) + if(BUILD_POSITION_INDEPENDENT_LIB) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + endif() + # Use "NEW" for CMP0077 by default. + # + # https://cmake.org/cmake/help/latest/policy/CMP0077.html + # + # option() honors normal variables. + set(CMAKE_POLICY_DEFAULT_CMP0077 NEW CACHE STRING "") +endmacro() + # ---------------------------------------------------------------------- # ORC Format if(DEFINED ENV{ORC_FORMAT_URL}) @@ -155,6 +183,111 @@ ExternalProject_Add (orc-format_ep TEST_COMMAND "" ) +# ---------------------------------------------------------------------- +# Protobuf +# +# XXX: It must be processed before ZLIB, otherwise ZLIB_LIBRARIES will interfere with building protobuf. + +if (ORC_PACKAGE_KIND STREQUAL "conan") + find_package (Protobuf REQUIRED CONFIG) + add_library (orc_protobuf INTERFACE) + target_link_libraries(orc_protobuf INTERFACE protobuf::protobuf) + list (APPEND ORC_SYSTEM_DEPENDENCIES Protobuf) + list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") +elseif (ORC_PACKAGE_KIND STREQUAL "vcpkg") + find_package(Protobuf CONFIG REQUIRED) + add_library (orc_protobuf INTERFACE IMPORTED) + target_link_libraries(orc_protobuf INTERFACE protobuf::libprotobuf) + list (APPEND ORC_SYSTEM_DEPENDENCIES Protobuf) + list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + set (PROTOBUF_EXECUTABLE protobuf::protoc) +elseif (NOT "${PROTOBUF_HOME}" STREQUAL "") + find_package (ProtobufAlt REQUIRED) + + if (ORC_PREFER_STATIC_PROTOBUF AND PROTOBUF_STATIC_LIB) + orc_add_resolved_library (orc_protobuf ${PROTOBUF_STATIC_LIB} ${PROTOBUF_INCLUDE_DIR}) + else () + orc_add_resolved_library (orc_protobuf ${PROTOBUF_LIBRARY} ${PROTOBUF_INCLUDE_DIR}) + endif () + + if (ORC_PREFER_STATIC_PROTOBUF AND PROTOC_STATIC_LIB) + orc_add_resolved_library (orc_protoc ${PROTOC_STATIC_LIB} ${PROTOBUF_INCLUDE_DIR}) + else () + orc_add_resolved_library (orc_protoc ${PROTOC_LIBRARY} ${PROTOBUF_INCLUDE_DIR}) + endif () + + list (APPEND ORC_SYSTEM_DEPENDENCIES ProtobufAlt) + list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + orc_provide_find_module (ProtobufAlt) +else () + prepare_fetchcontent() + + set(protobuf_INSTALL OFF) + set(protobuf_BUILD_TESTS OFF) + set(protobuf_BUILD_PROTOBUF_BINARIES ON) + set(protobuf_BUILD_PROTOC_BINARIES ON) + set(protobuf_WITH_ZLIB OFF) + set(protobuf_BUILD_SHARED_LIBS OFF) + + # Set compiler flags to suppress warnings before fetching protobuf + set(CMAKE_CXX_FLAGS_BACKUP "${CMAKE_CXX_FLAGS}") + set(CMAKE_C_FLAGS_BACKUP "${CMAKE_C_FLAGS}") + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations") + endif() + + fetchcontent_declare(protobuf + URL "https://github.com/google/protobuf/archive/v${PROTOBUF_VERSION}.tar.gz" + SOURCE_SUBDIR "cmake" + FIND_PACKAGE_ARGS + NAMES Protobuf + CONFIG + ) + fetchcontent_makeavailable(protobuf) + + # Restore original compiler flags after protobuf configuration + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_BACKUP}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS_BACKUP}") + + if(protobuf_SOURCE_DIR) + message(STATUS "Using vendored protobuf") + + if(NOT TARGET protobuf::libprotobuf) + add_library(protobuf::libprotobuf ALIAS libprotobuf) + endif() + if(NOT TARGET protobuf::protoc) + add_executable(protobuf::protoc ALIAS protoc) + endif() + + if(BUILD_POSITION_INDEPENDENT_LIB) + set_target_properties(libprotobuf PROPERTIES POSITION_INDEPENDENT_CODE ON) + set_target_properties(protoc PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() + + if(INSTALL_VENDORED_LIBS) + set_target_properties(libprotobuf PROPERTIES OUTPUT_NAME "orc_vendored_protobuf") + install(TARGETS libprotobuf + EXPORT orc_targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") + endif() + + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + else() + message(STATUS "Using system protobuf") + list(APPEND ORC_SYSTEM_DEPENDENCIES Protobuf) + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + endif() + + add_library(orc_protobuf INTERFACE IMPORTED) + target_link_libraries(orc_protobuf INTERFACE protobuf::libprotobuf) + set(PROTOBUF_EXECUTABLE protobuf::protoc) +endif () + +add_library (orc::protobuf ALIAS orc_protobuf) + # ---------------------------------------------------------------------- # Snappy if (ORC_PACKAGE_KIND STREQUAL "conan") @@ -170,41 +303,68 @@ elseif (ORC_PACKAGE_KIND STREQUAL "vcpkg") list (APPEND ORC_SYSTEM_DEPENDENCIES Snappy) list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") elseif (NOT "${SNAPPY_HOME}" STREQUAL "") - find_package (Snappy REQUIRED) + find_package (SnappyAlt REQUIRED) if (ORC_PREFER_STATIC_SNAPPY AND SNAPPY_STATIC_LIB) orc_add_resolved_library (orc_snappy ${SNAPPY_STATIC_LIB} ${SNAPPY_INCLUDE_DIR}) else () orc_add_resolved_library (orc_snappy ${SNAPPY_LIBRARY} ${SNAPPY_INCLUDE_DIR}) endif () - list (APPEND ORC_SYSTEM_DEPENDENCIES Snappy) + list (APPEND ORC_SYSTEM_DEPENDENCIES SnappyAlt) list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - orc_provide_find_module (Snappy) + orc_provide_find_module (SnappyAlt) else () - set(SNAPPY_HOME "${THIRDPARTY_DIR}/snappy_ep-install") - set(SNAPPY_INCLUDE_DIR "${SNAPPY_HOME}/include") - set(SNAPPY_STATIC_LIB_NAME "${CMAKE_STATIC_LIBRARY_PREFIX}snappy${CMAKE_STATIC_LIBRARY_SUFFIX}") - set(SNAPPY_STATIC_LIB "${SNAPPY_HOME}/lib/${SNAPPY_STATIC_LIB_NAME}") - set(SNAPPY_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${SNAPPY_HOME} - -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_LIBDIR=lib - -DSNAPPY_BUILD_BENCHMARKS=OFF) - - if (BUILD_POSITION_INDEPENDENT_LIB) - set(SNAPPY_CMAKE_ARGS ${SNAPPY_CMAKE_ARGS} -DCMAKE_POSITION_INDEPENDENT_CODE=ON) - endif () + prepare_fetchcontent() + + set(SNAPPY_BUILD_TESTS OFF) + set(SNAPPY_BUILD_BENCHMARKS OFF) + set(SNAPPY_INSTALL OFF) - ExternalProject_Add (snappy_ep + fetchcontent_declare(Snappy URL "https://github.com/google/snappy/archive/${SNAPPY_VERSION}.tar.gz" - CMAKE_ARGS ${SNAPPY_CMAKE_ARGS} -DSNAPPY_BUILD_TESTS=OFF - ${THIRDPARTY_LOG_OPTIONS} - BUILD_BYPRODUCTS "${SNAPPY_STATIC_LIB}") + FIND_PACKAGE_ARGS + NAMES Snappy + CONFIG + ) + fetchcontent_makeavailable(Snappy) + + if(snappy_SOURCE_DIR) + message(STATUS "Using vendored snappy") + if(NOT TARGET Snappy::snappy) + add_library(Snappy::snappy INTERFACE IMPORTED) + target_link_libraries(Snappy::snappy INTERFACE snappy) + target_include_directories(Snappy::snappy INTERFACE ${snappy_SOURCE_DIR} ${snappy_BINARY_DIR}) + endif() - orc_add_built_library (snappy_ep orc_snappy ${SNAPPY_STATIC_LIB} ${SNAPPY_INCLUDE_DIR}) + if(BUILD_POSITION_INDEPENDENT_LIB) + set_target_properties(snappy POSITION_INDEPENDENT_CODE ON) + endif() + + if(INSTALL_VENDORED_LIBS) + set_target_properties(snappy PROPERTIES OUTPUT_NAME "orc_vendored_snappy") + + install(FILES ${snappy_SOURCE_DIR}/snappy-c.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + install(FILES ${snappy_SOURCE_DIR}/snappy-sinksource.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + install(FILES ${snappy_SOURCE_DIR}/snappy.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + install(FILES ${snappy_BINARY_DIR}/snappy-stubs-public.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + install(TARGETS snappy + EXPORT orc_targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") + endif() - list (APPEND ORC_VENDOR_DEPENDENCIES "orc::vendored_snappy|${SNAPPY_STATIC_LIB_NAME}") - list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + else() + message(STATUS "Using system snappy") + list(APPEND ORC_SYSTEM_DEPENDENCIES Snappy) + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + endif() + + add_library(orc_snappy INTERFACE IMPORTED) + target_link_libraries(orc_snappy INTERFACE Snappy::snappy) endif () -add_library (orc::snappy ALIAS orc_snappy) +add_library (orc::Snappy ALIAS orc_snappy) # ---------------------------------------------------------------------- # ZLIB @@ -223,48 +383,74 @@ elseif (ORC_PACKAGE_KIND STREQUAL "vcpkg") list (APPEND ORC_SYSTEM_DEPENDENCIES ZLIB) list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") elseif (NOT "${ZLIB_HOME}" STREQUAL "") - find_package (ZLIB REQUIRED) + find_package (ZLIBAlt REQUIRED) if (ORC_PREFER_STATIC_ZLIB AND ZLIB_STATIC_LIB) orc_add_resolved_library (orc_zlib ${ZLIB_STATIC_LIB} ${ZLIB_INCLUDE_DIR}) else () orc_add_resolved_library (orc_zlib ${ZLIB_LIBRARY} ${ZLIB_INCLUDE_DIR}) endif () - list (APPEND ORC_SYSTEM_DEPENDENCIES ZLIB) + list (APPEND ORC_SYSTEM_DEPENDENCIES ZLIBAlt) list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - orc_provide_find_module (ZLIB) + orc_provide_find_module (ZLIBAlt) else () - set(ZLIB_PREFIX "${THIRDPARTY_DIR}/zlib_ep-install") - set(ZLIB_INCLUDE_DIR "${ZLIB_PREFIX}/include") - if (MSVC) - set(ZLIB_STATIC_LIB_NAME zlibstatic) - if (${UPPERCASE_BUILD_TYPE} STREQUAL "DEBUG") - set(ZLIB_STATIC_LIB_NAME ${ZLIB_STATIC_LIB_NAME}d) - endif () - else () - set(ZLIB_STATIC_LIB_NAME z) - endif () - set(ZLIB_STATIC_LIB_NAME "${CMAKE_STATIC_LIBRARY_PREFIX}${ZLIB_STATIC_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}") - set(ZLIB_STATIC_LIB "${ZLIB_PREFIX}/lib/${ZLIB_STATIC_LIB_NAME}") - set(ZLIB_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${ZLIB_PREFIX} - -DBUILD_SHARED_LIBS=OFF) + prepare_fetchcontent() + + set(ZLIB_BUILD_EXAMPLES OFF) + set(ZLIB_BUILD_TESTING OFF) + set(ZLIB_BUILD_STATIC ON) + set(ZLIB_BUILD_SHARED OFF) + set(ZLIB_INSTALL OFF) + set(ZLIB_PREFIX OFF) + + fetchcontent_declare(zlib + # URL "https://zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz" + # See https://github.com/madler/zlib/issues/937 + GIT_REPOSITORY "https://github.com/madler/zlib.git" + GIT_TAG 5a82f71ed1dfc0bec044d9702463dbdf84ea3b71 + FIND_PACKAGE_ARGS + NAMES ZLIB + CONFIG + ) + fetchcontent_makeavailable(zlib) + + if(zlib_SOURCE_DIR) + message(STATUS "Using vendored zlib") + if(NOT TARGET ZLIB::ZLIB) + add_library(ZLIB::ZLIB ALIAS zlibstatic) + endif() - if (BUILD_POSITION_INDEPENDENT_LIB) - set(ZLIB_CMAKE_ARGS ${ZLIB_CMAKE_ARGS} -DCMAKE_POSITION_INDEPENDENT_CODE=ON) - endif () + if(BUILD_POSITION_INDEPENDENT_LIB) + set_target_properties(zlibstatic POSITION_INDEPENDENT_CODE ON) + endif() - ExternalProject_Add (zlib_ep - URL "https://zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz" - CMAKE_ARGS ${ZLIB_CMAKE_ARGS} - ${THIRDPARTY_LOG_OPTIONS} - BUILD_BYPRODUCTS "${ZLIB_STATIC_LIB}") + if(INSTALL_VENDORED_LIBS) + set_target_properties(zlibstatic PROPERTIES OUTPUT_NAME "orc_vendored_zlib") + install(TARGETS zlibstatic + EXPORT orc_targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") + endif() - orc_add_built_library (zlib_ep orc_zlib ${ZLIB_STATIC_LIB} ${ZLIB_INCLUDE_DIR}) + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + set(ZLIB_LIBRARIES "zlibstatic") + set(ZLIB_INCLUDE_DIRS "${zlib_SOURCE_DIR}") + else() + message(STATUS "Using system zlib") + # FindZLIB guarantees that ZLIB::ZLIB target exists if found + # See https://cmake.org/cmake/help/latest/module/FindZLIB.html#imported-targets + if(NOT TARGET ZLIB::ZLIB) + message(FATAL_ERROR "Using system zlib, but ZLIB::ZLIB not found") + endif() + list(APPEND ORC_SYSTEM_DEPENDENCIES ZLIB) + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + endif() - list (APPEND ORC_VENDOR_DEPENDENCIES "orc::vendored_zlib|${ZLIB_STATIC_LIB_NAME}") - list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") -endif () + add_library(orc_zlib INTERFACE IMPORTED) + target_link_libraries(orc_zlib INTERFACE ZLIB::ZLIB) +endif() -add_library (orc::zlib ALIAS orc_zlib) +add_library(orc::zlib ALIAS orc_zlib) # ---------------------------------------------------------------------- # Zstd @@ -285,7 +471,7 @@ elseif (ORC_PACKAGE_KIND STREQUAL "vcpkg") list(APPEND ORC_SYSTEM_DEPENDENCIES zstd) list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$,zstd::libzstd_shared,zstd::libzstd_static>>") elseif (NOT "${ZSTD_HOME}" STREQUAL "") - find_package (ZSTD REQUIRED) + find_package (ZSTDAlt REQUIRED) if (ORC_PREFER_STATIC_ZSTD AND ZSTD_STATIC_LIB) orc_add_resolved_library (orc_zstd ${ZSTD_STATIC_LIB} ${ZSTD_INCLUDE_DIR}) list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") @@ -293,40 +479,58 @@ elseif (NOT "${ZSTD_HOME}" STREQUAL "") orc_add_resolved_library (orc_zstd ${ZSTD_LIBRARY} ${ZSTD_INCLUDE_DIR}) list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$,zstd::libzstd_shared,zstd::libzstd_static>>") endif () - list (APPEND ORC_SYSTEM_DEPENDENCIES ZSTD) - orc_provide_find_module (ZSTD) + list (APPEND ORC_SYSTEM_DEPENDENCIES ZSTDAlt) + orc_provide_find_module (ZSTDAlt) else () - set(ZSTD_HOME "${THIRDPARTY_DIR}/zstd_ep-install") - set(ZSTD_INCLUDE_DIR "${ZSTD_HOME}/include") - if (MSVC) - set(ZSTD_STATIC_LIB_NAME zstd_static) - if (${UPPERCASE_BUILD_TYPE} STREQUAL "DEBUG") - set(ZSTD_STATIC_LIB_NAME ${ZSTD_STATIC_LIB_NAME}) - endif () - else () - set(ZSTD_STATIC_LIB_NAME zstd) - endif () - set(ZSTD_STATIC_LIB_NAME "${CMAKE_STATIC_LIBRARY_PREFIX}${ZSTD_STATIC_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}") - set(ZSTD_STATIC_LIB "${ZSTD_HOME}/lib/${ZSTD_STATIC_LIB_NAME}") - set(ZSTD_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${ZSTD_HOME} - -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_LIBDIR=lib) - - if (BUILD_POSITION_INDEPENDENT_LIB) - set(ZSTD_CMAKE_ARGS ${ZSTD_CMAKE_ARGS} -DCMAKE_POSITION_INDEPENDENT_CODE=ON) - endif () - - set(ZSTD_CONFIGURE SOURCE_SUBDIR "build/cmake" CMAKE_ARGS ${ZSTD_CMAKE_ARGS}) + prepare_fetchcontent() + + set(ZSTD_BUILD_TESTING OFF) + set(ZSTD_BUILD_PROGRAMS OFF) + set(ZSTD_BUILD_STATIC ON) + set(ZSTD_BUILD_SHARED OFF) + set(ZSTD_BUILD_CONTRIB OFF) + + fetchcontent_declare(zstd + URL "https://github.com/facebook/zstd/archive/v${ZSTD_VERSION}.tar.gz" + SOURCE_SUBDIR "build/cmake" + FIND_PACKAGE_ARGS + NAMES zstd + CONFIG + ) + fetchcontent_makeavailable(zstd) + + if(zstd_SOURCE_DIR) + message(STATUS "Using vendored zstd") + if(NOT TARGET zstd::libzstd_static) + add_library(zstd::libzstd_static ALIAS libzstd_static) + endif() + + if(BUILD_POSITION_INDEPENDENT_LIB) + set_target_properties(libzstd_static POSITION_INDEPENDENT_CODE ON) + endif() - ExternalProject_Add(zstd_ep - URL "https://github.com/facebook/zstd/archive/v${ZSTD_VERSION}.tar.gz" - ${ZSTD_CONFIGURE} - ${THIRDPARTY_LOG_OPTIONS} - BUILD_BYPRODUCTS ${ZSTD_STATIC_LIB}) + if(INSTALL_VENDORED_LIBS) + set_target_properties(libzstd_static PROPERTIES OUTPUT_NAME "orc_vendored_zstd") + install(TARGETS libzstd_static + EXPORT orc_targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") + endif() - orc_add_built_library (zstd_ep orc_zstd ${ZSTD_STATIC_LIB} ${ZSTD_INCLUDE_DIR}) + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + else() + message(STATUS "Using system zstd") + list(APPEND ORC_SYSTEM_DEPENDENCIES zstd) + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$>") + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$>") + endif() - list (APPEND ORC_VENDOR_DEPENDENCIES "orc::vendored_zstd|${ZSTD_STATIC_LIB_NAME}") - list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + add_library(orc_zstd INTERFACE IMPORTED) + target_link_libraries(orc_zstd INTERFACE + $ + $ + ) endif () add_library (orc::zstd ALIAS orc_zstd) @@ -349,40 +553,61 @@ elseif (ORC_PACKAGE_KIND STREQUAL "vcpkg") list (APPEND ORC_SYSTEM_DEPENDENCIES lz4) list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") elseif (NOT "${LZ4_HOME}" STREQUAL "") - find_package (LZ4 REQUIRED) + find_package (LZ4Alt REQUIRED) if (ORC_PREFER_STATIC_LZ4 AND LZ4_STATIC_LIB) orc_add_resolved_library (orc_lz4 ${LZ4_STATIC_LIB} ${LZ4_INCLUDE_DIR}) else () orc_add_resolved_library (orc_lz4 ${LZ4_LIBRARY} ${LZ4_INCLUDE_DIR}) endif () - list (APPEND ORC_SYSTEM_DEPENDENCIES LZ4) + list (APPEND ORC_SYSTEM_DEPENDENCIES LZ4Alt) list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - orc_provide_find_module (LZ4) + orc_provide_find_module (LZ4Alt) else () - set(LZ4_PREFIX "${THIRDPARTY_DIR}/lz4_ep-install") - set(LZ4_INCLUDE_DIR "${LZ4_PREFIX}/include") - set(LZ4_STATIC_LIB_NAME "${CMAKE_STATIC_LIBRARY_PREFIX}lz4${CMAKE_STATIC_LIBRARY_SUFFIX}") - set(LZ4_STATIC_LIB "${LZ4_PREFIX}/lib/${LZ4_STATIC_LIB_NAME}") - set(LZ4_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LZ4_PREFIX} - -DCMAKE_INSTALL_LIBDIR=lib - -DBUILD_SHARED_LIBS=OFF) - - if (BUILD_POSITION_INDEPENDENT_LIB) - set(LZ4_CMAKE_ARGS ${LZ4_CMAKE_ARGS} -DCMAKE_POSITION_INDEPENDENT_CODE=ON) - endif () + prepare_fetchcontent() - set(LZ4_CONFIGURE SOURCE_SUBDIR "build/cmake" CMAKE_ARGS ${LZ4_CMAKE_ARGS}) + set(LZ4_BUILD_CLI OFF) - ExternalProject_Add(lz4_ep + fetchcontent_declare(lz4 URL "https://github.com/lz4/lz4/archive/v${LZ4_VERSION}.tar.gz" - ${LZ4_CONFIGURE} - ${THIRDPARTY_LOG_OPTIONS} - BUILD_BYPRODUCTS ${LZ4_STATIC_LIB}) + SOURCE_SUBDIR "build/cmake" + FIND_PACKAGE_ARGS + NAMES lz4 + CONFIG + ) + fetchcontent_makeavailable(lz4) + + if(lz4_SOURCE_DIR) + message(STATUS "Using vendored LZ4") + if(NOT TARGET LZ4::lz4_static) + add_library(LZ4::lz4_static ALIAS lz4_static) + endif() - orc_add_built_library (lz4_ep orc_lz4 ${LZ4_STATIC_LIB} ${LZ4_INCLUDE_DIR}) + if(BUILD_POSITION_INDEPENDENT_LIB) + set_target_properties(lz4_static POSITION_INDEPENDENT_CODE ON) + endif() + + if(INSTALL_VENDORED_LIBS) + set_target_properties(lz4_static PROPERTIES OUTPUT_NAME "orc_vendored_lz4") + install(TARGETS lz4_static + EXPORT orc_targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") + endif() - list (APPEND ORC_VENDOR_DEPENDENCIES "orc::vendored_lz4|${LZ4_STATIC_LIB_NAME}") - list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + else() + message(STATUS "Using system LZ4") + list(APPEND ORC_SYSTEM_DEPENDENCIES lz4) + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$>") + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$>") + endif() + + add_library(orc_lz4 INTERFACE IMPORTED) + target_link_libraries(orc_lz4 INTERFACE + $ + $ + ) endif () add_library (orc::lz4 ALIAS orc_lz4) @@ -426,183 +651,78 @@ endif () # GoogleTest (gtest now includes gmock) if (BUILD_CPP_TESTS) - if (NOT "${GTEST_HOME}" STREQUAL "") - find_package (GTest REQUIRED) - set (GTEST_VENDORED FALSE) - else () - set(GTEST_PREFIX "${THIRDPARTY_DIR}/googletest_ep-install") - set(GTEST_INCLUDE_DIR "${GTEST_PREFIX}/include") - set(GMOCK_STATIC_LIB "${GTEST_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gmock${CMAKE_STATIC_LIBRARY_SUFFIX}") - set(GTEST_STATIC_LIB "${GTEST_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}") - set(GTEST_SRC_URL "https://github.com/google/googletest/archive/refs/tags/v${GTEST_VERSION}.tar.gz") - if(APPLE) - set(GTEST_CMAKE_CXX_FLAGS " -DGTEST_USE_OWN_TR1_TUPLE=1 -Wno-unused-value -Wno-ignored-attributes") - else() - set(GTEST_CMAKE_CXX_FLAGS "") - endif() - - set(GTEST_CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX=${GTEST_PREFIX} - -DCMAKE_INSTALL_LIBDIR=lib - -Dgtest_force_shared_crt=ON - -DCMAKE_CXX_FLAGS=${GTEST_CMAKE_CXX_FLAGS}) - - if (BUILD_POSITION_INDEPENDENT_LIB) - set(GTEST_CMAKE_ARGS ${GTEST_CMAKE_ARGS} -DCMAKE_POSITION_INDEPENDENT_CODE=ON) - endif () - - ExternalProject_Add(googletest_ep - BUILD_IN_SOURCE 1 - URL ${GTEST_SRC_URL} - ${THIRDPARTY_LOG_OPTIONS} - CMAKE_ARGS ${GTEST_CMAKE_ARGS} - BUILD_BYPRODUCTS "${GMOCK_STATIC_LIB}" "${GTEST_STATIC_LIB}") - - set(GMOCK_LIBRARY ${GMOCK_STATIC_LIB}) - set(GTEST_LIBRARY ${GTEST_STATIC_LIB}) - set(GTEST_VENDORED TRUE) - endif () - - # This is a bit special cased because gmock requires gtest and some - # distributions statically link gtest inside the gmock shared lib add_library (orc_gmock INTERFACE) - add_library (orc::gmock ALIAS orc_gmock) add_library (orc_gtest INTERFACE) + add_library (orc::gmock ALIAS orc_gmock) add_library (orc::gtest ALIAS orc_gtest) - if (ORC_PREFER_STATIC_GMOCK AND GMOCK_STATIC_LIB) - target_link_libraries (orc_gmock INTERFACE ${GMOCK_STATIC_LIB}) - target_link_libraries (orc_gtest INTERFACE ${GTEST_STATIC_LIB}) - else () - target_link_libraries (orc_gmock INTERFACE ${GMOCK_LIBRARY}) - target_link_libraries (orc_gtest INTERFACE ${GTEST_LIBRARY}) - endif () - target_include_directories (orc_gmock SYSTEM INTERFACE ${GTEST_INCLUDE_DIR}) - target_include_directories (orc_gtest SYSTEM INTERFACE ${GTEST_INCLUDE_DIR}) - - if (GTEST_VENDORED) - add_dependencies (orc_gmock googletest_ep) - add_dependencies (orc_gtest googletest_ep) - endif () - if (NOT APPLE AND NOT MSVC) - target_link_libraries (orc_gmock INTERFACE Threads::Threads) - target_link_libraries (orc_gtest INTERFACE Threads::Threads) - endif () -endif () - -# ---------------------------------------------------------------------- -# Protobuf + if (NOT "${GTEST_HOME}" STREQUAL "") + find_package (GTestAlt REQUIRED) -if (ORC_PACKAGE_KIND STREQUAL "conan") - find_package (Protobuf REQUIRED CONFIG) - add_library (orc_protobuf INTERFACE) - target_link_libraries(orc_protobuf INTERFACE protobuf::protobuf) - list (APPEND ORC_SYSTEM_DEPENDENCIES Protobuf) - list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") -elseif (ORC_PACKAGE_KIND STREQUAL "vcpkg") - find_package(Protobuf CONFIG REQUIRED) - add_library (orc_protobuf INTERFACE IMPORTED) - target_link_libraries(orc_protobuf INTERFACE protobuf::libprotobuf) - list (APPEND ORC_SYSTEM_DEPENDENCIES Protobuf) - list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - set (PROTOBUF_EXECUTABLE protobuf::protoc) -elseif (NOT "${PROTOBUF_HOME}" STREQUAL "") - find_package (Protobuf REQUIRED) + # This is a bit special cased because gmock requires gtest and some + # distributions statically link gtest inside the gmock shared lib + if (ORC_PREFER_STATIC_GMOCK AND GMOCK_STATIC_LIB) + target_link_libraries (orc_gmock INTERFACE ${GMOCK_STATIC_LIB}) + target_link_libraries (orc_gtest INTERFACE ${GTEST_STATIC_LIB}) + else () + target_link_libraries (orc_gmock INTERFACE ${GMOCK_LIBRARY}) + target_link_libraries (orc_gtest INTERFACE ${GTEST_LIBRARY}) + endif () - if (ORC_PREFER_STATIC_PROTOBUF AND PROTOBUF_STATIC_LIB) - orc_add_resolved_library (orc_protobuf ${PROTOBUF_STATIC_LIB} ${PROTOBUF_INCLUDE_DIR}) - else () - orc_add_resolved_library (orc_protobuf ${PROTOBUF_LIBRARY} ${PROTOBUF_INCLUDE_DIR}) - endif () + target_include_directories (orc_gmock SYSTEM INTERFACE ${GTEST_INCLUDE_DIR}) + target_include_directories (orc_gtest SYSTEM INTERFACE ${GTEST_INCLUDE_DIR}) - if (ORC_PREFER_STATIC_PROTOBUF AND PROTOC_STATIC_LIB) - orc_add_resolved_library (orc_protoc ${PROTOC_STATIC_LIB} ${PROTOBUF_INCLUDE_DIR}) + if (NOT APPLE AND NOT MSVC) + target_link_libraries (orc_gmock INTERFACE Threads::Threads) + target_link_libraries (orc_gtest INTERFACE Threads::Threads) + endif () else () - orc_add_resolved_library (orc_protoc ${PROTOC_LIBRARY} ${PROTOBUF_INCLUDE_DIR}) - endif () - - list (APPEND ORC_SYSTEM_DEPENDENCIES Protobuf) - list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - orc_provide_find_module (Protobuf) -else () - set(PROTOBUF_PREFIX "${THIRDPARTY_DIR}/protobuf_ep-install") - set(PROTOBUF_INCLUDE_DIR "${PROTOBUF_PREFIX}/include") - set(PROTOBUF_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${PROTOBUF_PREFIX} - -DCMAKE_INSTALL_LIBDIR=lib - -DCMAKE_POLICY_VERSION_MINIMUM=3.12 - -DBUILD_SHARED_LIBS=OFF - -Dprotobuf_BUILD_TESTS=OFF) - - if (BUILD_POSITION_INDEPENDENT_LIB) - set(PROTOBUF_CMAKE_ARGS ${PROTOBUF_CMAKE_ARGS} -DCMAKE_POSITION_INDEPENDENT_CODE=ON) - endif () + prepare_fetchcontent() + fetchcontent_declare(googletest + URL "https://github.com/google/googletest/archive/refs/tags/v${GTEST_VERSION}.tar.gz" + FIND_PACKAGE_ARGS + NAMES GTest + CONFIG + ) + fetchcontent_makeavailable(googletest) + + if(googletest_SOURCE_DIR) + message(STATUS "Using vendored GTest") + if(NOT TARGET GTest::gtest) + add_library(GTest::gtest ALIAS gtest) + endif() + if(NOT TARGET GTest::gmock) + add_library(GTest::gmock ALIAS gmock) + endif() + if(BUILD_POSITION_INDEPENDENT_LIB) + set_target_properties(gtest PROPERTIES POSITION_INDEPENDENT_CODE ON) + set_target_properties(gmock PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() + else() + message(STATUS "Using system GTest") + endif() - if (MSVC) - set(PROTOBUF_STATIC_LIB_PREFIX lib) - list(APPEND PROTOBUF_CMAKE_ARGS -Dprotobuf_MSVC_STATIC_RUNTIME=OFF - -Dprotobuf_DEBUG_POSTFIX=) - else () - set(PROTOBUF_STATIC_LIB_PREFIX ${CMAKE_STATIC_LIBRARY_PREFIX}) + target_link_libraries (orc_gmock INTERFACE GTest::gmock) + target_link_libraries (orc_gtest INTERFACE GTest::gtest) endif () - set(PROTOBUF_STATIC_LIB_NAME "${PROTOBUF_STATIC_LIB_PREFIX}protobuf${CMAKE_STATIC_LIBRARY_SUFFIX}") - set(PROTOBUF_STATIC_LIB "${PROTOBUF_PREFIX}/lib/${PROTOBUF_STATIC_LIB_NAME}") - set(PROTOC_STATIC_LIB "${PROTOBUF_PREFIX}/lib/${PROTOBUF_STATIC_LIB_PREFIX}protoc${CMAKE_STATIC_LIBRARY_SUFFIX}") - set(PROTOBUF_EXECUTABLE "${PROTOBUF_PREFIX}/bin/protoc${CMAKE_EXECUTABLE_SUFFIX}") - - set(PROTOBUF_CONFIGURE SOURCE_SUBDIR "cmake" CMAKE_ARGS ${PROTOBUF_CMAKE_ARGS}) - - ExternalProject_Add(protobuf_ep - URL "https://github.com/google/protobuf/archive/v${PROTOBUF_VERSION}.tar.gz" - ${PROTOBUF_CONFIGURE} - ${THIRDPARTY_LOG_OPTIONS} - BUILD_BYPRODUCTS "${PROTOBUF_STATIC_LIB}" "${PROTOC_STATIC_LIB}") - - orc_add_built_library (protobuf_ep orc_protobuf ${PROTOBUF_STATIC_LIB} ${PROTOBUF_INCLUDE_DIR}) - orc_add_built_library (protobuf_ep orc_protoc ${PROTOC_STATIC_LIB} ${PROTOBUF_INCLUDE_DIR}) - - list (APPEND ORC_VENDOR_DEPENDENCIES "orc::vendored_protobuf|${PROTOBUF_STATIC_LIB_NAME}") - list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") -endif () - -add_library (orc::protobuf ALIAS orc_protobuf) -if (NOT (ORC_PACKAGE_KIND STREQUAL "conan" OR ORC_PACKAGE_KIND STREQUAL "vcpkg")) - add_library (orc::protoc ALIAS orc_protoc) endif () # ---------------------------------------------------------------------- # SPARSEHASH if(BUILD_SPARSEHASH) - set(SPARSEHASH_HOME "${THIRDPARTY_DIR}/sparsehash_ep-install") - set(SPARSEHASH_INCLUDE_DIR "${SPARSEHASH_HOME}/include/google") - set(SPARSEHASH_CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${SPARSEHASH_HOME} - -DBUILD_SHARED_LIBS=OFF - -DCMAKE_INSTALL_LIBDIR=lib - -DCMAKE_POLICY_VERSION_MINIMUM=3.5 - ) - if (BUILD_POSITION_INDEPENDENT_LIB) - set(SPARSEHASH_CMAKE_ARGS ${SPARSEHASH_CMAKE_ARGS} -DCMAKE_POSITION_INDEPENDENT_CODE=ON) - endif () - - set(SPARSEHASH_CONFIGURE SOURCE_SUBDIR "" CMAKE_ARGS ${SPARSEHASH_CMAKE_ARGS}) + prepare_fetchcontent() - ExternalProject_Add(sparsehash_ep - URL "https://github.com/sparsehash/sparsehash-c11/archive/refs/tags/v${SPARSEHASH_VERSION}.tar.gz" - ${SPARSEHASH_CONFIGURE} - ${THIRDPARTY_LOG_OPTIONS}) + fetchcontent_declare(sparsehash + URL "https://github.com/sparsehash/sparsehash-c11/archive/refs/tags/v${SPARSEHASH_VERSION}.tar.gz" + SOURCE_SUBDIR "sparsehash" # XXX: sparsehash bundles gtest which conflicts with our vendored one + ) + fetchcontent_makeavailable(sparsehash) + message(STATUS "Using vendored sparsehash") - # sparsehash-c11 is header-only, create interface library + # sparsehash-c11 is header-only add_library(orc_sparsehash INTERFACE) - target_include_directories(orc_sparsehash INTERFACE - $ - $) - add_dependencies(orc_sparsehash sparsehash_ep) - - list (APPEND ORC_VENDOR_DEPENDENCIES "orc::vendored_sparsehash") - list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - - add_library (orc::sparsehash ALIAS orc_sparsehash) - set (SPARSEHASH_LIBRARIES orc::sparsehash) + add_library(orc::sparsehash ALIAS orc_sparsehash) + target_include_directories(orc_sparsehash INTERFACE $) endif() # ---------------------------------------------------------------------- diff --git a/tools/test/CMakeLists.txt b/tools/test/CMakeLists.txt index 202ddb2e0d..ae407d2ff1 100644 --- a/tools/test/CMakeLists.txt +++ b/tools/test/CMakeLists.txt @@ -28,9 +28,6 @@ add_executable (tool-test target_link_libraries (tool-test orc - orc::protobuf - orc::zlib - orc::snappy orc::gtest orc::gmock ) From 892a12d05224ab865c74856cbf98f34dfd7c5375 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Mon, 29 Sep 2025 17:45:08 +0800 Subject: [PATCH 2/2] apply block() --- c++/orcConfig.cmake.in | 25 -- cmake_modules/FindGTestAlt.cmake | 8 +- cmake_modules/ThirdpartyToolchain.cmake | 537 ++++++++++++------------ 3 files changed, 274 insertions(+), 296 deletions(-) diff --git a/c++/orcConfig.cmake.in b/c++/orcConfig.cmake.in index 49663b3423..c794822569 100644 --- a/c++/orcConfig.cmake.in +++ b/c++/orcConfig.cmake.in @@ -33,7 +33,6 @@ @PACKAGE_INIT@ -set(ORC_VENDOR_DEPENDENCIES "@ORC_VENDOR_DEPENDENCIES@") set(ORC_SYSTEM_DEPENDENCIES "@ORC_SYSTEM_DEPENDENCIES@") if(DEFINED CMAKE_MODULE_PATH) @@ -59,30 +58,6 @@ include("${CMAKE_CURRENT_LIST_DIR}/orcTargets.cmake") get_target_property(orc_static_configurations orc::orc IMPORTED_CONFIGURATIONS) -foreach(dependency ${ORC_VENDOR_DEPENDENCIES}) - string(REPLACE "|" ";" dependency_pair ${dependency}) - list(LENGTH dependency_pair dependency_pair_length) - if(NOT dependency_pair_length EQUAL 2) - message(FATAL_ERROR "Invalid vendor dependency: ${dependency}") - endif() - list(GET dependency_pair 0 target_name) - list(GET dependency_pair 1 static_lib_name) - - add_library("${target_name}" STATIC IMPORTED) - - foreach(CONFIGURATION ${orc_static_configurations}) - string(TOUPPER "${CONFIGURATION}" CONFIGURATION) - get_target_property(orc_static_location orc::orc LOCATION_${CONFIGURATION}) - get_filename_component(orc_lib_dir "${orc_static_location}" DIRECTORY) - set_property(TARGET "${target_name}" - APPEND - PROPERTY IMPORTED_CONFIGURATIONS ${CONFIGURATION}) - set_target_properties("${target_name}" - PROPERTIES IMPORTED_LOCATION_${CONFIGURATION} - "${orc_lib_dir}/${static_lib_name}") - endforeach() -endforeach() - check_required_components(orc) foreach(BUILD_TYPE_SUFFIX diff --git a/cmake_modules/FindGTestAlt.cmake b/cmake_modules/FindGTestAlt.cmake index 33e42c8c31..802a88d5e3 100644 --- a/cmake_modules/FindGTestAlt.cmake +++ b/cmake_modules/FindGTestAlt.cmake @@ -22,7 +22,7 @@ # GTEST_LIBRARY: path to libgtest # GMOCK_STATIC_LIB: is set to gmock.a static library # GTEST_STATIC_LIB: is set to gtest.a static library -# GTESTAlt_FOUND is set if GTEST is found +# GTestAlt_FOUND is set if GTEST is found if (NOT "${GTEST_HOME}" STREQUAL "") message (STATUS "GTEST_HOME set: ${GTEST_HOME}") @@ -52,14 +52,14 @@ find_library (GTEST_STATIC_LIB NAMES ${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_ PATH_SUFFIXES "lib") if (GTEST_INCLUDE_DIR AND GMOCK_LIBRARY) - set (GTESTAlt_FOUND TRUE) + set (GTestAlt_FOUND TRUE) set (GTEST_HEADER_NAME gmock/gmock.h) set (GTEST_HEADER ${GTEST_INCLUDE_DIR}/${GTEST_HEADER_NAME}) else () - set (GTESTAlt_FOUND FALSE) + set (GTestAlt_FOUND FALSE) endif () -if (GTESTAlt_FOUND) +if (GTestAlt_FOUND) message (STATUS "Found the GTest header: ${GTEST_HEADER}") message (STATUS "Found the GTest library: ${GTEST_LIBRARY}") message (STATUS "Found the GMock library: ${GMOCK_LIBRARY}") diff --git a/cmake_modules/ThirdpartyToolchain.cmake b/cmake_modules/ThirdpartyToolchain.cmake index b05d2d284f..53190b5445 100644 --- a/cmake_modules/ThirdpartyToolchain.cmake +++ b/cmake_modules/ThirdpartyToolchain.cmake @@ -18,7 +18,6 @@ INCLUDE(ExternalProject) INCLUDE(FetchContent) -set(ORC_VENDOR_DEPENDENCIES) set(ORC_SYSTEM_DEPENDENCIES) set(ORC_INSTALL_INTERFACE_TARGETS) @@ -220,70 +219,62 @@ elseif (NOT "${PROTOBUF_HOME}" STREQUAL "") list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") orc_provide_find_module (ProtobufAlt) else () - prepare_fetchcontent() - - set(protobuf_INSTALL OFF) - set(protobuf_BUILD_TESTS OFF) - set(protobuf_BUILD_PROTOBUF_BINARIES ON) - set(protobuf_BUILD_PROTOC_BINARIES ON) - set(protobuf_WITH_ZLIB OFF) - set(protobuf_BUILD_SHARED_LIBS OFF) - - # Set compiler flags to suppress warnings before fetching protobuf - set(CMAKE_CXX_FLAGS_BACKUP "${CMAKE_CXX_FLAGS}") - set(CMAKE_C_FLAGS_BACKUP "${CMAKE_C_FLAGS}") - if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations") - endif() + block(PROPAGATE ORC_SYSTEM_DEPENDENCIES ORC_INSTALL_INTERFACE_TARGETS PROTOBUF_EXECUTABLE) + prepare_fetchcontent() - fetchcontent_declare(protobuf - URL "https://github.com/google/protobuf/archive/v${PROTOBUF_VERSION}.tar.gz" - SOURCE_SUBDIR "cmake" - FIND_PACKAGE_ARGS - NAMES Protobuf - CONFIG - ) - fetchcontent_makeavailable(protobuf) + set(protobuf_INSTALL OFF) + set(protobuf_BUILD_TESTS OFF) + set(protobuf_BUILD_PROTOBUF_BINARIES ON) + set(protobuf_BUILD_PROTOC_BINARIES ON) + set(protobuf_WITH_ZLIB OFF) + set(protobuf_BUILD_SHARED_LIBS OFF) + + # Set compiler flags to suppress warnings before fetching protobuf + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations") + endif() - # Restore original compiler flags after protobuf configuration - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_BACKUP}") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS_BACKUP}") + fetchcontent_declare(protobuf + URL "https://github.com/google/protobuf/archive/v${PROTOBUF_VERSION}.tar.gz" + SOURCE_SUBDIR "cmake" + FIND_PACKAGE_ARGS + NAMES Protobuf + CONFIG + ) + fetchcontent_makeavailable(protobuf) - if(protobuf_SOURCE_DIR) - message(STATUS "Using vendored protobuf") + if(protobuf_SOURCE_DIR) + message(STATUS "Using vendored protobuf") - if(NOT TARGET protobuf::libprotobuf) add_library(protobuf::libprotobuf ALIAS libprotobuf) - endif() - if(NOT TARGET protobuf::protoc) add_executable(protobuf::protoc ALIAS protoc) - endif() - if(BUILD_POSITION_INDEPENDENT_LIB) - set_target_properties(libprotobuf PROPERTIES POSITION_INDEPENDENT_CODE ON) - set_target_properties(protoc PROPERTIES POSITION_INDEPENDENT_CODE ON) - endif() + if(BUILD_POSITION_INDEPENDENT_LIB) + set_target_properties(libprotobuf PROPERTIES POSITION_INDEPENDENT_CODE ON) + set_target_properties(protoc PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() - if(INSTALL_VENDORED_LIBS) - set_target_properties(libprotobuf PROPERTIES OUTPUT_NAME "orc_vendored_protobuf") - install(TARGETS libprotobuf - EXPORT orc_targets - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") - endif() + if(INSTALL_VENDORED_LIBS) + set_target_properties(libprotobuf PROPERTIES OUTPUT_NAME "orc_vendored_protobuf") + install(TARGETS libprotobuf + EXPORT orc_targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") + endif() - list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - else() - message(STATUS "Using system protobuf") - list(APPEND ORC_SYSTEM_DEPENDENCIES Protobuf) - list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - endif() + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + else() + message(STATUS "Using system protobuf") + list(APPEND ORC_SYSTEM_DEPENDENCIES Protobuf) + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + endif() - add_library(orc_protobuf INTERFACE IMPORTED) - target_link_libraries(orc_protobuf INTERFACE protobuf::libprotobuf) - set(PROTOBUF_EXECUTABLE protobuf::protoc) + add_library(orc_protobuf INTERFACE IMPORTED) + target_link_libraries(orc_protobuf INTERFACE protobuf::libprotobuf) + set(PROTOBUF_EXECUTABLE protobuf::protoc) + endblock() endif () add_library (orc::protobuf ALIAS orc_protobuf) @@ -313,55 +304,57 @@ elseif (NOT "${SNAPPY_HOME}" STREQUAL "") list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") orc_provide_find_module (SnappyAlt) else () - prepare_fetchcontent() + block(PROPAGATE ORC_SYSTEM_DEPENDENCIES ORC_INSTALL_INTERFACE_TARGETS) + prepare_fetchcontent() - set(SNAPPY_BUILD_TESTS OFF) - set(SNAPPY_BUILD_BENCHMARKS OFF) - set(SNAPPY_INSTALL OFF) + set(SNAPPY_BUILD_TESTS OFF) + set(SNAPPY_BUILD_BENCHMARKS OFF) + set(SNAPPY_INSTALL OFF) - fetchcontent_declare(Snappy - URL "https://github.com/google/snappy/archive/${SNAPPY_VERSION}.tar.gz" - FIND_PACKAGE_ARGS - NAMES Snappy - CONFIG - ) - fetchcontent_makeavailable(Snappy) - - if(snappy_SOURCE_DIR) - message(STATUS "Using vendored snappy") - if(NOT TARGET Snappy::snappy) - add_library(Snappy::snappy INTERFACE IMPORTED) - target_link_libraries(Snappy::snappy INTERFACE snappy) - target_include_directories(Snappy::snappy INTERFACE ${snappy_SOURCE_DIR} ${snappy_BINARY_DIR}) - endif() + fetchcontent_declare(Snappy + URL "https://github.com/google/snappy/archive/${SNAPPY_VERSION}.tar.gz" + FIND_PACKAGE_ARGS + NAMES Snappy + CONFIG + ) + fetchcontent_makeavailable(Snappy) + + if(snappy_SOURCE_DIR) + message(STATUS "Using vendored snappy") + if(NOT TARGET Snappy::snappy) + add_library(Snappy::snappy INTERFACE IMPORTED) + target_link_libraries(Snappy::snappy INTERFACE snappy) + target_include_directories(Snappy::snappy INTERFACE ${snappy_SOURCE_DIR} ${snappy_BINARY_DIR}) + endif() - if(BUILD_POSITION_INDEPENDENT_LIB) - set_target_properties(snappy POSITION_INDEPENDENT_CODE ON) - endif() + if(BUILD_POSITION_INDEPENDENT_LIB) + set_target_properties(snappy POSITION_INDEPENDENT_CODE ON) + endif() - if(INSTALL_VENDORED_LIBS) - set_target_properties(snappy PROPERTIES OUTPUT_NAME "orc_vendored_snappy") - - install(FILES ${snappy_SOURCE_DIR}/snappy-c.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") - install(FILES ${snappy_SOURCE_DIR}/snappy-sinksource.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") - install(FILES ${snappy_SOURCE_DIR}/snappy.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") - install(FILES ${snappy_BINARY_DIR}/snappy-stubs-public.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") - install(TARGETS snappy - EXPORT orc_targets - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") - endif() + if(INSTALL_VENDORED_LIBS) + set_target_properties(snappy PROPERTIES OUTPUT_NAME "orc_vendored_snappy") + + install(FILES ${snappy_SOURCE_DIR}/snappy-c.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + install(FILES ${snappy_SOURCE_DIR}/snappy-sinksource.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + install(FILES ${snappy_SOURCE_DIR}/snappy.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + install(FILES ${snappy_BINARY_DIR}/snappy-stubs-public.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + install(TARGETS snappy + EXPORT orc_targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") + endif() - list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - else() - message(STATUS "Using system snappy") - list(APPEND ORC_SYSTEM_DEPENDENCIES Snappy) - list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - endif() + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + else() + message(STATUS "Using system snappy") + list(APPEND ORC_SYSTEM_DEPENDENCIES Snappy) + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + endif() - add_library(orc_snappy INTERFACE IMPORTED) - target_link_libraries(orc_snappy INTERFACE Snappy::snappy) + add_library(orc_snappy INTERFACE IMPORTED) + target_link_libraries(orc_snappy INTERFACE Snappy::snappy) + endblock() endif () add_library (orc::Snappy ALIAS orc_snappy) @@ -393,61 +386,63 @@ elseif (NOT "${ZLIB_HOME}" STREQUAL "") list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") orc_provide_find_module (ZLIBAlt) else () - prepare_fetchcontent() - - set(ZLIB_BUILD_EXAMPLES OFF) - set(ZLIB_BUILD_TESTING OFF) - set(ZLIB_BUILD_STATIC ON) - set(ZLIB_BUILD_SHARED OFF) - set(ZLIB_INSTALL OFF) - set(ZLIB_PREFIX OFF) - - fetchcontent_declare(zlib - # URL "https://zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz" - # See https://github.com/madler/zlib/issues/937 - GIT_REPOSITORY "https://github.com/madler/zlib.git" - GIT_TAG 5a82f71ed1dfc0bec044d9702463dbdf84ea3b71 - FIND_PACKAGE_ARGS - NAMES ZLIB - CONFIG - ) - fetchcontent_makeavailable(zlib) + block(PROPAGATE ORC_SYSTEM_DEPENDENCIES ORC_INSTALL_INTERFACE_TARGETS ZLIB_LIBRARIES ZLIB_INCLUDE_DIRS) + prepare_fetchcontent() - if(zlib_SOURCE_DIR) - message(STATUS "Using vendored zlib") - if(NOT TARGET ZLIB::ZLIB) - add_library(ZLIB::ZLIB ALIAS zlibstatic) - endif() + set(ZLIB_BUILD_EXAMPLES OFF) + set(ZLIB_BUILD_TESTING OFF) + set(ZLIB_BUILD_STATIC ON) + set(ZLIB_BUILD_SHARED OFF) + set(ZLIB_INSTALL OFF) + set(ZLIB_PREFIX OFF) + + fetchcontent_declare(zlib + # URL "https://zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz" + # See https://github.com/madler/zlib/issues/937 + GIT_REPOSITORY "https://github.com/madler/zlib.git" + GIT_TAG 5a82f71ed1dfc0bec044d9702463dbdf84ea3b71 + FIND_PACKAGE_ARGS + NAMES ZLIB + CONFIG + ) + fetchcontent_makeavailable(zlib) - if(BUILD_POSITION_INDEPENDENT_LIB) - set_target_properties(zlibstatic POSITION_INDEPENDENT_CODE ON) - endif() + if(zlib_SOURCE_DIR) + message(STATUS "Using vendored zlib") + if(NOT TARGET ZLIB::ZLIB) + add_library(ZLIB::ZLIB ALIAS zlibstatic) + endif() - if(INSTALL_VENDORED_LIBS) - set_target_properties(zlibstatic PROPERTIES OUTPUT_NAME "orc_vendored_zlib") - install(TARGETS zlibstatic - EXPORT orc_targets - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") - endif() + if(BUILD_POSITION_INDEPENDENT_LIB) + set_target_properties(zlibstatic POSITION_INDEPENDENT_CODE ON) + endif() - list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - set(ZLIB_LIBRARIES "zlibstatic") - set(ZLIB_INCLUDE_DIRS "${zlib_SOURCE_DIR}") - else() - message(STATUS "Using system zlib") - # FindZLIB guarantees that ZLIB::ZLIB target exists if found - # See https://cmake.org/cmake/help/latest/module/FindZLIB.html#imported-targets - if(NOT TARGET ZLIB::ZLIB) - message(FATAL_ERROR "Using system zlib, but ZLIB::ZLIB not found") + if(INSTALL_VENDORED_LIBS) + set_target_properties(zlibstatic PROPERTIES OUTPUT_NAME "orc_vendored_zlib") + install(TARGETS zlibstatic + EXPORT orc_targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") + endif() + + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + set(ZLIB_LIBRARIES "zlibstatic") + set(ZLIB_INCLUDE_DIRS "${zlib_SOURCE_DIR}") + else() + message(STATUS "Using system zlib") + # FindZLIB guarantees that ZLIB::ZLIB target exists if found + # See https://cmake.org/cmake/help/latest/module/FindZLIB.html#imported-targets + if(NOT TARGET ZLIB::ZLIB) + message(FATAL_ERROR "Using system zlib, but ZLIB::ZLIB not found") + endif() + list(APPEND ORC_SYSTEM_DEPENDENCIES ZLIB) + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") endif() - list(APPEND ORC_SYSTEM_DEPENDENCIES ZLIB) - list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - endif() - add_library(orc_zlib INTERFACE IMPORTED) - target_link_libraries(orc_zlib INTERFACE ZLIB::ZLIB) + add_library(orc_zlib INTERFACE IMPORTED) + target_link_libraries(orc_zlib INTERFACE ZLIB::ZLIB) + endblock() endif() add_library(orc::zlib ALIAS orc_zlib) @@ -482,55 +477,57 @@ elseif (NOT "${ZSTD_HOME}" STREQUAL "") list (APPEND ORC_SYSTEM_DEPENDENCIES ZSTDAlt) orc_provide_find_module (ZSTDAlt) else () - prepare_fetchcontent() - - set(ZSTD_BUILD_TESTING OFF) - set(ZSTD_BUILD_PROGRAMS OFF) - set(ZSTD_BUILD_STATIC ON) - set(ZSTD_BUILD_SHARED OFF) - set(ZSTD_BUILD_CONTRIB OFF) - - fetchcontent_declare(zstd - URL "https://github.com/facebook/zstd/archive/v${ZSTD_VERSION}.tar.gz" - SOURCE_SUBDIR "build/cmake" - FIND_PACKAGE_ARGS - NAMES zstd - CONFIG - ) - fetchcontent_makeavailable(zstd) + block(PROPAGATE ORC_SYSTEM_DEPENDENCIES ORC_INSTALL_INTERFACE_TARGETS) + prepare_fetchcontent() - if(zstd_SOURCE_DIR) - message(STATUS "Using vendored zstd") - if(NOT TARGET zstd::libzstd_static) - add_library(zstd::libzstd_static ALIAS libzstd_static) - endif() - - if(BUILD_POSITION_INDEPENDENT_LIB) - set_target_properties(libzstd_static POSITION_INDEPENDENT_CODE ON) - endif() + set(ZSTD_BUILD_TESTING OFF) + set(ZSTD_BUILD_PROGRAMS OFF) + set(ZSTD_BUILD_STATIC ON) + set(ZSTD_BUILD_SHARED OFF) + set(ZSTD_BUILD_CONTRIB OFF) - if(INSTALL_VENDORED_LIBS) - set_target_properties(libzstd_static PROPERTIES OUTPUT_NAME "orc_vendored_zstd") - install(TARGETS libzstd_static - EXPORT orc_targets - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") - endif() + fetchcontent_declare(zstd + URL "https://github.com/facebook/zstd/archive/v${ZSTD_VERSION}.tar.gz" + SOURCE_SUBDIR "build/cmake" + FIND_PACKAGE_ARGS + NAMES zstd + CONFIG + ) + fetchcontent_makeavailable(zstd) - list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - else() - message(STATUS "Using system zstd") - list(APPEND ORC_SYSTEM_DEPENDENCIES zstd) - list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$>") - list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$>") - endif() + if(zstd_SOURCE_DIR) + message(STATUS "Using vendored zstd") + if(NOT TARGET zstd::libzstd_static) + add_library(zstd::libzstd_static ALIAS libzstd_static) + endif() + + if(BUILD_POSITION_INDEPENDENT_LIB) + set_target_properties(libzstd_static POSITION_INDEPENDENT_CODE ON) + endif() - add_library(orc_zstd INTERFACE IMPORTED) - target_link_libraries(orc_zstd INTERFACE - $ - $ - ) + if(INSTALL_VENDORED_LIBS) + set_target_properties(libzstd_static PROPERTIES OUTPUT_NAME "orc_vendored_zstd") + install(TARGETS libzstd_static + EXPORT orc_targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") + endif() + + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + else() + message(STATUS "Using system zstd") + list(APPEND ORC_SYSTEM_DEPENDENCIES zstd) + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$>") + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$>") + endif() + + add_library(orc_zstd INTERFACE IMPORTED) + target_link_libraries(orc_zstd INTERFACE + $ + $ + ) + endblock() endif () add_library (orc::zstd ALIAS orc_zstd) @@ -563,51 +560,53 @@ elseif (NOT "${LZ4_HOME}" STREQUAL "") list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$") orc_provide_find_module (LZ4Alt) else () - prepare_fetchcontent() + block(PROPAGATE ORC_SYSTEM_DEPENDENCIES ORC_INSTALL_INTERFACE_TARGETS) + prepare_fetchcontent() - set(LZ4_BUILD_CLI OFF) + set(LZ4_BUILD_CLI OFF) - fetchcontent_declare(lz4 - URL "https://github.com/lz4/lz4/archive/v${LZ4_VERSION}.tar.gz" - SOURCE_SUBDIR "build/cmake" - FIND_PACKAGE_ARGS - NAMES lz4 - CONFIG - ) - fetchcontent_makeavailable(lz4) + fetchcontent_declare(lz4 + URL "https://github.com/lz4/lz4/archive/v${LZ4_VERSION}.tar.gz" + SOURCE_SUBDIR "build/cmake" + FIND_PACKAGE_ARGS + NAMES lz4 + CONFIG + ) + fetchcontent_makeavailable(lz4) - if(lz4_SOURCE_DIR) - message(STATUS "Using vendored LZ4") - if(NOT TARGET LZ4::lz4_static) - add_library(LZ4::lz4_static ALIAS lz4_static) - endif() + if(lz4_SOURCE_DIR) + message(STATUS "Using vendored LZ4") + if(NOT TARGET LZ4::lz4_static) + add_library(LZ4::lz4_static ALIAS lz4_static) + endif() - if(BUILD_POSITION_INDEPENDENT_LIB) - set_target_properties(lz4_static POSITION_INDEPENDENT_CODE ON) - endif() + if(BUILD_POSITION_INDEPENDENT_LIB) + set_target_properties(lz4_static POSITION_INDEPENDENT_CODE ON) + endif() - if(INSTALL_VENDORED_LIBS) - set_target_properties(lz4_static PROPERTIES OUTPUT_NAME "orc_vendored_lz4") - install(TARGETS lz4_static - EXPORT orc_targets - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") - endif() + if(INSTALL_VENDORED_LIBS) + set_target_properties(lz4_static PROPERTIES OUTPUT_NAME "orc_vendored_lz4") + install(TARGETS lz4_static + EXPORT orc_targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") + endif() - list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") - else() - message(STATUS "Using system LZ4") - list(APPEND ORC_SYSTEM_DEPENDENCIES lz4) - list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$>") - list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$>") - endif() + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$") + else() + message(STATUS "Using system LZ4") + list(APPEND ORC_SYSTEM_DEPENDENCIES lz4) + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$>") + list(APPEND ORC_INSTALL_INTERFACE_TARGETS "$>") + endif() - add_library(orc_lz4 INTERFACE IMPORTED) - target_link_libraries(orc_lz4 INTERFACE - $ - $ - ) + add_library(orc_lz4 INTERFACE IMPORTED) + target_link_libraries(orc_lz4 INTERFACE + $ + $ + ) + endblock() endif () add_library (orc::lz4 ALIAS orc_lz4) @@ -677,52 +676,56 @@ if (BUILD_CPP_TESTS) target_link_libraries (orc_gtest INTERFACE Threads::Threads) endif () else () - prepare_fetchcontent() - fetchcontent_declare(googletest - URL "https://github.com/google/googletest/archive/refs/tags/v${GTEST_VERSION}.tar.gz" - FIND_PACKAGE_ARGS - NAMES GTest - CONFIG - ) - fetchcontent_makeavailable(googletest) - - if(googletest_SOURCE_DIR) - message(STATUS "Using vendored GTest") - if(NOT TARGET GTest::gtest) - add_library(GTest::gtest ALIAS gtest) - endif() - if(NOT TARGET GTest::gmock) - add_library(GTest::gmock ALIAS gmock) - endif() - if(BUILD_POSITION_INDEPENDENT_LIB) - set_target_properties(gtest PROPERTIES POSITION_INDEPENDENT_CODE ON) - set_target_properties(gmock PROPERTIES POSITION_INDEPENDENT_CODE ON) + block() + prepare_fetchcontent() + fetchcontent_declare(googletest + URL "https://github.com/google/googletest/archive/refs/tags/v${GTEST_VERSION}.tar.gz" + FIND_PACKAGE_ARGS + NAMES GTest + CONFIG + ) + fetchcontent_makeavailable(googletest) + + if(googletest_SOURCE_DIR) + message(STATUS "Using vendored GTest") + if(NOT TARGET GTest::gtest) + add_library(GTest::gtest ALIAS gtest) + endif() + if(NOT TARGET GTest::gmock) + add_library(GTest::gmock ALIAS gmock) + endif() + if(BUILD_POSITION_INDEPENDENT_LIB) + set_target_properties(gtest PROPERTIES POSITION_INDEPENDENT_CODE ON) + set_target_properties(gmock PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() + else() + message(STATUS "Using system GTest") endif() - else() - message(STATUS "Using system GTest") - endif() - target_link_libraries (orc_gmock INTERFACE GTest::gmock) - target_link_libraries (orc_gtest INTERFACE GTest::gtest) + target_link_libraries (orc_gmock INTERFACE GTest::gmock) + target_link_libraries (orc_gtest INTERFACE GTest::gtest) + endblock() endif () endif () # ---------------------------------------------------------------------- # SPARSEHASH if(BUILD_SPARSEHASH) - prepare_fetchcontent() - - fetchcontent_declare(sparsehash - URL "https://github.com/sparsehash/sparsehash-c11/archive/refs/tags/v${SPARSEHASH_VERSION}.tar.gz" - SOURCE_SUBDIR "sparsehash" # XXX: sparsehash bundles gtest which conflicts with our vendored one - ) - fetchcontent_makeavailable(sparsehash) - message(STATUS "Using vendored sparsehash") + block() + prepare_fetchcontent() - # sparsehash-c11 is header-only - add_library(orc_sparsehash INTERFACE) - add_library(orc::sparsehash ALIAS orc_sparsehash) - target_include_directories(orc_sparsehash INTERFACE $) + fetchcontent_declare(sparsehash + URL "https://github.com/sparsehash/sparsehash-c11/archive/refs/tags/v${SPARSEHASH_VERSION}.tar.gz" + SOURCE_SUBDIR "sparsehash" # XXX: sparsehash bundles gtest which conflicts with our vendored one + ) + fetchcontent_makeavailable(sparsehash) + message(STATUS "Using vendored sparsehash") + + # sparsehash-c11 is header-only + add_library(orc_sparsehash INTERFACE) + add_library(orc::sparsehash ALIAS orc_sparsehash) + target_include_directories(orc_sparsehash INTERFACE $) + endblock() endif() # ----------------------------------------------------------------------