From db227c9de52a02cf0765b061e01607648fbbf735 Mon Sep 17 00:00:00 2001 From: scawful Date: Fri, 3 Oct 2025 20:24:58 -0400 Subject: [PATCH] feat: Update CMake configuration for Abseil and gRPC, enhance modular build support, and add CLI flag handling --- CMakeLists.txt | 2 +- CMakePresets.json | 8 +- cmake/absl.cmake | 85 +++++++++++-------- cmake/grpc.cmake | 13 ++- src/CMakeLists.txt | 6 +- src/app/app.cmake | 2 +- src/app/core/core_library.cmake | 4 + .../service/imgui_test_harness_service.cc | 78 +++++++++-------- src/cli/agent.cmake | 2 + src/cli/cli_main.cc | 3 +- src/cli/flags.cc | 5 ++ src/cli/z3ed.cmake | 1 + 12 files changed, 128 insertions(+), 81 deletions(-) create mode 100644 src/cli/flags.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ea54910..4abff737 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,7 +134,7 @@ if(YAZE_PLATFORM_MACOS) set(_yaze_default_force_absl ON) endif() option(YAZE_FORCE_BUNDLED_ABSL - "Force building the bundled Abseil submodule instead of finding a system package" + "Force building the bundled Abseil FetchContent dependency instead of finding a system package" ${_yaze_default_force_absl}) # Create a common interface target for shared settings diff --git a/CMakePresets.json b/CMakePresets.json index b94e6fe1..4365987a 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -68,6 +68,7 @@ "name": "macos-dev-z3ed-ai", "displayName": "macOS debug z3ed agent (ARM64)", "description": "macOS ARM64 development build with ROM testing", + "binaryDir": "${sourceDir}/build_test", "inherits": "macos-debug", "cacheVariables": { "YAZE_ENABLE_ROM_TESTS": "ON", @@ -365,7 +366,12 @@ { "name": "macos-dev", "configurePreset": "macos-dev", - "displayName": "macOS Development Build (ARM64)" + "displayName": "macOS debug ARM64" + }, + { + "name": "macos-dev-z3ed-ai", + "configurePreset": "macos-dev-z3ed-ai", + "displayName": "macOS debug arm64 z3ed-ai" }, { "name": "ci", diff --git a/cmake/absl.cmake b/cmake/absl.cmake index 9525c752..557902a9 100644 --- a/cmake/absl.cmake +++ b/cmake/absl.cmake @@ -1,34 +1,45 @@ -# Normalize Abseil's hardware AES flags when targeting macOS ARM64 only. -if(APPLE AND DEFINED CMAKE_OSX_ARCHITECTURES AND CMAKE_OSX_ARCHITECTURES STREQUAL "arm64") - set(ABSL_RANDOM_HWAES_X64_FLAGS "" CACHE STRING "" FORCE) - set(ABSL_RANDOM_HWAES_ARM64_FLAGS "-march=armv8-a+crypto" CACHE STRING "" FORCE) -endif() +# Abseil release to use when fetching from source +set(YAZE_ABSL_GIT_TAG "20240116.2" CACHE STRING "Abseil release tag used when fetching from source") -if (MINGW OR WIN32 OR YAZE_FORCE_BUNDLED_ABSL) - add_subdirectory(src/lib/abseil-cpp) -elseif(YAZE_MINIMAL_BUILD) - # For CI builds, always use submodule to avoid dependency issues - add_subdirectory(src/lib/abseil-cpp) -else() - # Try system package first, fallback to submodule - find_package(absl QUIET) - if(NOT absl_FOUND) - message(STATUS "System Abseil not found, using submodule") - add_subdirectory(src/lib/abseil-cpp) +# Attempt to use the system package unless the build explicitly requests the +# bundled (fetched) copy or we're on platforms where prebuilt packages are often +# missing the required components (e.g. macOS). +set(_yaze_use_fetched_absl ${YAZE_FORCE_BUNDLED_ABSL}) +if(NOT _yaze_use_fetched_absl) + find_package(absl QUIET CONFIG) + if(absl_FOUND) + message(STATUS "Using system-provided Abseil package") + else() + set(_yaze_use_fetched_absl TRUE) + message(STATUS "System Abseil not found. Fetching release ${YAZE_ABSL_GIT_TAG}.") endif() endif() -set(ABSL_PROPAGATE_CXX_STD ON) -set(ABSL_CXX_STANDARD 23) -set(ABSL_USE_GOOGLETEST_HEAD ON) -set(ABSL_ENABLE_INSTALL ON) -# Silence C++23 deprecation warnings for Abseil int128 -if(MSVC) - add_definitions(-DSILENCE_CXX23_DEPRECATIONS) -else() - add_definitions(-D_SILENCE_CXX23_DEPRECATION_WARNING) +if(_yaze_use_fetched_absl) + include(FetchContent) + FetchContent_GetProperties(absl) + if(NOT absl_POPULATED) + FetchContent_Declare( + absl + GIT_REPOSITORY https://github.com/abseil/abseil-cpp.git + GIT_TAG ${YAZE_ABSL_GIT_TAG} + GIT_SHALLOW TRUE + GIT_PROGRESS TRUE + USES_TERMINAL_DOWNLOAD TRUE + ) + set(ABSL_PROPAGATE_CXX_STD ON CACHE BOOL "" FORCE) + set(ABSL_BUILD_TESTING OFF CACHE BOOL "" FORCE) + set(ABSL_ENABLE_INSTALL OFF CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(absl) + message(STATUS "Fetched Abseil ${YAZE_ABSL_GIT_TAG}") + endif() endif() -# Define base Abseil targets + +if(NOT TARGET absl::strings) + message(FATAL_ERROR "Abseil was not found or failed to configure correctly.") +endif() + +# Canonical list of Abseil targets that the rest of the project links against. set( ABSL_TARGETS absl::strings @@ -61,20 +72,20 @@ set( absl::utility ) -# Add int128 only on non-Windows platforms to avoid C++23 deprecation issues +# Only expose absl::int128 when it's supported without warnings. if(NOT WIN32) list(APPEND ABSL_TARGETS absl::int128) - message(STATUS "Including absl::int128 (non-Windows platform)") + message(STATUS "Including absl::int128 target") else() - message(STATUS "Excluding absl::int128 on Windows to avoid C++23 deprecation issues") + message(STATUS "Skipping absl::int128 target on Windows") endif() if(APPLE AND DEFINED CMAKE_OSX_ARCHITECTURES AND CMAKE_OSX_ARCHITECTURES STREQUAL "arm64") foreach(_absl_target IN ITEMS absl_random_internal_randen_hwaes absl_random_internal_randen_hwaes_impl) if(TARGET ${_absl_target}) get_target_property(_absl_opts ${_absl_target} COMPILE_OPTIONS) - if(NOT _absl_opts STREQUAL "NOTFOUND") - set(_absl_filtered_opts "") + 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) @@ -88,11 +99,17 @@ if(APPLE AND DEFINED CMAKE_OSX_ARCHITECTURES AND CMAKE_OSX_ARCHITECTURES STREQUA if(_absl_opt STREQUAL "-maes" OR _absl_opt STREQUAL "-msse4.1") continue() endif() - list(APPEND _absl_filtered_opts "${_absl_opt}") + list(APPEND _absl_filtered_opts ${_absl_opt}) endforeach() - set_target_properties(${_absl_target} PROPERTIES COMPILE_OPTIONS "${_absl_filtered_opts}") + set_property(TARGET ${_absl_target} PROPERTY COMPILE_OPTIONS ${_absl_filtered_opts}) endif() - target_compile_options(${_absl_target} PRIVATE "-Xarch_arm64" "-march=armv8-a+crypto") endif() endforeach() endif() + +# Silence C++23 deprecation warnings for Abseil int128 +if(MSVC) + add_definitions(-DSILENCE_CXX23_DEPRECATIONS) +else() + add_definitions(-D_SILENCE_CXX23_DEPRECATION_WARNING) +endif() diff --git a/cmake/grpc.cmake b/cmake/grpc.cmake index 0b4a0c5f..600f3182 100644 --- a/cmake/grpc.cmake +++ b/cmake/grpc.cmake @@ -22,7 +22,8 @@ set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH FALSE) # Add compiler flags for Clang 15+ compatibility # gRPC v1.62.0 requires C++17 (std::result_of removed in C++20) if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - add_compile_options(-Wno-error=missing-template-arg-list-after-template-kw) + add_compile_options(-Wno-error=missing-template-arg-list-after-template-kw) + add_compile_definitions(_LIBCPP_ENABLE_CXX20_REMOVED_TYPE_TRAITS) endif() # Save YAZE's C++ standard and temporarily set to C++17 for gRPC @@ -46,6 +47,12 @@ set(gRPC_BUILD_GRPC_RUBY_PLUGIN OFF CACHE BOOL "" FORCE) set(gRPC_BENCHMARK_PROVIDER "none" CACHE STRING "" FORCE) set(gRPC_ZLIB_PROVIDER "package" 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) + # Let gRPC fetch and build its own protobuf and abseil set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "" FORCE) set(gRPC_ABSL_PROVIDER "module" CACHE STRING "" FORCE) @@ -59,7 +66,7 @@ set(protobuf_WITH_ZLIB ON CACHE BOOL "" FORCE) # Abseil configuration set(ABSL_PROPAGATE_CXX_STD ON CACHE BOOL "" FORCE) -set(ABSL_ENABLE_INSTALL OFF CACHE BOOL "" FORCE) +set(ABSL_ENABLE_INSTALL ON CACHE BOOL "" FORCE) set(ABSL_BUILD_TESTING OFF CACHE BOOL "" FORCE) # Declare gRPC - use v1.62.0 which fixes health_check_client incomplete type bug @@ -150,7 +157,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} PRIVATE + target_include_directories(${target} PUBLIC $ $ ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5b104b49..28a1d805 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -102,7 +102,7 @@ if(YAZE_USE_MODULAR_BUILD) include(app/gui/gui_library.cmake) include(app/zelda3/zelda3_library.cmake) - if(YAZE_BUILD_EMU AND NOT YAZE_WITH_GRPC) + if(YAZE_BUILD_EMU) include(app/emu/emu_library.cmake) endif() @@ -233,7 +233,7 @@ if (YAZE_BUILD_LIB) target_link_libraries(yaze_core INTERFACE yaze_agent) endif() - if(YAZE_BUILD_EMU AND NOT YAZE_WITH_GRPC AND TARGET yaze_emulator) + if(YAZE_BUILD_EMU AND TARGET yaze_emulator) target_link_libraries(yaze_core INTERFACE yaze_emulator) endif() @@ -345,7 +345,7 @@ if (YAZE_BUILD_LIB) target_link_libraries(yaze_c PRIVATE yaze_agent) endif() - if(YAZE_BUILD_EMU AND NOT YAZE_WITH_GRPC AND TARGET yaze_emulator) + if(YAZE_BUILD_EMU AND TARGET yaze_emulator) target_link_libraries(yaze_c PRIVATE yaze_emulator) endif() else() diff --git a/src/app/app.cmake b/src/app/app.cmake index 02f2ca45..a9cce7d3 100644 --- a/src/app/app.cmake +++ b/src/app/app.cmake @@ -105,7 +105,7 @@ if(YAZE_USE_MODULAR_BUILD) list(APPEND _yaze_modular_links yaze_agent) endif() - if(YAZE_BUILD_EMU AND NOT YAZE_WITH_GRPC AND TARGET yaze_emulator) + if(YAZE_BUILD_EMU AND TARGET yaze_emulator) list(APPEND _yaze_modular_links yaze_emulator) endif() diff --git a/src/app/core/core_library.cmake b/src/app/core/core_library.cmake index 5e144788..7ea99264 100644 --- a/src/app/core/core_library.cmake +++ b/src/app/core/core_library.cmake @@ -47,6 +47,10 @@ target_sources(yaze_core_lib PRIVATE ) if(YAZE_WITH_GRPC) + target_include_directories(yaze_core_lib PRIVATE + ${CMAKE_SOURCE_DIR}/third_party/json/include) + target_compile_definitions(yaze_core_lib PRIVATE YAZE_WITH_JSON) + target_add_protobuf(yaze_core_lib ${CMAKE_SOURCE_DIR}/src/app/core/proto/imgui_test_harness.proto) diff --git a/src/app/core/service/imgui_test_harness_service.cc b/src/app/core/service/imgui_test_harness_service.cc index 7183fe16..2bd84f5d 100644 --- a/src/app/core/service/imgui_test_harness_service.cc +++ b/src/app/core/service/imgui_test_harness_service.cc @@ -52,43 +52,6 @@ void KeepDynamicTestData(const std::shared_ptr& data) { } } -::yaze::test::GetTestStatusResponse_Status ConvertHarnessStatus( - ::yaze::test::HarnessTestStatus status) { - switch (status) { - case ::yaze::test::HarnessTestStatus::kQueued: - return ::yaze::test::GetTestStatusResponse::STATUS_QUEUED; - case ::yaze::test::HarnessTestStatus::kRunning: - return ::yaze::test::GetTestStatusResponse::STATUS_RUNNING; - case ::yaze::test::HarnessTestStatus::kPassed: - return ::yaze::test::GetTestStatusResponse::STATUS_PASSED; - case ::yaze::test::HarnessTestStatus::kFailed: - return ::yaze::test::GetTestStatusResponse::STATUS_FAILED; - case ::yaze::test::HarnessTestStatus::kTimeout: - return ::yaze::test::GetTestStatusResponse::STATUS_TIMEOUT; - case ::yaze::test::HarnessTestStatus::kUnspecified: - default: - return ::yaze::test::GetTestStatusResponse::STATUS_UNSPECIFIED; - } -} - -int64_t ToUnixMillisSafe(absl::Time timestamp) { - if (timestamp == absl::InfinitePast()) { - return 0; - } - return absl::ToUnixMillis(timestamp); -} - -int32_t ClampDurationToInt32(absl::Duration duration) { - int64_t millis = absl::ToInt64Milliseconds(duration); - if (millis > std::numeric_limits::max()) { - return std::numeric_limits::max(); - } - if (millis < std::numeric_limits::min()) { - return std::numeric_limits::min(); - } - return static_cast(millis); -} - void RunDynamicTest(ImGuiTestContext* ctx) { auto* data = (DynamicTestData*)ctx->Test->UserData; if (data && data->test_func) { @@ -127,6 +90,47 @@ struct RPCState { } // namespace #endif +namespace { + +::yaze::test::GetTestStatusResponse_Status ConvertHarnessStatus( + ::yaze::test::HarnessTestStatus status) { + switch (status) { + case ::yaze::test::HarnessTestStatus::kQueued: + return ::yaze::test::GetTestStatusResponse::STATUS_QUEUED; + case ::yaze::test::HarnessTestStatus::kRunning: + return ::yaze::test::GetTestStatusResponse::STATUS_RUNNING; + case ::yaze::test::HarnessTestStatus::kPassed: + return ::yaze::test::GetTestStatusResponse::STATUS_PASSED; + case ::yaze::test::HarnessTestStatus::kFailed: + return ::yaze::test::GetTestStatusResponse::STATUS_FAILED; + case ::yaze::test::HarnessTestStatus::kTimeout: + return ::yaze::test::GetTestStatusResponse::STATUS_TIMEOUT; + case ::yaze::test::HarnessTestStatus::kUnspecified: + default: + return ::yaze::test::GetTestStatusResponse::STATUS_UNSPECIFIED; + } +} + +int64_t ToUnixMillisSafe(absl::Time timestamp) { + if (timestamp == absl::InfinitePast()) { + return 0; + } + return absl::ToUnixMillis(timestamp); +} + +int32_t ClampDurationToInt32(absl::Duration duration) { + int64_t millis = absl::ToInt64Milliseconds(duration); + if (millis > std::numeric_limits::max()) { + return std::numeric_limits::max(); + } + if (millis < std::numeric_limits::min()) { + return std::numeric_limits::min(); + } + return static_cast(millis); +} + +} // namespace + #include #include diff --git a/src/cli/agent.cmake b/src/cli/agent.cmake index 4915f4e8..6271930b 100644 --- a/src/cli/agent.cmake +++ b/src/cli/agent.cmake @@ -77,6 +77,8 @@ set(YAZE_AGENT_SOURCES cli/service/planning/tile16_proposal_generator.cc cli/service/resources/resource_catalog.cc cli/service/resources/resource_context_builder.cc + cli/handlers/overworld_inspect.cc + cli/flags.cc cli/service/rom/rom_sandbox_manager.cc ) diff --git a/src/cli/cli_main.cc b/src/cli/cli_main.cc index 1f94b4ab..63b95bc3 100644 --- a/src/cli/cli_main.cc +++ b/src/cli/cli_main.cc @@ -5,6 +5,7 @@ #include #include +#include "absl/flags/declare.h" #include "absl/flags/flag.h" #include "absl/strings/str_format.h" #include "absl/strings/match.h" @@ -14,7 +15,7 @@ #include "yaze_config.h" ABSL_FLAG(bool, tui, false, "Launch Text User Interface"); -ABSL_FLAG(std::string, rom, "", "Path to the ROM file"); +ABSL_DECLARE_FLAG(std::string, rom); namespace { diff --git a/src/cli/flags.cc b/src/cli/flags.cc new file mode 100644 index 00000000..926500dd --- /dev/null +++ b/src/cli/flags.cc @@ -0,0 +1,5 @@ +#include + +#include "absl/flags/flag.h" + +ABSL_FLAG(std::string, rom, "", "Path to the ROM file"); diff --git a/src/cli/z3ed.cmake b/src/cli/z3ed.cmake index a55912d1..c6de198c 100644 --- a/src/cli/z3ed.cmake +++ b/src/cli/z3ed.cmake @@ -65,6 +65,7 @@ add_executable( cli/handlers/agent/test_common.cc cli/handlers/agent/test_commands.cc cli/handlers/agent/gui_commands.cc + cli/flags.cc cli/modern_cli.cc cli/tui/asar_patch.cc cli/tui/palette_editor.cc