Skip to content
Closed
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
53 changes: 35 additions & 18 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,29 @@ if (_REFLECTCPP_NEEDS_JSON_IMPL)
endif ()
endif ()

# Links reflectcpp against one of the given targets: the first one that is the same kind of
# library as reflectcpp (static or shared), else the first one that exists at all. Resolving
# the name here instead of in a generator expression keeps the exported link interface clean.
function(reflectcpp_link_one_of)
get_target_property(wanted_type reflectcpp TYPE)
set(chosen "")
foreach(target IN LISTS ARGN)
if (TARGET "${target}")
get_target_property(type "${target}" TYPE)
if (type STREQUAL wanted_type)
set(chosen "${target}")
break()
elseif (NOT chosen)
set(chosen "${target}")
endif ()
endif ()
endforeach ()
if (NOT chosen)
message(FATAL_ERROR "None of these targets exist: ${ARGN}")
endif ()
target_link_libraries(reflectcpp PUBLIC "${chosen}")
endfunction()

if (REFLECTCPP_AVRO OR REFLECTCPP_CHECK_HEADERS)
list(APPEND REFLECT_CPP_SOURCES
src/reflectcpp_avro.cpp
Expand Down Expand Up @@ -320,10 +343,11 @@ if (REFLECTCPP_BSON OR REFLECTCPP_CHECK_HEADERS)
list(APPEND REFLECT_CPP_SOURCES
src/reflectcpp_bson.cpp
)
if (NOT TARGET mongo::bson_static AND NOT TARGET mongo::bson_shared)
find_package(bson CONFIG REQUIRED)
if (NOT TARGET bson::static AND NOT TARGET bson::shared AND NOT TARGET mongo::bson_static AND NOT TARGET mongo::bson_shared)
# libbson < 2.0 names its package bson-1.0 and its targets mongo::bson_*
find_package(bson CONFIG REQUIRED NAMES bson bson-1.0)
endif ()
target_link_libraries(reflectcpp PRIVATE $<IF:$<TARGET_EXISTS:bson::static>,bson::static,bson::shared>)
reflectcpp_link_one_of(bson::static bson::shared mongo::bson_static mongo::bson_shared)
endif ()

if (REFLECTCPP_CAPNPROTO OR REFLECTCPP_CHECK_HEADERS)
Expand Down Expand Up @@ -365,11 +389,7 @@ if (REFLECTCPP_CSV OR REFLECTCPP_CHECK_HEADERS)
if (NOT TARGET Arrow)
find_package(Arrow CONFIG REQUIRED)
endif()
if (REFLECTCPP_USE_VCPKG)
target_link_libraries(reflectcpp PUBLIC "$<IF:$<BOOL:${ARROW_BUILD_STATIC}>,Arrow::arrow_static,Arrow::arrow_shared>")
else()
target_link_libraries(reflectcpp PUBLIC "arrow::arrow")
endif()
reflectcpp_link_one_of(Arrow::arrow_static Arrow::arrow_shared)
endif ()

if (REFLECTCPP_FLEXBUFFERS OR REFLECTCPP_CHECK_HEADERS)
Expand All @@ -379,7 +399,7 @@ if (REFLECTCPP_FLEXBUFFERS OR REFLECTCPP_CHECK_HEADERS)
if (NOT TARGET flatbuffers::flatbuffers)
find_package(flatbuffers CONFIG REQUIRED)
endif ()
target_link_libraries(reflectcpp PUBLIC flatbuffers::flatbuffers)
reflectcpp_link_one_of(flatbuffers::flatbuffers flatbuffers::flatbuffers_shared)
endif ()

if (REFLECTCPP_MSGPACK OR REFLECTCPP_CHECK_HEADERS)
Expand All @@ -389,22 +409,19 @@ if (REFLECTCPP_MSGPACK OR REFLECTCPP_CHECK_HEADERS)
if (NOT TARGET msgpack-c)
find_package(msgpack-c CONFIG REQUIRED NAMES msgpack msgpack-c msgpackc)
endif()
target_link_libraries(reflectcpp PUBLIC $<IF:$<TARGET_EXISTS:msgpack-c>,msgpack-c,$<IF:$<TARGET_EXISTS:msgpackc>,msgpackc,msgpack-c>>)
reflectcpp_link_one_of(msgpack-c msgpackc msgpack-c-static)
endif ()

if (REFLECTCPP_PARQUET OR REFLECTCPP_CHECK_HEADERS)
if (NOT TARGET Arrow)
find_package(Arrow CONFIG REQUIRED)
endif()
if (REFLECTCPP_USE_VCPKG)
if (NOT TARGET Parquet)
find_package(Parquet CONFIG REQUIRED)
endif()
target_link_libraries(reflectcpp PUBLIC "$<IF:$<BOOL:${ARROW_BUILD_STATIC}>,Arrow::arrow_static,Arrow::arrow_shared>")
target_link_libraries(reflectcpp PUBLIC "$<IF:$<BOOL:${ARROW_BUILD_STATIC}>,Parquet::parquet_static,Parquet::parquet_shared>")
else()
target_link_libraries(reflectcpp PUBLIC "arrow::arrow")
# Conan's Arrow package also provides the Parquet targets
if (NOT TARGET Parquet::parquet_static AND NOT TARGET Parquet::parquet_shared)
find_package(Parquet CONFIG REQUIRED)
endif()
reflectcpp_link_one_of(Arrow::arrow_static Arrow::arrow_shared)
reflectcpp_link_one_of(Parquet::parquet_static Parquet::parquet_shared)
endif ()

if (REFLECTCPP_TOML OR REFLECTCPP_CHECK_HEADERS)
Expand Down
2 changes: 2 additions & 0 deletions conanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ def config_options(self):
def configure(self):
if self.options.shared:
self.options.rm_safe("fPIC")
if self.options.with_csv:
self.options["arrow"].with_csv = True

def requirements(self):
self.requires("ctre/3.9.0", transitive_headers=True)
Expand Down
4 changes: 2 additions & 2 deletions reflectcpp-config.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ if (REFLECTCPP_BOOST_SERIALIZATION)
endif ()

if (REFLECTCPP_BSON)
find_dependency(bson-1.0)
find_dependency(bson NAMES bson bson-1.0)
endif ()

if (REFLECTCPP_CAPNPROTO)
Expand All @@ -60,7 +60,7 @@ if (REFLECTCPP_FLEXBUFFERS)
endif ()

if (REFLECTCPP_MSGPACK)
find_dependency(msgpack-c)
find_dependency(msgpack-c NAMES msgpack msgpack-c msgpackc)
endif()

if (REFLECTCPP_PARQUET)
Expand Down