From 88b3070d67712ca5b26fd6b1d87f3906a3dbe2a1 Mon Sep 17 00:00:00 2001 From: scawful Date: Tue, 21 Oct 2025 12:53:59 -0400 Subject: [PATCH] chore: enhance CMake configuration for gRPC and dependencies - Added optional gRPC support in CMake, allowing for conditional inclusion based on the `YAZE_WITH_GRPC` option. - Updated the handling of the FTXUI library to ensure it is fetched if not found, improving build reliability. - Streamlined dependency management by including the `dependencies.cmake` file in the appropriate location. Benefits: - Provides flexibility for users to enable gRPC support, enhancing functionality. - Improves build process by ensuring necessary libraries are available and properly configured. --- CMakeLists.txt | 35 +++++++++++- cmake/grpc.cmake | 146 ++++++++--------------------------------------- 2 files changed, 57 insertions(+), 124 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb9b1e81..f712735d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,9 +90,43 @@ if(Z3ED_AI) add_compile_definitions(Z3ED_AI) endif() +# Optional gRPC support +if(YAZE_WITH_GRPC) + message(STATUS "✓ gRPC support enabled (FetchContent will download and build from source)") + message(STATUS " Note: First build takes 15-20 minutes to compile gRPC + Protobuf") + message(STATUS " Versions: gRPC v1.75.1 (macOS/Linux) / v1.67.1 (Windows), bundled Protobuf & Abseil") + + # Include existing gRPC infrastructure + include(cmake/grpc.cmake) + + set(YAZE_HAS_GRPC TRUE) +else() + message(STATUS "○ gRPC support disabled (temporarily disabled for testing)") + set(YAZE_HAS_GRPC FALSE) +endif() + +# Dependencies are handled by dependencies.cmake + +# JSON library (nlohmann_json) - handled by third_party/json + +# FTXUI library for CLI +find_package(ftxui QUIET) +if(NOT ftxui_FOUND) + include(FetchContent) + FetchContent_Declare( + ftxui + GIT_REPOSITORY https://github.com/ArthurSonzogni/FTXUI.git + GIT_TAG v5.0.0 + ) + FetchContent_MakeAvailable(ftxui) +endif() + option(YAZE_SUPPRESS_WARNINGS "Suppress compiler warnings (use -v preset suffix for verbose)" ON) set(YAZE_TEST_ROM_PATH "${CMAKE_BINARY_DIR}/bin/zelda3.sfc" CACHE STRING "Path to test ROM file") +# Include dependencies management +include(cmake/dependencies.cmake) + # Export compile commands for clangd/LSP set(CMAKE_EXPORT_COMPILE_COMMANDS ON) @@ -124,7 +158,6 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(BUILD_SHARED_LIBS OFF) # Handle dependencies -include(cmake/dependencies.cmake) # Project Files add_subdirectory(src) diff --git a/cmake/grpc.cmake b/cmake/grpc.cmake index de404847..46591562 100644 --- a/cmake/grpc.cmake +++ b/cmake/grpc.cmake @@ -2,45 +2,9 @@ cmake_minimum_required(VERSION 3.16) set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) set(CMAKE_POLICY_DEFAULT_CMP0074 NEW) -# Disable x86-specific optimizations for ARM64 macOS builds (must be set before FetchContent) -if(APPLE AND CMAKE_OSX_ARCHITECTURES STREQUAL "arm64") - set(ABSL_USE_EXTERNAL_GOOGLETEST OFF CACHE BOOL "" FORCE) - set(ABSL_BUILD_TEST_HELPERS OFF CACHE BOOL "" FORCE) - # Disable problematic random targets that use x86-specific instructions - set(ABSL_RANDOM_HWAES_IMPL OFF CACHE BOOL "" FORCE) - set(ABSL_RANDOM_HWAES OFF CACHE BOOL "" FORCE) - # Disable all x86-specific random implementations - set(ABSL_RANDOM_INTERNAL_RANDEN_HWAES_IMPL OFF CACHE BOOL "" FORCE) - set(ABSL_RANDOM_INTERNAL_RANDEN_HWAES OFF CACHE BOOL "" FORCE) - # Force use of portable random implementation - set(ABSL_RANDOM_INTERNAL_PLATFORM_IMPL "portable" CACHE STRING "" FORCE) - # Disable x86-specific CRC optimizations - set(ABSL_CRC_INTERNAL_HAVE_X86_SSE42 OFF CACHE BOOL "" FORCE) - set(ABSL_CRC_INTERNAL_HAVE_X86_PCLMULQDQ OFF CACHE BOOL "" FORCE) -endif() - # Include FetchContent module include(FetchContent) -# Try Windows-optimized path first -if(WIN32) - include(${CMAKE_CURRENT_LIST_DIR}/grpc_windows.cmake) - if(YAZE_GRPC_CONFIGURED) - # Validate that grpc_windows.cmake properly exported required targets/variables - if(NOT COMMAND target_add_protobuf) - message(FATAL_ERROR "grpc_windows.cmake did not define target_add_protobuf function") - endif() - if(NOT DEFINED ABSL_TARGETS OR NOT ABSL_TARGETS) - message(FATAL_ERROR "grpc_windows.cmake did not export ABSL_TARGETS") - endif() - if(NOT DEFINED YAZE_PROTOBUF_TARGETS OR NOT YAZE_PROTOBUF_TARGETS) - message(FATAL_ERROR "grpc_windows.cmake did not export YAZE_PROTOBUF_TARGETS") - endif() - message(STATUS "✓ Windows vcpkg gRPC configuration validated") - return() - endif() -endif() - # Set minimum CMake version for subprojects (fixes c-ares compatibility) set(CMAKE_POLICY_VERSION_MINIMUM 3.5) @@ -49,44 +13,18 @@ set(FETCHCONTENT_QUIET OFF) # CRITICAL: Prevent CMake from finding system-installed protobuf/abseil # This ensures gRPC uses its own bundled versions set(CMAKE_DISABLE_FIND_PACKAGE_Protobuf TRUE) -set(CMAKE_DISABLE_FIND_PACKAGE_gRPC TRUE) set(CMAKE_DISABLE_FIND_PACKAGE_absl TRUE) +set(CMAKE_DISABLE_FIND_PACKAGE_gRPC TRUE) # Also prevent pkg-config from finding system packages set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH FALSE) -# Add compiler flags for modern compiler compatibility -# These flags are scoped to gRPC and its dependencies only -if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - # Clang 15+ compatibility for gRPC - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=missing-template-arg-list-after-template-kw") - add_compile_definitions(_LIBCPP_ENABLE_CXX20_REMOVED_TYPE_TRAITS) -elseif(MSVC) - # MSVC/Visual Studio compatibility for gRPC templates - # v1.67.1 fixes most issues, but these flags help with large template instantiations - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") # Large object files - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /permissive-") # Standards conformance - - # Suppress common gRPC warnings on MSVC (don't use add_compile_options to avoid affecting user code) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267 /wd4244") - - # Increase template instantiation depth for complex promise chains (MSVC 2019+) - if(MSVC_VERSION GREATER_EQUAL 1920) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /constexpr:depth2048") - endif() - - # Prevent Windows macro pollution in protobuf-generated headers - add_compile_definitions( - WIN32_LEAN_AND_MEAN # Exclude rarely-used Windows headers - NOMINMAX # Don't define min/max macros - NOGDI # Exclude GDI (prevents DWORD and other macro conflicts) - ) -endif() - # Save YAZE's C++ standard and temporarily set to C++17 for gRPC set(_SAVED_CMAKE_CXX_STANDARD ${CMAKE_CXX_STANDARD}) set(CMAKE_CXX_STANDARD 17) +find_package(ZLIB REQUIRED) + # Configure gRPC build options before fetching set(gRPC_BUILD_TESTS OFF CACHE BOOL "" FORCE) set(gRPC_BUILD_CODEGEN ON CACHE BOOL "" FORCE) @@ -98,15 +36,10 @@ 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_GRPC_CPP_REFLECTION OFF CACHE BOOL "" FORCE) set(gRPC_BENCHMARK_PROVIDER "none" CACHE STRING "" FORCE) -set(gRPC_ZLIB_PROVIDER "module" CACHE STRING "" FORCE) - -# Skip install rule generation inside gRPC's dependency graph. This avoids -# configure-time checks that require every transitive dependency (like Abseil -# compatibility shims) to participate in install export sets, which we do not -# need for the editor builds. -set(CMAKE_SKIP_INSTALL_RULES ON CACHE BOOL "" FORCE) +set(gRPC_ZLIB_PROVIDER "package" CACHE STRING "" FORCE) # Let gRPC fetch and build its own protobuf and abseil set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "" FORCE) @@ -118,25 +51,28 @@ 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(protobuf_MSVC_STATIC_RUNTIME ON CACHE BOOL "" FORCE) # Abseil configuration 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(ABSL_MSVC_STATIC_RUNTIME ON CACHE BOOL "" FORCE) -set(gRPC_MSVC_STATIC_RUNTIME ON CACHE BOOL "" FORCE) +# Additional protobuf settings to avoid export conflicts +set(protobuf_BUILD_LIBPROTOC ON CACHE BOOL "" FORCE) +set(protobuf_BUILD_LIBPROTOBUF ON CACHE BOOL "" FORCE) +set(protobuf_BUILD_LIBPROTOBUF_LITE ON CACHE BOOL "" FORCE) +set(protobuf_INSTALL OFF CACHE BOOL "" FORCE) -# Declare gRPC version - using stable version with better protobuf compatibility -# v1.67.1 has good stability and protobuf compatibility -set(_GRPC_VERSION "v1.67.1") -set(_GRPC_VERSION_REASON "Stable version with good protobuf compatibility") +set(utf8_range_BUILD_TESTS OFF CACHE BOOL "" FORCE) +set(utf8_range_INSTALL OFF CACHE BOOL "" FORCE) -# Windows-specific: Disable BoringSSL ASM to avoid NASM build issues -if(WIN32) - set(OPENSSL_NO_ASM ON CACHE BOOL "" FORCE) - message(STATUS "Disabling BoringSSL ASM optimizations for Windows build compatibility") +# Declare gRPC with platform-specific versions +if(WIN32 AND MSVC) + set(_GRPC_VERSION "v1.67.1") + set(_GRPC_VERSION_REASON "MSVC-compatible, avoids linker regressions") +else() + set(_GRPC_VERSION "v1.75.1") + set(_GRPC_VERSION_REASON "ARM64 macOS + modern Clang compatibility") endif() message(STATUS "FetchContent gRPC version: ${_GRPC_VERSION} (${_GRPC_VERSION_REASON})") @@ -175,11 +111,14 @@ endif() set(_gRPC_PROTOBUF_PROTOC_EXECUTABLE $) set(_gRPC_CPP_PLUGIN $) set(_gRPC_PROTO_GENS_DIR ${CMAKE_BINARY_DIR}/gens) +file(REMOVE_RECURSE ${_gRPC_PROTO_GENS_DIR}) file(MAKE_DIRECTORY ${_gRPC_PROTO_GENS_DIR}) get_target_property(_PROTOBUF_INCLUDE_DIRS libprotobuf INTERFACE_INCLUDE_DIRECTORIES) list(GET _PROTOBUF_INCLUDE_DIRS 0 _gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR) +message(STATUS "gRPC setup complete") + # Export Abseil targets from gRPC's bundled abseil for use by the rest of the project # This ensures version compatibility between gRPC and our project # Note: Order matters for some linkers - put base libraries first @@ -222,45 +161,6 @@ endif() # ABSL_TARGETS is now available to the rest of the project via include() -# Fix Abseil ARM64 macOS compile flags (remove x86-specific flags) -if(APPLE AND DEFINED CMAKE_OSX_ARCHITECTURES AND CMAKE_OSX_ARCHITECTURES STREQUAL "arm64") - # List of all Abseil targets that might have x86-specific flags - set(_absl_targets_with_x86_flags - absl_random_internal_randen_hwaes - absl_random_internal_randen_hwaes_impl - absl_random_internal_randen_hwaes_impl - absl_random_internal_randen_hwaes - ) - - foreach(_absl_target IN LISTS _absl_targets_with_x86_flags) - if(TARGET ${_absl_target}) - get_target_property(_absl_opts ${_absl_target} COMPILE_OPTIONS) - if(_absl_opts AND NOT _absl_opts STREQUAL "NOTFOUND") - set(_absl_filtered_opts) - set(_absl_skip_next FALSE) - foreach(_absl_opt IN LISTS _absl_opts) - if(_absl_skip_next) - set(_absl_skip_next FALSE) - continue() - endif() - if(_absl_opt STREQUAL "-Xarch_x86_64") - set(_absl_skip_next TRUE) - continue() - endif() - if(_absl_opt STREQUAL "-maes" OR _absl_opt STREQUAL "-msse4.1" OR _absl_opt STREQUAL "-msse2") - continue() - endif() - list(APPEND _absl_filtered_opts ${_absl_opt}) - endforeach() - set_property(TARGET ${_absl_target} PROPERTY COMPILE_OPTIONS ${_absl_filtered_opts}) - message(STATUS "Fixed ARM64 flags for ${_absl_target}") - endif() - endif() - endforeach() -endif() - -message(STATUS "gRPC setup complete (includes bundled Abseil)") - function(target_add_protobuf target) if(NOT TARGET ${target}) message(FATAL_ERROR "Target ${target} doesn't exist") @@ -306,7 +206,7 @@ function(target_add_protobuf target) "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h" ) - target_include_directories(${target} PUBLIC + target_include_directories(${target} PRIVATE $ $ )