File 0005-Build-and-run-the-test-cases.patch of Package failed_pybind11_protobuf
From 8eafa4af7527f4e5a03c57e26b2bff3689adb900 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20Br=C3=BCns?= <stefan.bruens@rwth-aachen.de>
Date: Sat, 15 Jun 2024 01:42:41 +0200
Subject: [PATCH 5/6] Build and run the test cases
Building and running tests was never implemented for CMake, create
the same test cases as for the Bazel build.
Use the standard "BUILD_TESTING" option (implicitly added by CTest).
---
CMakeLists.txt | 13 +++-
pybind11_protobuf/tests/CMakeLists.txt | 93 ++++++++++++++++++++++++++
2 files changed, 104 insertions(+), 2 deletions(-)
create mode 100644 pybind11_protobuf/tests/CMakeLists.txt
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8d0fda9..4514f34 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,12 +16,15 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# ============================================================================
# Options
-option(BUILD_TESTS "Build tests." OFF)
option(ENABLE_PYPROTO_API "Enable usage of proto_api." OFF)
option(USE_SYSTEM_ABSEIL "Force usage of system provided abseil-cpp" OFF)
option(USE_SYSTEM_PROTOBUF "Force usage of system provided Protobuf" OFF)
option(USE_SYSTEM_PYBIND "Force usage of system provided pybind11" OFF)
+# ============================================================================
+# Testing
+include(CTest)
+
# ============================================================================
# Find Python
@@ -57,13 +60,15 @@ FetchContent_Declare(
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 "" #
+ GIT_SUBMODULES ""
FIND_PACKAGE_ARGS ${_protobuf_package_args} NAMES protobuf)
set(protobuf_BUILD_TESTS OFF CACHE INTERNAL "")
+# cmake-format: on
FetchContent_Declare(
pybind11
@@ -168,6 +173,10 @@ target_include_directories(
PRIVATE ${PROJECT_SOURCE_DIR} ${protobuf_INCLUDE_DIRS} ${protobuf_SOURCE_DIR}
${pybind11_INCLUDE_DIRS})
+if(BUILD_TESTING)
+ add_subdirectory(pybind11_protobuf/tests)
+endif()
+
# bazel equivs. checklist
#
# bazel: pybind_library: enum_type_caster - enum_type_caster.h
diff --git a/pybind11_protobuf/tests/CMakeLists.txt b/pybind11_protobuf/tests/CMakeLists.txt
new file mode 100644
index 0000000..28bddf9
--- /dev/null
+++ b/pybind11_protobuf/tests/CMakeLists.txt
@@ -0,0 +1,93 @@
+#
+# Evaluate if Protobuf uses the system package, otherwise explicitly include the
+# required macro
+#
+FetchContent_GetProperties(Protobuf SOURCE_DIR Protobuf_SOURCE_DIR)
+if(Protobuf_SOURCE_DIR)
+ # Use macros from content made available by FetchContent
+ include(${Protobuf_SOURCE_DIR}/cmake/protobuf-generate.cmake)
+endif()
+
+# cmake-format: off
+function(generate_cc_proto protoname)
+ # Generate C++ files (.pb.h, .pb.cc)
+ #
+ add_library(${protoname}_cc_proto OBJECT)
+ target_include_directories(${protoname}_cc_proto
+ PRIVATE $<TARGET_PROPERTY:protobuf::libprotobuf,INCLUDE_DIRECTORIES>
+ $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>)
+ protobuf_generate(
+ TARGET ${protoname}_cc_proto
+ PROTOS ${CMAKE_SOURCE_DIR}/pybind11_protobuf/tests/${protoname}.proto
+ IMPORT_DIRS ${CMAKE_SOURCE_DIR}
+ PROTOC_OUT_DIR ${CMAKE_BINARY_DIR})
+endfunction()
+
+function(generate_py_proto protoname)
+ # Generate Python files (_pb2.py)
+ #
+ add_custom_target(${protoname}_py_pb2 ALL)
+ protobuf_generate(
+ TARGET ${protoname}_py_pb2
+ LANGUAGE PYTHON
+ PROTOS ${CMAKE_SOURCE_DIR}/pybind11_protobuf/tests/${protoname}.proto
+ IMPORT_DIRS ${CMAKE_SOURCE_DIR}
+ PROTOC_OUT_DIR ${CMAKE_BINARY_DIR})
+endfunction()
+# cmake-format: on
+
+generate_cc_proto("test")
+generate_cc_proto("extension")
+generate_cc_proto("extension_nest_repeated")
+generate_cc_proto("extension_in_other_file_in_deps")
+generate_cc_proto("extension_in_other_file")
+
+generate_py_proto("test")
+generate_py_proto("extension")
+generate_py_proto("extension_nest_repeated")
+generate_py_proto("extension_in_other_file_in_deps")
+generate_py_proto("extension_in_other_file")
+
+function(generate_extension modulename deps)
+ pybind11_add_module(${modulename}_module ${modulename}_module.cc)
+ add_dependencies(${modulename}_module ${deps})
+ target_include_directories(${modulename}_module #
+ PRIVATE ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR})
+ target_link_libraries(${modulename}_module #
+ PRIVATE protobuf::libprotobuf ${deps})
+endfunction()
+
+generate_extension(proto_enum "test_cc_proto")
+generate_extension(dynamic_message "pybind11_native_proto_caster")
+generate_extension(
+ extension #
+ "extension_in_other_file_in_deps_cc_proto;extension_nest_repeated_cc_proto;test_cc_proto;extension_cc_proto;pybind11_native_proto_caster"
+)
+generate_extension(message "test_cc_proto;pybind11_native_proto_caster")
+generate_extension(pass_by "test_cc_proto;pybind11_native_proto_caster")
+generate_extension(very_large_proto "pybind11_native_proto_caster")
+generate_extension(wrapped_proto "test_cc_proto;pybind11_wrapped_proto_caster")
+generate_extension(thread "test_cc_proto;pybind11_native_proto_caster")
+generate_extension(regression_wrappers "pybind11_native_proto_caster")
+
+function(add_py_test testname)
+ add_test(NAME ${testname}_test
+ COMMAND ${Python_EXECUTABLE}
+ ${CMAKE_CURRENT_SOURCE_DIR}/${testname}_test.py)
+ set_property(TEST ${testname}_test #
+ PROPERTY ENVIRONMENT "PYTHONPATH=${CMAKE_BINARY_DIR}")
+endfunction()
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/compare.py
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+
+add_py_test(proto_enum)
+add_py_test(dynamic_message)
+add_py_test(extension)
+# FIXME What is the difference to the "extension_test"?
+# add_py_test(extension_disallow_unknown_fields)
+add_py_test(message)
+add_py_test(pass_by)
+add_py_test(wrapped_proto_module)
+add_py_test(thread_module)
+add_py_test(regression_wrappers)
--
2.45.0