chore: update configuration files and enhance dependency management

- Added new entries to `.pre-commit-config.yaml`, `cmake-format.yaml`, and `.github/dependabot.yml` to improve code quality checks and dependency updates.
- Enhanced GitHub Actions workflows by adding new steps for testing and build retention.
- Introduced support for the nlohmann_json library in CMake, allowing for conditional inclusion based on the `YAZE_ENABLE_JSON` option.
- Updated CMake configurations to streamline SDL2 and gRPC integration, ensuring proper linking and target management.

Benefits:
- Improves code quality and consistency through automated checks and formatting.
- Enhances dependency management and build reliability across platforms.
- Provides flexibility for users to enable optional features, improving overall functionality.
This commit is contained in:
scawful
2025-10-31 20:20:31 -04:00
parent d07c0abae8
commit ef07dc0012
40 changed files with 465 additions and 332 deletions

View File

@@ -27,45 +27,57 @@ if(YAZE_USE_SYSTEM_DEPS)
endif()
endif()
# Set gRPC options before adding package
set(gRPC_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(gRPC_BUILD_CODEGEN ON CACHE BOOL "" FORCE)
set(gRPC_BUILD_GRPC_CPP_PLUGIN ON CACHE BOOL "" FORCE)
set(gRPC_BUILD_CSHARP_EXT OFF CACHE BOOL "" FORCE)
set(gRPC_BUILD_GRPC_CSHARP_PLUGIN OFF CACHE BOOL "" FORCE)
set(gRPC_BUILD_GRPC_NODE_PLUGIN OFF CACHE BOOL "" FORCE)
set(gRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN OFF CACHE BOOL "" FORCE)
set(gRPC_BUILD_GRPC_PHP_PLUGIN OFF CACHE BOOL "" FORCE)
set(gRPC_BUILD_GRPC_PYTHON_PLUGIN OFF CACHE BOOL "" FORCE)
set(gRPC_BUILD_GRPC_RUBY_PLUGIN OFF CACHE BOOL "" FORCE)
set(gRPC_BUILD_REFLECTION OFF CACHE BOOL "" FORCE)
set(gRPC_BUILD_GRPC_REFLECTION OFF CACHE BOOL "" FORCE)
set(gRPC_BUILD_GRPC_CPP_REFLECTION OFF CACHE BOOL "" FORCE)
set(gRPC_BUILD_GRPCPP_REFLECTION OFF CACHE BOOL "" FORCE)
set(gRPC_BENCHMARK_PROVIDER "none" CACHE STRING "" FORCE)
set(gRPC_ZLIB_PROVIDER "package" CACHE STRING "" FORCE)
set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "" FORCE)
set(gRPC_ABSL_PROVIDER "module" CACHE STRING "" FORCE)
set(protobuf_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(protobuf_BUILD_CONFORMANCE OFF CACHE BOOL "" FORCE)
set(protobuf_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(protobuf_BUILD_PROTOC_BINARIES ON CACHE BOOL "" FORCE)
set(protobuf_WITH_ZLIB ON CACHE BOOL "" FORCE)
set(ABSL_PROPAGATE_CXX_STD ON CACHE BOOL "" FORCE)
set(ABSL_ENABLE_INSTALL ON CACHE BOOL "" FORCE)
set(ABSL_BUILD_TESTING OFF CACHE BOOL "" FORCE)
set(utf8_range_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(utf8_range_INSTALL OFF CACHE BOOL "" FORCE)
# Use CPM to fetch gRPC with bundled dependencies
CPMAddPackage(
NAME grpc
VERSION ${GRPC_VERSION}
GITHUB_REPOSITORY grpc/grpc
GIT_TAG v${GRPC_VERSION}
OPTIONS
"gRPC_BUILD_TESTS OFF"
"gRPC_BUILD_CODEGEN ON"
"gRPC_BUILD_GRPC_CPP_PLUGIN ON"
"gRPC_BUILD_CSHARP_EXT OFF"
"gRPC_BUILD_GRPC_CSHARP_PLUGIN OFF"
"gRPC_BUILD_GRPC_NODE_PLUGIN OFF"
"gRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN OFF"
"gRPC_BUILD_GRPC_PHP_PLUGIN OFF"
"gRPC_BUILD_GRPC_PYTHON_PLUGIN OFF"
"gRPC_BUILD_GRPC_RUBY_PLUGIN OFF"
"gRPC_BUILD_REFLECTION OFF"
"gRPC_BUILD_GRPC_REFLECTION OFF"
"gRPC_BUILD_GRPC_CPP_REFLECTION OFF"
"gRPC_BUILD_GRPCPP_REFLECTION OFF"
"gRPC_BENCHMARK_PROVIDER none"
"gRPC_ZLIB_PROVIDER package"
"gRPC_PROTOBUF_PROVIDER module"
"gRPC_ABSL_PROVIDER module"
"protobuf_BUILD_TESTS OFF"
"protobuf_BUILD_CONFORMANCE OFF"
"protobuf_BUILD_EXAMPLES OFF"
"protobuf_BUILD_PROTOC_BINARIES ON"
"protobuf_WITH_ZLIB ON"
"ABSL_PROPAGATE_CXX_STD ON"
"ABSL_ENABLE_INSTALL ON"
"ABSL_BUILD_TESTING OFF"
"utf8_range_BUILD_TESTS OFF"
"utf8_range_INSTALL OFF"
)
# Check which target naming convention is used
if(TARGET grpc++)
message(STATUS "Found non-namespaced gRPC target grpc++")
if(NOT TARGET grpc::grpc++)
add_library(grpc::grpc++ ALIAS grpc++)
endif()
if(NOT TARGET grpc::grpc++_reflection AND TARGET grpc++_reflection)
add_library(grpc::grpc++_reflection ALIAS grpc++_reflection)
endif()
endif()
# Verify gRPC targets are available
if(NOT TARGET grpc::grpc++)
if(NOT TARGET grpc++ AND NOT TARGET grpc::grpc++)
message(FATAL_ERROR "gRPC target not found after CPM fetch")
endif()
@@ -77,14 +89,30 @@ if(NOT TARGET grpc_cpp_plugin)
message(FATAL_ERROR "grpc_cpp_plugin target not found after gRPC setup")
endif()
# Create convenience targets for the rest of the project
add_library(yaze_grpc_support INTERFACE)
target_link_libraries(yaze_grpc_support INTERFACE
# Create convenience interface for basic gRPC linking (renamed to avoid conflict with yaze_grpc_support STATIC library)
add_library(yaze_grpc_deps INTERFACE)
target_link_libraries(yaze_grpc_deps INTERFACE
grpc::grpc++
grpc::grpc++_reflection
protobuf::libprotobuf
)
# Export Abseil targets that are commonly used
set(ABSL_TARGETS
absl::base
absl::config
absl::core_headers
absl::flags
absl::flags_parse
absl::status
absl::statusor
absl::strings
absl::str_format
absl::synchronization
absl::time
PARENT_SCOPE
)
# Export gRPC targets for use in other CMake files
set(YAZE_GRPC_TARGETS
grpc::grpc++
@@ -96,3 +124,91 @@ set(YAZE_GRPC_TARGETS
)
message(STATUS "gRPC setup complete - targets available: ${YAZE_GRPC_TARGETS}")
# Setup protobuf generation directory (use CACHE so it's available in functions)
set(_gRPC_PROTO_GENS_DIR ${CMAKE_BINARY_DIR}/gens CACHE INTERNAL "Protobuf generated files directory")
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/gens)
# Get protobuf include directories (extract from generator expression or direct path)
if(TARGET libprotobuf)
get_target_property(_PROTOBUF_INCLUDE_DIRS libprotobuf INTERFACE_INCLUDE_DIRECTORIES)
# Handle generator expressions
string(REGEX REPLACE "\\$<BUILD_INTERFACE:([^>]+)>" "\\1" _PROTOBUF_INCLUDE_DIR_CLEAN "${_PROTOBUF_INCLUDE_DIRS}")
list(GET _PROTOBUF_INCLUDE_DIR_CLEAN 0 _gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR)
set(_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR ${_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR} CACHE INTERNAL "Protobuf include directory")
elseif(TARGET protobuf::libprotobuf)
get_target_property(_PROTOBUF_INCLUDE_DIRS protobuf::libprotobuf INTERFACE_INCLUDE_DIRECTORIES)
string(REGEX REPLACE "\\$<BUILD_INTERFACE:([^>]+)>" "\\1" _PROTOBUF_INCLUDE_DIR_CLEAN "${_PROTOBUF_INCLUDE_DIRS}")
list(GET _PROTOBUF_INCLUDE_DIR_CLEAN 0 _gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR)
set(_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR ${_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR} CACHE INTERNAL "Protobuf include directory")
endif()
message(STATUS "Protobuf gens dir: ${_gRPC_PROTO_GENS_DIR}")
message(STATUS "Protobuf include dir: ${_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR}")
# Export protobuf targets
set(YAZE_PROTOBUF_TARGETS
protobuf::libprotobuf
PARENT_SCOPE
)
# Function to add protobuf/gRPC code generation to a target
function(target_add_protobuf target)
if(NOT TARGET ${target})
message(FATAL_ERROR "Target ${target} doesn't exist")
endif()
if(NOT ARGN)
message(SEND_ERROR "Error: target_add_protobuf() called without any proto files")
return()
endif()
set(_protobuf_include_path -I ${CMAKE_SOURCE_DIR}/src -I ${_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR})
foreach(FIL ${ARGN})
get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
get_filename_component(FIL_WE ${FIL} NAME_WE)
file(RELATIVE_PATH REL_FIL ${CMAKE_SOURCE_DIR}/src ${ABS_FIL})
get_filename_component(REL_DIR ${REL_FIL} DIRECTORY)
if(NOT REL_DIR OR REL_DIR STREQUAL ".")
set(RELFIL_WE "${FIL_WE}")
else()
set(RELFIL_WE "${REL_DIR}/${FIL_WE}")
endif()
message(STATUS " Proto file: ${FIL_WE}")
message(STATUS " ABS_FIL = ${ABS_FIL}")
message(STATUS " REL_FIL = ${REL_FIL}")
message(STATUS " REL_DIR = ${REL_DIR}")
message(STATUS " RELFIL_WE = ${RELFIL_WE}")
message(STATUS " Output = ${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h")
add_custom_command(
OUTPUT "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc"
"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h"
"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}_mock.grpc.pb.h"
"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc"
"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h"
COMMAND $<TARGET_FILE:protoc>
ARGS --grpc_out=generate_mock_code=true:${_gRPC_PROTO_GENS_DIR}
--cpp_out=${_gRPC_PROTO_GENS_DIR}
--plugin=protoc-gen-grpc=$<TARGET_FILE:grpc_cpp_plugin>
${_protobuf_include_path}
${ABS_FIL}
DEPENDS ${ABS_FIL} protoc grpc_cpp_plugin
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src
COMMENT "Running gRPC C++ protocol buffer compiler on ${FIL}"
VERBATIM)
target_sources(${target} PRIVATE
"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc"
"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h"
"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}_mock.grpc.pb.h"
"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc"
"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h"
)
target_include_directories(${target} PUBLIC
$<BUILD_INTERFACE:${_gRPC_PROTO_GENS_DIR}>
$<BUILD_INTERFACE:${_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR}>
)
endforeach()
endfunction()