cmake: Fix pybind11_protobuf integration

This commit is contained in:
Corentin Le Molgat
2024-07-19 14:49:07 +02:00
parent 3d0d015323
commit 8a1110e612
2 changed files with 108 additions and 5 deletions

View File

@@ -99,6 +99,10 @@ endif()
# Check language Dependencies
if(BUILD_PYTHON)
if(NOT TARGET pybind11::pybind11_headers)
message(FATAL_ERROR "Target pybind11::pybind11_headers not available.")
endif()
if(NOT TARGET pybind11_abseil::absl_casters)
message(FATAL_ERROR "Target pybind11_abseil::absl_casters not available.")
endif()

View File

@@ -1,8 +1,8 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2139dc0..1942ad0 100644
index 2139dc0..df3f30a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -27,7 +27,7 @@ include(CTest)
@@ -27,58 +27,64 @@ include(CTest)
# ============================================================================
# Find Python
@@ -11,7 +11,106 @@ index 2139dc0..1942ad0 100644
# ============================================================================
# Build dependencies
@@ -87,8 +87,10 @@ pybind11_add_module(
+include(FetchContent)
-if(USE_SYSTEM_ABSEIL)
- # Version omitted, as absl only allows EXACT version matches
- set(_absl_package_args REQUIRED)
-else()
- set(_absl_package_args 20230125)
-endif()
-if(USE_SYSTEM_PROTOBUF)
- set(_protobuf_package_args 4.23.3 REQUIRED)
-else()
- set(_protobuf_package_args 4.23.3)
-endif()
-if(USE_SYSTEM_PYBIND)
- set(_pybind11_package_args 2.11.1 REQUIRED)
-else()
- set(_pybind11_package_args 2.11.1)
+message(CHECK_START "Checking for external dependencies")
+list(APPEND CMAKE_MESSAGE_INDENT " ")
+
+if(NOT TARGET absl::base)
+ if(USE_SYSTEM_ABSEIL)
+ # Version omitted, as absl only allows EXACT version matches
+ set(_absl_package_args REQUIRED)
+ else()
+ set(_absl_package_args 20230125)
+ endif()
+ FetchContent_Declare(
+ absl
+ GIT_REPOSITORY "https://github.com/abseil/abseil-cpp.git"
+ GIT_TAG 20230125.3
+ FIND_PACKAGE_ARGS ${_absl_package_args} NAMES absl)
+ set(ABSL_PROPAGATE_CXX_STD ON)
+ set(ABSL_ENABLE_INSTALL ON)
+ FetchContent_MakeAvailable(absl)
endif()
-set(ABSL_PROPAGATE_CXX_STD ON)
-set(ABSL_ENABLE_INSTALL ON)
+if(NOT TARGET protobuf::libprotobuf)
+ if(USE_SYSTEM_PROTOBUF)
+ set(_protobuf_package_args 4.23.3 REQUIRED)
+ else()
+ set(_protobuf_package_args 4.23.3)
+ endif()
+ FetchContent_Declare(
+ Protobuf
+ GIT_REPOSITORY "https://github.com/protocolbuffers/protobuf.git"
+ GIT_TAG v23.3
+ GIT_SUBMODULES ""
+ FIND_PACKAGE_ARGS ${_protobuf_package_args} NAMES protobuf)
+ set(protobuf_BUILD_TESTS OFF CACHE INTERNAL "")
+ FetchContent_MakeAvailable(Protobuf)
+endif()
-include(FetchContent)
-FetchContent_Declare(
- absl
- GIT_REPOSITORY "https://github.com/abseil/abseil-cpp.git"
- GIT_TAG 20230125.3
- FIND_PACKAGE_ARGS ${_absl_package_args} NAMES absl)
-
-# cmake-format: off
-FetchContent_Declare(
- Protobuf
- GIT_REPOSITORY "https://github.com/protocolbuffers/protobuf.git"
- GIT_TAG v23.3
- GIT_SUBMODULES ""
- FIND_PACKAGE_ARGS ${_protobuf_package_args} NAMES protobuf)
-set(protobuf_BUILD_TESTS OFF CACHE INTERNAL "")
-# cmake-format: on
-
-FetchContent_Declare(
- pybind11
- GIT_REPOSITORY "https://github.com/pybind/pybind11.git"
- GIT_TAG v2.11.1
- FIND_PACKAGE_ARGS ${_pybind11_package_args} NAMES pybind11)
+if(NOT TARGET pybind11::pybind11_headers)
+ if(USE_SYSTEM_PYBIND)
+ set(_pybind11_package_args 2.11.1 REQUIRED)
+ else()
+ set(_pybind11_package_args 2.11.1)
+ endif()
+ FetchContent_Declare(
+ pybind11
+ GIT_REPOSITORY "https://github.com/pybind/pybind11.git"
+ GIT_TAG v2.11.1
+ FIND_PACKAGE_ARGS ${_pybind11_package_args} NAMES pybind11)
+ FetchContent_MakeAvailable(pybind11)
+endif()
-message(CHECK_START "Checking for external dependencies")
-list(APPEND CMAKE_MESSAGE_INDENT " ")
-FetchContent_MakeAvailable(absl Protobuf pybind11)
list(POP_BACK CMAKE_MESSAGE_INDENT)
+message(CHECK_PASS "found")
# ============================================================================
# pybind11_proto_utils pybind11 extension module
@@ -87,8 +93,10 @@ pybind11_add_module(
pybind11_protobuf/proto_utils.h)
target_link_libraries(
@@ -24,7 +123,7 @@ index 2139dc0..1942ad0 100644
target_include_directories(
pybind11_proto_utils PRIVATE ${PROJECT_SOURCE_DIR} ${protobuf_INCLUDE_DIRS}
@@ -116,10 +118,11 @@ target_link_libraries(
@@ -116,10 +124,11 @@ target_link_libraries(
absl::optional
protobuf::libprotobuf
pybind11::pybind11
@@ -37,7 +136,7 @@ index 2139dc0..1942ad0 100644
PRIVATE ${PROJECT_SOURCE_DIR} ${protobuf_INCLUDE_DIRS} ${protobuf_SOURCE_DIR}
${pybind11_INCLUDE_DIRS})
@@ -143,7 +146,7 @@ target_link_libraries(
@@ -143,7 +152,7 @@ target_link_libraries(
absl::optional
protobuf::libprotobuf
pybind11::pybind11