Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions cmake_modules/DefineOptions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -156,11 +156,10 @@ if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
"Prefer shared libraries for system third-party packages" OFF)

define_option_string(Arrow_SOURCE
"Dependency source for Apache Arrow"
"Dependency source for Apache Arrow; SYSTEM is unsupported"
""
AUTO
BUNDLED
SYSTEM)
BUNDLED)
define_option_string(zstd_SOURCE
"Dependency source for zstd"
""
Expand Down Expand Up @@ -198,11 +197,10 @@ if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
BUNDLED
SYSTEM)
define_option_string(ORC_SOURCE
"Dependency source for Apache ORC"
"Dependency source for Apache ORC; SYSTEM is unsupported"
""
AUTO
BUNDLED
SYSTEM)
BUNDLED)
define_option_string(fmt_SOURCE
"Dependency source for fmt"
""
Expand Down
17 changes: 15 additions & 2 deletions cmake_modules/FindGTestAlt.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ if(_PAIMON_GTEST_ROOTS)
set(_PAIMON_GTEST_FIND_ARGS HINTS ${_PAIMON_GTEST_ROOTS} NO_DEFAULT_PATH)
endif()

include(FindPackageUtils)
find_package(GTest CONFIG QUIET ${_PAIMON_GTEST_FIND_ARGS})

if(NOT TARGET GTest::gtest
Expand Down Expand Up @@ -65,8 +66,20 @@ if(NOT TARGET GTest::gtest
endif()
endif()
else()
get_target_property(GTEST_INCLUDE_DIR GTest::gtest INTERFACE_INCLUDE_DIRECTORIES)
set(GTestAlt_FOUND TRUE)
paimon_find_target_headers(GTEST_INCLUDE_DIR
GTest::gtest
NAMES
gtest/gtest.h
${_PAIMON_GTEST_FIND_ARGS})
paimon_find_target_headers(GMOCK_INCLUDE_DIR
GTest::gmock
NAMES
gmock/gmock.h
${_PAIMON_GTEST_FIND_ARGS})

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GTestAlt REQUIRED_VARS GTEST_INCLUDE_DIR
Comment thread
suxiaogang223 marked this conversation as resolved.
GMOCK_INCLUDE_DIR)
endif()

if(GTestAlt_FOUND)
Expand Down
25 changes: 16 additions & 9 deletions cmake_modules/FindLZ4Alt.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ if(_PAIMON_LZ4_ROOTS)
set(_PAIMON_LZ4_FIND_ARGS HINTS ${_PAIMON_LZ4_ROOTS} NO_DEFAULT_PATH)
endif()

include(FindPackageUtils)
find_package(lz4 CONFIG QUIET ${_PAIMON_LZ4_FIND_ARGS})
find_package(LZ4 CONFIG QUIET ${_PAIMON_LZ4_FIND_ARGS})

Expand All @@ -30,18 +31,24 @@ foreach(_target IN LISTS _PAIMON_LZ4_TARGETS)
endforeach()

if(_PAIMON_LZ4_TARGET)
get_target_property(LZ4_INCLUDE_DIR ${_PAIMON_LZ4_TARGET}
INTERFACE_INCLUDE_DIRECTORIES)
if(NOT TARGET lz4)
paimon_find_target_headers(LZ4_INCLUDE_DIR
${_PAIMON_LZ4_TARGET}
NAMES
lz4.h
${_PAIMON_LZ4_FIND_ARGS})

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LZ4Alt REQUIRED_VARS LZ4_INCLUDE_DIR)

if(LZ4Alt_FOUND AND NOT TARGET lz4)
add_library(lz4 INTERFACE IMPORTED)
if(LZ4_INCLUDE_DIR)
set_target_properties(lz4 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${LZ4_INCLUDE_DIR}")
endif()
set_target_properties(lz4 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${LZ4_INCLUDE_DIR}")
target_link_libraries(lz4 INTERFACE ${_PAIMON_LZ4_TARGET})
endif()
set(LZ4_LIBRARIES ${_PAIMON_LZ4_TARGET})
set(LZ4Alt_FOUND TRUE)
if(LZ4Alt_FOUND)
set(LZ4_LIBRARIES ${_PAIMON_LZ4_TARGET})
endif()
else()
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
Expand Down
91 changes: 91 additions & 0 deletions cmake_modules/FindPackageUtils.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# Copyright 2026-present Alibaba Inc.
#
# Licensed 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.

function(paimon_find_target_headers OUT_VAR TARGET_NAME)
set(options NO_DEFAULT_PATH)
set(one_value_args)
set(multi_value_args NAMES HINTS PATH_SUFFIXES)
cmake_parse_arguments(ARG
"${options}"
"${one_value_args}"
"${multi_value_args}"
${ARGN})

if(NOT TARGET ${TARGET_NAME} OR NOT ARG_NAMES)
set(${OUT_VAR}
"${OUT_VAR}-NOTFOUND"
PARENT_SCOPE)
return()
endif()

set(_target_include_dirs)
foreach(_property INTERFACE_INCLUDE_DIRECTORIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES
INCLUDE_DIRECTORIES)
get_target_property(_property_value ${TARGET_NAME} ${_property})
if(_property_value AND NOT _property_value MATCHES "-NOTFOUND$")
list(APPEND _target_include_dirs ${_property_value})
endif()
endforeach()

set(_search_dirs)
foreach(_dir IN LISTS _target_include_dirs)
if(_dir MATCHES "^\\$<BUILD_INTERFACE:(.*)>$")
list(APPEND _search_dirs "${CMAKE_MATCH_1}")
elseif(_dir MATCHES "^\\$<INSTALL_INTERFACE:(.*)>$")
if(IS_ABSOLUTE "${CMAKE_MATCH_1}")
list(APPEND _search_dirs "${CMAKE_MATCH_1}")
endif()
elseif(NOT _dir MATCHES "^\\$<")
list(APPEND _search_dirs "${_dir}")
endif()
endforeach()

list(APPEND _search_dirs ${ARG_HINTS})
if(_search_dirs)
list(REMOVE_DUPLICATES _search_dirs)
endif()

string(MAKE_C_IDENTIFIER "${TARGET_NAME}_${ARG_NAMES}" _header_var_suffix)
set(_header_dir_var "PAIMON_${_header_var_suffix}_HEADER_DIR")
set(_find_args NAMES ${ARG_NAMES})
if(_search_dirs)
list(APPEND _find_args HINTS ${_search_dirs})
endif()
if(ARG_PATH_SUFFIXES)
list(APPEND _find_args PATH_SUFFIXES ${ARG_PATH_SUFFIXES})
endif()
list(APPEND _find_args NO_DEFAULT_PATH)

unset(${_header_dir_var} CACHE)
find_path(${_header_dir_var} ${_find_args})

if(NOT ${_header_dir_var})
get_property(_partial_targets GLOBAL PROPERTY PAIMON_PARTIAL_SYSTEM_TARGETS)
list(APPEND _partial_targets "${TARGET_NAME}: ${ARG_NAMES}")
set_property(GLOBAL PROPERTY PAIMON_PARTIAL_SYSTEM_TARGETS "${_partial_targets}")
endif()

set(${OUT_VAR}
"${${_header_dir_var}}"
PARENT_SCOPE)

unset(${_header_dir_var} CACHE)
unset(_find_args)
unset(_header_dir_var)
unset(_header_var_suffix)
unset(_partial_targets)
unset(_property_value)
unset(_search_dirs)
unset(_target_include_dirs)
endfunction()
25 changes: 13 additions & 12 deletions cmake_modules/FindProtobufAlt.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ if(_PAIMON_PROTOBUF_ROOTS)
set(_PAIMON_PROTOBUF_FIND_ARGS HINTS ${_PAIMON_PROTOBUF_ROOTS} NO_DEFAULT_PATH)
endif()

include(FindPackageUtils)
find_package(Protobuf CONFIG QUIET ${_PAIMON_PROTOBUF_FIND_ARGS})

set(_PAIMON_PROTOBUF_LIBRARY_TARGETS protobuf::libprotobuf Protobuf::libprotobuf)
Expand Down Expand Up @@ -52,29 +53,29 @@ if(_PAIMON_PROTOBUF_LIBRARY_TARGET AND NOT PROTOBUF_COMPILER)
endif()

if(_PAIMON_PROTOBUF_LIBRARY_TARGET)
paimon_find_target_headers(PROTOBUF_INCLUDE_DIR
${_PAIMON_PROTOBUF_LIBRARY_TARGET}
NAMES
google/protobuf/message.h
${_PAIMON_PROTOBUF_FIND_ARGS})

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
ProtobufAlt REQUIRED_VARS _PAIMON_PROTOBUF_LIBRARY_TARGET PROTOBUF_COMPILER)
ProtobufAlt REQUIRED_VARS _PAIMON_PROTOBUF_LIBRARY_TARGET PROTOBUF_INCLUDE_DIR
PROTOBUF_COMPILER)
if(ProtobufAlt_FOUND)
get_target_property(PROTOBUF_INCLUDE_DIR ${_PAIMON_PROTOBUF_LIBRARY_TARGET}
INTERFACE_INCLUDE_DIRECTORIES)

if(NOT TARGET libprotobuf)
add_library(libprotobuf INTERFACE IMPORTED)
if(PROTOBUF_INCLUDE_DIR)
set_target_properties(libprotobuf PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${PROTOBUF_INCLUDE_DIR}")
endif()
set_target_properties(libprotobuf PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${PROTOBUF_INCLUDE_DIR}")
target_link_libraries(libprotobuf
INTERFACE ${_PAIMON_PROTOBUF_LIBRARY_TARGET})
endif()

if(_PAIMON_PROTOC_LIBRARY_TARGET AND NOT TARGET libprotoc)
add_library(libprotoc INTERFACE IMPORTED)
if(PROTOBUF_INCLUDE_DIR)
set_target_properties(libprotoc PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${PROTOBUF_INCLUDE_DIR}")
endif()
set_target_properties(libprotoc PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${PROTOBUF_INCLUDE_DIR}")
target_link_libraries(libprotoc INTERFACE ${_PAIMON_PROTOC_LIBRARY_TARGET})
endif()

Expand Down
16 changes: 13 additions & 3 deletions cmake_modules/FindRE2Alt.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,22 @@ if(_PAIMON_RE2_ROOTS)
set(_PAIMON_RE2_FIND_ARGS HINTS ${_PAIMON_RE2_ROOTS} NO_DEFAULT_PATH)
endif()

include(FindPackageUtils)
find_package(re2 CONFIG QUIET ${_PAIMON_RE2_FIND_ARGS})

if(TARGET re2::re2)
get_target_property(RE2_INCLUDE_DIR re2::re2 INTERFACE_INCLUDE_DIRECTORIES)
set(RE2_LIBRARIES re2::re2)
set(RE2Alt_FOUND TRUE)
paimon_find_target_headers(RE2_INCLUDE_DIR
re2::re2
NAMES
re2/re2.h
${_PAIMON_RE2_FIND_ARGS})

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(RE2Alt REQUIRED_VARS RE2_INCLUDE_DIR)

if(RE2Alt_FOUND)
set(RE2_LIBRARIES re2::re2)
endif()
else()
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
Expand Down
15 changes: 12 additions & 3 deletions cmake_modules/FindRapidJSONAlt.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ if(_PAIMON_RAPIDJSON_ROOTS)
set(_PAIMON_RAPIDJSON_FIND_ARGS HINTS ${_PAIMON_RAPIDJSON_ROOTS} NO_DEFAULT_PATH)
endif()

include(FindPackageUtils)
find_package(RapidJSON CONFIG QUIET ${_PAIMON_RAPIDJSON_FIND_ARGS})

set(_PAIMON_RAPIDJSON_TARGETS RapidJSON RapidJSON::RapidJSON)
Expand All @@ -29,12 +30,20 @@ foreach(_target IN LISTS _PAIMON_RAPIDJSON_TARGETS)
endforeach()

if(_PAIMON_RAPIDJSON_TARGET)
if(NOT TARGET RapidJSON)
paimon_find_target_headers(RAPIDJSON_INCLUDE_DIR
${_PAIMON_RAPIDJSON_TARGET}
NAMES
rapidjson/rapidjson.h
${_PAIMON_RAPIDJSON_FIND_ARGS})

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(RapidJSONAlt REQUIRED_VARS RAPIDJSON_INCLUDE_DIR)

if(RapidJSONAlt_FOUND AND NOT TARGET RapidJSON)
add_library(RapidJSON INTERFACE IMPORTED)
target_include_directories(RapidJSON INTERFACE "${RAPIDJSON_INCLUDE_DIR}")
target_link_libraries(RapidJSON INTERFACE ${_PAIMON_RAPIDJSON_TARGET})
endif()
get_target_property(RAPIDJSON_INCLUDE_DIR RapidJSON INTERFACE_INCLUDE_DIRECTORIES)
set(RapidJSONAlt_FOUND TRUE)
else()
find_path(RAPIDJSON_INCLUDE_DIR
NAMES rapidjson/rapidjson.h ${_PAIMON_RAPIDJSON_FIND_ARGS}
Expand Down
25 changes: 16 additions & 9 deletions cmake_modules/FindSnappyAlt.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ if(_PAIMON_SNAPPY_ROOTS)
set(_PAIMON_SNAPPY_FIND_ARGS HINTS ${_PAIMON_SNAPPY_ROOTS} NO_DEFAULT_PATH)
endif()

include(FindPackageUtils)
find_package(Snappy CONFIG QUIET ${_PAIMON_SNAPPY_FIND_ARGS})

set(_PAIMON_SNAPPY_TARGETS Snappy::snappy snappy::snappy)
Expand All @@ -29,18 +30,24 @@ foreach(_target IN LISTS _PAIMON_SNAPPY_TARGETS)
endforeach()

if(_PAIMON_SNAPPY_TARGET)
get_target_property(SNAPPY_INCLUDE_DIR ${_PAIMON_SNAPPY_TARGET}
INTERFACE_INCLUDE_DIRECTORIES)
if(NOT TARGET snappy)
paimon_find_target_headers(SNAPPY_INCLUDE_DIR
${_PAIMON_SNAPPY_TARGET}
NAMES
snappy.h
${_PAIMON_SNAPPY_FIND_ARGS})

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SnappyAlt REQUIRED_VARS SNAPPY_INCLUDE_DIR)

if(SnappyAlt_FOUND AND NOT TARGET snappy)
add_library(snappy INTERFACE IMPORTED)
if(SNAPPY_INCLUDE_DIR)
set_target_properties(snappy PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${SNAPPY_INCLUDE_DIR}")
endif()
set_target_properties(snappy PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${SNAPPY_INCLUDE_DIR}")
target_link_libraries(snappy INTERFACE ${_PAIMON_SNAPPY_TARGET})
endif()
set(SNAPPY_LIBRARIES ${_PAIMON_SNAPPY_TARGET})
set(SnappyAlt_FOUND TRUE)
if(SnappyAlt_FOUND)
set(SNAPPY_LIBRARIES ${_PAIMON_SNAPPY_TARGET})
endif()
else()
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
Expand Down
22 changes: 14 additions & 8 deletions cmake_modules/FindTBBAlt.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ if(_PAIMON_TBB_ROOTS)
set(_PAIMON_TBB_FIND_ARGS HINTS ${_PAIMON_TBB_ROOTS} NO_DEFAULT_PATH)
endif()

include(FindPackageUtils)
find_package(TBB CONFIG QUIET ${_PAIMON_TBB_FIND_ARGS})

set(_PAIMON_TBB_TARGETS TBB::tbb tbb)
Expand All @@ -29,17 +30,22 @@ foreach(_target IN LISTS _PAIMON_TBB_TARGETS)
endforeach()

if(_PAIMON_TBB_TARGET)
if(NOT TARGET tbb)
paimon_find_target_headers(TBB_INCLUDE_DIR
${_PAIMON_TBB_TARGET}
NAMES
tbb/tbb.h
oneapi/tbb/tbb.h
${_PAIMON_TBB_FIND_ARGS})

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(TBBAlt REQUIRED_VARS TBB_INCLUDE_DIR)

if(TBBAlt_FOUND AND NOT TARGET tbb)
add_library(tbb INTERFACE IMPORTED)
get_target_property(TBB_INCLUDE_DIR ${_PAIMON_TBB_TARGET}
INTERFACE_INCLUDE_DIRECTORIES)
if(TBB_INCLUDE_DIR)
set_target_properties(tbb PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${TBB_INCLUDE_DIR}")
endif()
set_target_properties(tbb PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${TBB_INCLUDE_DIR}")
target_link_libraries(tbb INTERFACE ${_PAIMON_TBB_TARGET})
endif()
set(TBBAlt_FOUND TRUE)
else()
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
Expand Down
Loading
Loading