chore(cmake): enhance gRPC configuration for Windows builds

- Added detailed logging for vcpkg toolchain detection and gRPC target verification in `grpc_windows.cmake`.
- Updated gRPC version to v1.67.1 for improved MSVC compatibility and stability.
- Enhanced target checks for `protoc` and `grpc_cpp_plugin`, providing fallbacks and clearer error messages.
- Streamlined the export of gRPC and protobuf targets to ensure proper linking in Windows builds.

Benefits:
- Improves build diagnostics and error handling for gRPC integration on Windows.
- Ensures compatibility with modern compilers and enhances overall build reliability.
This commit is contained in:
scawful
2025-10-16 09:46:08 -04:00
parent 23c617c886
commit 1115b8e1e5
2 changed files with 86 additions and 23 deletions

View File

@@ -116,16 +116,13 @@ if(APPLE AND CMAKE_OSX_ARCHITECTURES STREQUAL "arm64")
set(ABSL_BUILD_TEST_HELPERS OFF CACHE BOOL "" FORCE)
endif()
# Declare gRPC - use v1.75.1 which includes ARM64 macOS fixes and is compatible with modern compilers
# v1.75.1 includes:
# - ARM64 macOS compilation fixes (Abseil randen_hwaes)
# - MSVC/Visual Studio compatibility fixes
# - Clang 18+ compatibility
# - Updated Abseil and Protobuf dependencies
# Declare gRPC - use v1.67.1 which is proven MSVC-compatible
# v1.67.1 is stable and tested with MSVC, avoiding UPB compilation errors
# For newer features/fixes, use vcpkg which provides v1.71.0+
FetchContent_Declare(
grpc
GIT_REPOSITORY https://github.com/grpc/grpc.git
GIT_TAG v1.75.1
GIT_TAG v1.67.1
GIT_PROGRESS TRUE
GIT_SHALLOW TRUE
USES_TERMINAL_DOWNLOAD TRUE

View File

@@ -18,8 +18,23 @@ if(WIN32 AND YAZE_USE_VCPKG_GRPC)
message(STATUS "Attempting to use vcpkg gRPC packages for faster Windows builds...")
message(STATUS " Note: This is only for full builds with YAZE_WITH_GRPC=ON")
# Try to find gRPC via vcpkg
# Debug: Check if vcpkg toolchain is being used
if(DEFINED VCPKG_TOOLCHAIN)
message(STATUS " vcpkg toolchain detected: ${VCPKG_TOOLCHAIN}")
endif()
if(DEFINED CMAKE_TOOLCHAIN_FILE)
message(STATUS " CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}")
endif()
# Try to find gRPC via vcpkg (try both gRPC and grpc package names)
find_package(gRPC CONFIG QUIET)
if(NOT gRPC_FOUND)
find_package(grpc CONFIG QUIET)
if(grpc_FOUND)
set(gRPC_FOUND TRUE)
endif()
endif()
find_package(Protobuf CONFIG QUIET)
if(gRPC_FOUND AND Protobuf_FOUND)
@@ -33,32 +48,77 @@ if(WIN32 AND YAZE_USE_VCPKG_GRPC)
)
# Verify required targets exist
if(NOT TARGET grpc++)
# Verify required targets exist (check both with and without gRPC:: namespace)
set(_grpc_target_found FALSE)
if(TARGET gRPC::grpc++)
message(STATUS " Found gRPC::grpc++ target")
set(_grpc_target_found TRUE)
# Create aliases without namespace for compatibility with existing code
if(NOT TARGET grpc++)
add_library(grpc++ ALIAS gRPC::grpc++)
endif()
if(TARGET gRPC::grpc++_reflection AND NOT TARGET grpc++_reflection)
add_library(grpc++_reflection ALIAS gRPC::grpc++_reflection)
endif()
elseif(TARGET grpc++)
message(STATUS " Found grpc++ target")
set(_grpc_target_found TRUE)
endif()
if(NOT _grpc_target_found)
message(WARNING "gRPC found but grpc++ target missing - falling back to FetchContent")
message(STATUS " Available targets containing 'grpc':")
get_property(_all_targets DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY BUILDSYSTEM_TARGETS)
foreach(_target ${_all_targets})
if(_target MATCHES "grpc" OR _target MATCHES "gRPC")
message(STATUS " - ${_target}")
endif()
endforeach()
set(YAZE_GRPC_CONFIGURED FALSE PARENT_SCOPE)
return()
endif()
# Handle protoc (check for both protoc and protobuf::protoc)
if(NOT TARGET protoc)
# Create protoc target if it doesn't exist
get_target_property(PROTOC_LOCATION protobuf::protoc LOCATION)
if(PROTOC_LOCATION)
add_executable(protoc IMPORTED)
set_target_properties(protoc PROPERTIES IMPORTED_LOCATION "${PROTOC_LOCATION}")
if(TARGET protobuf::protoc)
get_target_property(PROTOC_LOCATION protobuf::protoc IMPORTED_LOCATION_RELEASE)
if(NOT PROTOC_LOCATION)
get_target_property(PROTOC_LOCATION protobuf::protoc IMPORTED_LOCATION)
endif()
if(PROTOC_LOCATION)
add_executable(protoc IMPORTED)
set_target_properties(protoc PROPERTIES IMPORTED_LOCATION "${PROTOC_LOCATION}")
message(STATUS " Found protoc at: ${PROTOC_LOCATION}")
else()
message(FATAL_ERROR "protoc executable not found in vcpkg package")
endif()
else()
message(FATAL_ERROR "protoc executable not found in vcpkg gRPC package")
message(FATAL_ERROR "protoc target not found in vcpkg gRPC package")
endif()
endif()
# Handle grpc_cpp_plugin (check for both grpc_cpp_plugin and gRPC::grpc_cpp_plugin)
if(NOT TARGET grpc_cpp_plugin)
# Find grpc_cpp_plugin
find_program(GRPC_CPP_PLUGIN grpc_cpp_plugin)
if(GRPC_CPP_PLUGIN)
add_executable(grpc_cpp_plugin IMPORTED)
set_target_properties(grpc_cpp_plugin PROPERTIES IMPORTED_LOCATION "${GRPC_CPP_PLUGIN}")
if(TARGET gRPC::grpc_cpp_plugin)
get_target_property(PLUGIN_LOCATION gRPC::grpc_cpp_plugin IMPORTED_LOCATION_RELEASE)
if(NOT PLUGIN_LOCATION)
get_target_property(PLUGIN_LOCATION gRPC::grpc_cpp_plugin IMPORTED_LOCATION)
endif()
if(PLUGIN_LOCATION)
add_executable(grpc_cpp_plugin IMPORTED)
set_target_properties(grpc_cpp_plugin PROPERTIES IMPORTED_LOCATION "${PLUGIN_LOCATION}")
message(STATUS " Found grpc_cpp_plugin at: ${PLUGIN_LOCATION}")
endif()
else()
message(FATAL_ERROR "grpc_cpp_plugin not found in vcpkg gRPC package")
# Try find_program as fallback
find_program(GRPC_CPP_PLUGIN grpc_cpp_plugin HINTS ${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools/grpc)
if(GRPC_CPP_PLUGIN)
add_executable(grpc_cpp_plugin IMPORTED)
set_target_properties(grpc_cpp_plugin PROPERTIES IMPORTED_LOCATION "${GRPC_CPP_PLUGIN}")
message(STATUS " Found grpc_cpp_plugin at: ${GRPC_CPP_PLUGIN}")
else()
message(FATAL_ERROR "grpc_cpp_plugin not found in vcpkg gRPC package")
endif()
endif()
endif()
@@ -69,7 +129,13 @@ if(WIN32 AND YAZE_USE_VCPKG_GRPC)
file(MAKE_DIRECTORY ${_gRPC_PROTO_GENS_DIR})
set(_gRPC_PROTO_GENS_DIR ${_gRPC_PROTO_GENS_DIR} PARENT_SCOPE)
# Export gRPC library targets (vcpkg uses gRPC:: namespace)
# Use the namespaced targets directly
set(_GRPC_GRPCPP_LIBRARY gRPC::grpc++)
set(_GRPC_REFLECTION_LIBRARY gRPC::grpc++_reflection)
# Export Abseil targets from vcpkg (critical for linking!)
# Note: Abseil targets use absl:: namespace consistently
set(ABSL_TARGETS
absl::base
absl::config
@@ -102,7 +168,7 @@ if(WIN32 AND YAZE_USE_VCPKG_GRPC)
PARENT_SCOPE
)
# Export protobuf targets
# Export protobuf targets (vcpkg uses protobuf:: namespace)
set(YAZE_PROTOBUF_TARGETS protobuf::libprotobuf PARENT_SCOPE)
set(YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS protobuf::libprotobuf PARENT_SCOPE)