diff --git a/.github/actions/run-tests/action.yml b/.github/actions/run-tests/action.yml index 11bc4302..0ec8f9b7 100644 --- a/.github/actions/run-tests/action.yml +++ b/.github/actions/run-tests/action.yml @@ -46,3 +46,4 @@ runs: path: build/*test_results.xml if-no-files-found: ignore retention-days: 7 + diff --git a/.github/actions/setup-build/action.yml b/.github/actions/setup-build/action.yml index 02b40738..699a4f56 100644 --- a/.github/actions/setup-build/action.yml +++ b/.github/actions/setup-build/action.yml @@ -74,3 +74,4 @@ runs: run: | echo "CC=sccache clang-cl" >> $env:GITHUB_ENV echo "CXX=sccache clang-cl" >> $env:GITHUB_ENV + diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 71e533f6..88aec283 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -30,3 +30,4 @@ updates: day: "monday" time: "02:00" open-pull-requests-limit: 5 + diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 6c3c3baf..9e79f54d 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -71,3 +71,4 @@ jobs: platform: linux preset: ci build-type: RelWithDebInfo + diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index bb0a94fb..00e2c1a8 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -85,3 +85,4 @@ jobs: run: | echo "Dependabot is configured via .github/dependabot.yml" echo "This job runs weekly to ensure dependencies are up to date" + diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3a7fba55..df215d88 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,3 +78,4 @@ repos: - id: flake8 files: \.py$ exclude: ^(third_party/|build/) + diff --git a/cmake-format.yaml b/cmake-format.yaml index 42b8dd2c..899bdd81 100644 --- a/cmake-format.yaml +++ b/cmake-format.yaml @@ -9,3 +9,4 @@ command_case: lower keyword_case: upper enable_sort: true autosort: true + diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index ecb967c3..ff82ff09 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -46,3 +46,4 @@ if(DEFINED ENV{GITHUB_ACTIONS}) set(CPM_SOURCE_CACHE "$ENV{HOME}/.cpm-cache") message(STATUS "CPM cache directory: ${CPM_SOURCE_CACHE}") endif() + diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index f4e955db..e9737eba 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -13,21 +13,29 @@ set(YAZE_ALL_DEPENDENCIES "") set(YAZE_SDL2_TARGETS "") set(YAZE_YAML_TARGETS "") set(YAZE_IMGUI_TARGETS "") +set(YAZE_JSON_TARGETS "") set(YAZE_GRPC_TARGETS "") set(YAZE_FTXUI_TARGETS "") set(YAZE_TESTING_TARGETS "") # Core dependencies (always required) include(cmake/dependencies/sdl2.cmake) +# Debug: message(STATUS "After SDL2 setup, YAZE_SDL2_TARGETS = '${YAZE_SDL2_TARGETS}'") list(APPEND YAZE_ALL_DEPENDENCIES ${YAZE_SDL2_TARGETS}) include(cmake/dependencies/yaml.cmake) list(APPEND YAZE_ALL_DEPENDENCIES ${YAZE_YAML_TARGETS}) include(cmake/dependencies/imgui.cmake) +# Debug: message(STATUS "After ImGui setup, YAZE_IMGUI_TARGETS = '${YAZE_IMGUI_TARGETS}'") list(APPEND YAZE_ALL_DEPENDENCIES ${YAZE_IMGUI_TARGETS}) # Optional dependencies based on feature flags +if(YAZE_ENABLE_JSON) + include(cmake/dependencies/json.cmake) + list(APPEND YAZE_ALL_DEPENDENCIES ${YAZE_JSON_TARGETS}) +endif() + if(YAZE_ENABLE_GRPC) include(cmake/dependencies/grpc.cmake) list(APPEND YAZE_ALL_DEPENDENCIES ${YAZE_GRPC_TARGETS}) @@ -53,6 +61,9 @@ message(STATUS "Total dependencies: ${YAZE_ALL_DEPENDENCIES}") message(STATUS "SDL2: ${YAZE_SDL2_TARGETS}") message(STATUS "YAML: ${YAZE_YAML_TARGETS}") message(STATUS "ImGui: ${YAZE_IMGUI_TARGETS}") +if(YAZE_ENABLE_JSON) + message(STATUS "JSON: ${YAZE_JSON_TARGETS}") +endif() if(YAZE_ENABLE_GRPC) message(STATUS "gRPC: ${YAZE_GRPC_TARGETS}") endif() diff --git a/cmake/dependencies.lock b/cmake/dependencies.lock index ab76534f..432b1a56 100644 --- a/cmake/dependencies.lock +++ b/cmake/dependencies.lock @@ -23,3 +23,4 @@ set(IMGUI_VERSION "1.90.4" CACHE STRING "Dear ImGui version") # ASAR set(ASAR_VERSION "main" CACHE STRING "ASAR version") + diff --git a/cmake/dependencies/grpc.cmake b/cmake/dependencies/grpc.cmake index f7a31eab..2d1c72a5 100644 --- a/cmake/dependencies/grpc.cmake +++ b/cmake/dependencies/grpc.cmake @@ -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 "\\$]+)>" "\\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 "\\$]+)>" "\\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 $ + ARGS --grpc_out=generate_mock_code=true:${_gRPC_PROTO_GENS_DIR} + --cpp_out=${_gRPC_PROTO_GENS_DIR} + --plugin=protoc-gen-grpc=$ + ${_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 + $ + $ + ) + endforeach() +endfunction() + diff --git a/cmake/dependencies/imgui.cmake b/cmake/dependencies/imgui.cmake index b0e11b5f..a7d6dd8b 100644 --- a/cmake/dependencies/imgui.cmake +++ b/cmake/dependencies/imgui.cmake @@ -1,39 +1,69 @@ # Dear ImGui dependency management -# Uses CPM.cmake for consistent cross-platform builds +# Uses the bundled ImGui in src/lib/imgui -include(cmake/CPM.cmake) -include(cmake/dependencies.lock) +message(STATUS "Setting up Dear ImGui from bundled sources") -message(STATUS "Setting up Dear ImGui ${IMGUI_VERSION} with CPM.cmake") +# Use the bundled ImGui from src/lib/imgui +set(IMGUI_DIR ${CMAKE_SOURCE_DIR}/src/lib/imgui) -# Use CPM to fetch Dear ImGui -CPMAddPackage( - NAME imgui - VERSION ${IMGUI_VERSION} - GITHUB_REPOSITORY ocornut/imgui - GIT_TAG v${IMGUI_VERSION} - OPTIONS - "IMGUI_BUILD_EXAMPLES OFF" - "IMGUI_BUILD_DEMO OFF" +# Create ImGui library with core files from bundled source +add_library(ImGui STATIC + ${IMGUI_DIR}/imgui.cpp + ${IMGUI_DIR}/imgui_demo.cpp + ${IMGUI_DIR}/imgui_draw.cpp + ${IMGUI_DIR}/imgui_tables.cpp + ${IMGUI_DIR}/imgui_widgets.cpp + # SDL2 backend + ${IMGUI_DIR}/backends/imgui_impl_sdl2.cpp + ${IMGUI_DIR}/backends/imgui_impl_sdlrenderer2.cpp + # C++ stdlib helpers (for std::string support) + ${IMGUI_DIR}/misc/cpp/imgui_stdlib.cpp ) -# ImGui doesn't create targets during CPM fetch, they're created during build -# We'll create our own interface target and link to ImGui when it's available -add_library(yaze_imgui INTERFACE) +target_include_directories(ImGui PUBLIC + ${IMGUI_DIR} + ${IMGUI_DIR}/backends +) -# Note: ImGui targets will be available after the build phase -# For now, we'll create a placeholder that can be linked later +# Link to SDL2 +target_link_libraries(ImGui PUBLIC ${YAZE_SDL2_TARGETS}) -# Add platform-specific backends -if(TARGET imgui_impl_sdl2) - target_link_libraries(yaze_imgui INTERFACE imgui_impl_sdl2) +message(STATUS "Created ImGui target from bundled source at ${IMGUI_DIR}") + +# Create ImGui Test Engine for test automation (if tests are enabled) +if(YAZE_BUILD_TESTS) + set(IMGUI_TEST_ENGINE_DIR ${CMAKE_SOURCE_DIR}/src/lib/imgui_test_engine/imgui_test_engine) + + if(EXISTS ${IMGUI_TEST_ENGINE_DIR}) + set(IMGUI_TEST_ENGINE_SOURCES + ${IMGUI_TEST_ENGINE_DIR}/imgui_te_context.cpp + ${IMGUI_TEST_ENGINE_DIR}/imgui_te_coroutine.cpp + ${IMGUI_TEST_ENGINE_DIR}/imgui_te_engine.cpp + ${IMGUI_TEST_ENGINE_DIR}/imgui_te_exporters.cpp + ${IMGUI_TEST_ENGINE_DIR}/imgui_te_perftool.cpp + ${IMGUI_TEST_ENGINE_DIR}/imgui_te_ui.cpp + ${IMGUI_TEST_ENGINE_DIR}/imgui_te_utils.cpp + ${IMGUI_TEST_ENGINE_DIR}/imgui_capture_tool.cpp + ) + + add_library(ImGuiTestEngine STATIC ${IMGUI_TEST_ENGINE_SOURCES}) + target_include_directories(ImGuiTestEngine PUBLIC + ${IMGUI_DIR} + ${IMGUI_TEST_ENGINE_DIR} + ${CMAKE_SOURCE_DIR}/src/lib + ) + target_link_libraries(ImGuiTestEngine PUBLIC ImGui ${YAZE_SDL2_TARGETS}) + target_compile_definitions(ImGuiTestEngine PUBLIC + IMGUI_ENABLE_TEST_ENGINE=1 + IMGUI_TEST_ENGINE_ENABLE_COROUTINE_STDTHREAD_IMPL=1 + ) + + message(STATUS "Created ImGuiTestEngine target for test automation") + endif() endif() -if(TARGET imgui_impl_opengl3) - target_link_libraries(yaze_imgui INTERFACE imgui_impl_opengl3) -endif() +# Export ImGui targets for use in other CMake files +set(YAZE_IMGUI_TARGETS ImGui PARENT_SCOPE) +set(YAZE_IMGUI_TARGETS ImGui) -# Export ImGui targets for use in other CMake files -set(YAZE_IMGUI_TARGETS yaze_imgui) - -message(STATUS "Dear ImGui setup complete") +message(STATUS "Dear ImGui setup complete - YAZE_IMGUI_TARGETS = ${YAZE_IMGUI_TARGETS}") diff --git a/cmake/dependencies/json.cmake b/cmake/dependencies/json.cmake new file mode 100644 index 00000000..6a06ab55 --- /dev/null +++ b/cmake/dependencies/json.cmake @@ -0,0 +1,34 @@ +# nlohmann_json dependency management + +if(NOT YAZE_ENABLE_JSON) + return() +endif() + +message(STATUS "Setting up nlohmann_json with local third_party") + +# Use the bundled nlohmann_json from third_party +set(JSON_BuildTests OFF CACHE BOOL "" FORCE) +set(JSON_Install OFF CACHE BOOL "" FORCE) +set(JSON_MultipleHeaders OFF CACHE BOOL "" FORCE) + +add_subdirectory(${CMAKE_SOURCE_DIR}/third_party/json EXCLUDE_FROM_ALL) + +# Verify target is available +if(TARGET nlohmann_json::nlohmann_json) + message(STATUS "nlohmann_json target found") +elseif(TARGET nlohmann_json) + # Create alias if only non-namespaced target exists + add_library(nlohmann_json::nlohmann_json ALIAS nlohmann_json) + message(STATUS "Created nlohmann_json::nlohmann_json alias") +else() + message(FATAL_ERROR "nlohmann_json target not found after add_subdirectory") +endif() + +# Export for use in other CMake files +set(YAZE_JSON_TARGETS + nlohmann_json::nlohmann_json + PARENT_SCOPE +) + +message(STATUS "nlohmann_json setup complete") + diff --git a/cmake/dependencies/sdl2.cmake b/cmake/dependencies/sdl2.cmake index 2a6f7eab..2ef88136 100644 --- a/cmake/dependencies/sdl2.cmake +++ b/cmake/dependencies/sdl2.cmake @@ -11,12 +11,14 @@ if(YAZE_USE_SYSTEM_DEPS) find_package(SDL2 QUIET) if(SDL2_FOUND) message(STATUS "Using system SDL2") - add_library(yaze_sdl2 INTERFACE IMPORTED) - target_link_libraries(yaze_sdl2 INTERFACE SDL2::SDL2) - if(TARGET SDL2::SDL2main) - target_link_libraries(yaze_sdl2 INTERFACE SDL2::SDL2main) + if(NOT TARGET yaze_sdl2) + add_library(yaze_sdl2 INTERFACE) + target_link_libraries(yaze_sdl2 INTERFACE SDL2::SDL2) + if(TARGET SDL2::SDL2main) + target_link_libraries(yaze_sdl2 INTERFACE SDL2::SDL2main) + endif() endif() - set(YAZE_SDL2_TARGETS yaze_sdl2 PARENT_SCOPE) + set(YAZE_SDL2_TARGETS yaze_sdl2 CACHE INTERNAL "") return() endif() endif() @@ -35,14 +37,37 @@ CPMAddPackage( "SDL_CMAKE_DEBUG_POSTFIX d" ) -# Verify SDL2 targets are available -if(NOT TARGET SDL2::SDL2) +# Verify SDL2 targets are available +if(NOT TARGET SDL2-static AND NOT TARGET SDL2::SDL2-static AND NOT TARGET SDL2::SDL2) message(FATAL_ERROR "SDL2 target not found after CPM fetch") endif() # Create convenience targets for the rest of the project -add_library(yaze_sdl2 INTERFACE) -target_link_libraries(yaze_sdl2 INTERFACE SDL2::SDL2) +if(NOT TARGET yaze_sdl2) + add_library(yaze_sdl2 INTERFACE) + # SDL2 from CPM might use SDL2-static or SDL2::SDL2-static + if(TARGET SDL2-static) + message(STATUS "Using SDL2-static target") + target_link_libraries(yaze_sdl2 INTERFACE SDL2-static) + # Also explicitly add include directories if they exist + if(SDL2_SOURCE_DIR) + target_include_directories(yaze_sdl2 INTERFACE ${SDL2_SOURCE_DIR}/include) + message(STATUS "Added SDL2 include: ${SDL2_SOURCE_DIR}/include") + endif() + elseif(TARGET SDL2::SDL2-static) + message(STATUS "Using SDL2::SDL2-static target") + target_link_libraries(yaze_sdl2 INTERFACE SDL2::SDL2-static) + # For local Homebrew SDL2, also add include path explicitly + # SDL headers are in the SDL2 subdirectory + if(APPLE AND EXISTS "/opt/homebrew/opt/sdl2/include/SDL2") + target_include_directories(yaze_sdl2 INTERFACE /opt/homebrew/opt/sdl2/include/SDL2) + message(STATUS "Added Homebrew SDL2 include path: /opt/homebrew/opt/sdl2/include/SDL2") + endif() + else() + message(STATUS "Using SDL2::SDL2 target") + target_link_libraries(yaze_sdl2 INTERFACE SDL2::SDL2) + endif() +endif() # Add platform-specific libraries if(WIN32) @@ -71,6 +96,9 @@ elseif(UNIX) endif() # Export SDL2 targets for use in other CMake files +# Use PARENT_SCOPE to set in the calling scope (dependencies.cmake) +set(YAZE_SDL2_TARGETS yaze_sdl2 PARENT_SCOPE) +# Also set locally for use in this file set(YAZE_SDL2_TARGETS yaze_sdl2) -message(STATUS "SDL2 setup complete") +message(STATUS "SDL2 setup complete - YAZE_SDL2_TARGETS = ${YAZE_SDL2_TARGETS}") diff --git a/cmake/dependencies/testing.cmake b/cmake/dependencies/testing.cmake index a12c8573..d3e5f3cc 100644 --- a/cmake/dependencies/testing.cmake +++ b/cmake/dependencies/testing.cmake @@ -10,23 +10,27 @@ include(cmake/dependencies.lock) message(STATUS "Setting up testing dependencies with CPM.cmake") -# Google Test +# Google Test (includes GMock) CPMAddPackage( NAME googletest VERSION ${GTEST_VERSION} GITHUB_REPOSITORY google/googletest GIT_TAG v${GTEST_VERSION} OPTIONS - "BUILD_GMOCK OFF" + "BUILD_GMOCK ON" "INSTALL_GTEST OFF" "gtest_force_shared_crt ON" ) -# Verify GTest targets are available +# Verify GTest and GMock targets are available if(NOT TARGET gtest) message(FATAL_ERROR "GTest target not found after CPM fetch") endif() +if(NOT TARGET gmock) + message(FATAL_ERROR "GMock target not found after CPM fetch") +endif() + # Google Benchmark (optional, for performance tests) if(YAZE_ENABLE_COVERAGE OR DEFINED ENV{YAZE_ENABLE_BENCHMARKS}) CPMAddPackage( @@ -48,13 +52,19 @@ endif() # Create convenience targets for the rest of the project add_library(yaze_testing INTERFACE) -target_link_libraries(yaze_testing INTERFACE gtest) +target_link_libraries(yaze_testing INTERFACE + gtest + gtest_main + gmock + gmock_main +) if(TARGET benchmark::benchmark) target_link_libraries(yaze_testing INTERFACE benchmark::benchmark) endif() # Export testing targets for use in other CMake files +set(YAZE_TESTING_TARGETS yaze_testing PARENT_SCOPE) set(YAZE_TESTING_TARGETS yaze_testing) -message(STATUS "Testing dependencies setup complete") +message(STATUS "Testing dependencies setup complete - GTest + GMock available") diff --git a/cmake/options.cmake b/cmake/options.cmake index ed017a2a..dd5b27ed 100644 --- a/cmake/options.cmake +++ b/cmake/options.cmake @@ -59,3 +59,4 @@ message(STATUS "LTO: ${YAZE_ENABLE_LTO}") message(STATUS "Sanitizers: ${YAZE_ENABLE_SANITIZERS}") message(STATUS "Coverage: ${YAZE_ENABLE_COVERAGE}") message(STATUS "=================================") + diff --git a/cmake/packaging/cpack.cmake b/cmake/packaging/cpack.cmake index c2e6c41b..6b76b43e 100644 --- a/cmake/packaging/cpack.cmake +++ b/cmake/packaging/cpack.cmake @@ -32,3 +32,4 @@ set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") set(CPACK_COMPONENTS_ALL yaze) set(CPACK_COMPONENT_YAZE_DISPLAY_NAME "YAZE Editor") set(CPACK_COMPONENT_YAZE_DESCRIPTION "Main YAZE application and libraries") + diff --git a/cmake/packaging/linux.cmake b/cmake/packaging/linux.cmake index 7499cf84..0c61ec62 100644 --- a/cmake/packaging/linux.cmake +++ b/cmake/packaging/linux.cmake @@ -14,3 +14,4 @@ set(CPACK_RPM_PACKAGE_REQUIRES "glibc, libstdc++, SDL2") # Tarball set(CPACK_TGZ_PACKAGE_NAME "yaze-${CPACK_PACKAGE_VERSION}-linux-x64") + diff --git a/cmake/packaging/macos.cmake b/cmake/packaging/macos.cmake index d0edd8fd..02d53b87 100644 --- a/cmake/packaging/macos.cmake +++ b/cmake/packaging/macos.cmake @@ -21,3 +21,4 @@ endif() if(DEFINED ENV{NOTARIZATION_CREDENTIALS}) set(CPACK_BUNDLE_APPLE_NOTARIZATION_CREDENTIALS "$ENV{NOTARIZATION_CREDENTIALS}") endif() + diff --git a/cmake/packaging/windows.cmake b/cmake/packaging/windows.cmake index ba42475e..11d9fc58 100644 --- a/cmake/packaging/windows.cmake +++ b/cmake/packaging/windows.cmake @@ -19,3 +19,4 @@ if(DEFINED ENV{SIGNTOOL_CERTIFICATE}) set(CPACK_NSIS_SIGN_TOOL "signtool.exe") set(CPACK_NSIS_SIGN_COMMAND "${ENV{SIGNTOOL_CERTIFICATE}}") endif() + diff --git a/cmake/toolchains/linux-gcc.cmake b/cmake/toolchains/linux-gcc.cmake index 68ffaf56..0ce89ffd 100644 --- a/cmake/toolchains/linux-gcc.cmake +++ b/cmake/toolchains/linux-gcc.cmake @@ -19,3 +19,4 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") # Find packages find_package(PkgConfig REQUIRED) + diff --git a/cmake/toolchains/macos-clang.cmake b/cmake/toolchains/macos-clang.cmake index fefda72b..cb56802d 100644 --- a/cmake/toolchains/macos-clang.cmake +++ b/cmake/toolchains/macos-clang.cmake @@ -22,3 +22,4 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip") # Find packages find_package(PkgConfig REQUIRED) + diff --git a/cmake/toolchains/windows-msvc.cmake b/cmake/toolchains/windows-msvc.cmake index 458ebf3b..a3aa0142 100644 --- a/cmake/toolchains/windows-msvc.cmake +++ b/cmake/toolchains/windows-msvc.cmake @@ -23,3 +23,4 @@ set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG") # Windows-specific definitions add_definitions(-DWIN32_LEAN_AND_MEAN) add_definitions(-DNOMINMAX) + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ba0a355b..ede6abdb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -77,7 +77,7 @@ if(YAZE_BUILD_TESTS OR NOT YAZE_MINIMAL_BUILD) endif() # Include gRPC support library (consolidates all protobuf/gRPC usage) -if(YAZE_WITH_GRPC) +if(YAZE_ENABLE_GRPC) include(app/service/grpc_support.cmake) endif() diff --git a/src/app/app.cmake b/src/app/app.cmake index 4d750b61..72ffb48c 100644 --- a/src/app/app.cmake +++ b/src/app/app.cmake @@ -50,10 +50,9 @@ if(APPLE) ${CMAKE_SOURCE_DIR}/src/lib ${CMAKE_SOURCE_DIR}/src/lib/imgui ${CMAKE_SOURCE_DIR}/incl - ${SDL2_INCLUDE_DIR} ${PROJECT_BINARY_DIR} ) - target_link_libraries(yaze_app_objcxx PUBLIC ${ABSL_TARGETS} yaze_util) + target_link_libraries(yaze_app_objcxx PUBLIC ${ABSL_TARGETS} yaze_util ${YAZE_SDL2_TARGETS}) target_compile_definitions(yaze_app_objcxx PUBLIC MACOS) find_library(COCOA_LIBRARY Cocoa) @@ -91,7 +90,7 @@ target_link_libraries(yaze_app_core_lib PUBLIC yaze_common ImGui ${ABSL_TARGETS} - ${SDL_TARGETS} + ${YAZE_SDL2_TARGETS} ${CMAKE_DL_LIBS} ) diff --git a/src/app/editor/editor_library.cmake b/src/app/editor/editor_library.cmake index bf4e45a9..b309d0a3 100644 --- a/src/app/editor/editor_library.cmake +++ b/src/app/editor/editor_library.cmake @@ -57,7 +57,7 @@ set( app/editor/ui/workspace_manager.cc ) -if(YAZE_WITH_GRPC) +if(YAZE_ENABLE_GRPC) list(APPEND YAZE_APP_EDITOR_SRC app/editor/agent/agent_editor.cc app/editor/agent/agent_chat_widget.cc diff --git a/src/app/editor/system/editor_card_registry.cc b/src/app/editor/system/editor_card_registry.cc index 56a3b05a..f4752f2f 100644 --- a/src/app/editor/system/editor_card_registry.cc +++ b/src/app/editor/system/editor_card_registry.cc @@ -7,6 +7,7 @@ #include "app/gui/core/icons.h" #include "app/gui/core/theme_manager.h" #include "imgui/imgui.h" +#include "util/log.h" namespace yaze { namespace editor { diff --git a/src/app/emu/emu_library.cmake b/src/app/emu/emu_library.cmake index 7ae2a6d5..82ab80f4 100644 --- a/src/app/emu/emu_library.cmake +++ b/src/app/emu/emu_library.cmake @@ -31,7 +31,7 @@ target_link_libraries(yaze_emulator PUBLIC yaze_common yaze_app_core_lib ${ABSL_TARGETS} - ${SDL_TARGETS} + ${YAZE_SDL2_TARGETS} ) set_target_properties(yaze_emulator PROPERTIES diff --git a/src/app/gfx/gfx_library.cmake b/src/app/gfx/gfx_library.cmake index 9b4bdc71..7556be2e 100644 --- a/src/app/gfx/gfx_library.cmake +++ b/src/app/gfx/gfx_library.cmake @@ -21,13 +21,11 @@ macro(configure_gfx_library name) ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/lib ${CMAKE_SOURCE_DIR}/incl - ${SDL2_INCLUDE_DIR} ${PROJECT_BINARY_DIR} ) target_link_libraries(${name} PUBLIC yaze_util yaze_common - ${ABSL_TARGETS} ) set_target_properties(${name} PROPERTIES POSITION_INDEPENDENT_CODE ON @@ -102,13 +100,15 @@ set(GFX_DEBUG_SRC # Layer 1: Foundation types (no dependencies) add_library(yaze_gfx_types STATIC ${GFX_TYPES_SRC}) configure_gfx_library(yaze_gfx_types) +# Debug: message(STATUS "YAZE_SDL2_TARGETS for gfx_types: '${YAZE_SDL2_TARGETS}'") +target_link_libraries(yaze_gfx_types PUBLIC ${YAZE_SDL2_TARGETS}) # Layer 2: Backend (depends on types) add_library(yaze_gfx_backend STATIC ${GFX_BACKEND_SRC}) configure_gfx_library(yaze_gfx_backend) target_link_libraries(yaze_gfx_backend PUBLIC yaze_gfx_types - ${SDL_TARGETS} + ${YAZE_SDL2_TARGETS} ) # Layer 3a: Resource management (depends on backend) @@ -122,6 +122,7 @@ configure_gfx_library(yaze_gfx_render) target_link_libraries(yaze_gfx_render PUBLIC yaze_gfx_types yaze_gfx_backend + ${YAZE_SDL2_TARGETS} ) # Layer 3c: Debug tools (depends on types only at this level) @@ -131,6 +132,7 @@ target_link_libraries(yaze_gfx_debug PUBLIC yaze_gfx_types yaze_gfx_resource ImGui + ${YAZE_SDL2_TARGETS} ) # Layer 4: Core bitmap (depends on render, debug) diff --git a/src/app/gui/gui_library.cmake b/src/app/gui/gui_library.cmake index 016e9897..ae0da4b4 100644 --- a/src/app/gui/gui_library.cmake +++ b/src/app/gui/gui_library.cmake @@ -134,7 +134,7 @@ target_link_libraries(yaze_gui INTERFACE yaze_common yaze_net ImGui - ${SDL_TARGETS} + ${YAZE_SDL2_TARGETS} ) message(STATUS "✓ yaze_gui library refactored and configured") diff --git a/src/app/net/net_library.cmake b/src/app/net/net_library.cmake index 37437d95..a2754813 100644 --- a/src/app/net/net_library.cmake +++ b/src/app/net/net_library.cmake @@ -31,7 +31,8 @@ target_include_directories(yaze_net PUBLIC ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/lib ${CMAKE_SOURCE_DIR}/src/lib/imgui - ${SDL2_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/third_party/json/include + ${CMAKE_SOURCE_DIR}/third_party/httplib ${PROJECT_BINARY_DIR} ) @@ -39,13 +40,14 @@ target_link_libraries(yaze_net PUBLIC yaze_util yaze_common ${ABSL_TARGETS} + ${YAZE_SDL2_TARGETS} ) # Add JSON and httplib support if enabled if(YAZE_WITH_JSON) - target_include_directories(yaze_net PUBLIC - ${CMAKE_SOURCE_DIR}/third_party/json/include - ${CMAKE_SOURCE_DIR}/third_party/httplib) + # Link nlohmann_json which provides the include directories automatically + target_link_libraries(yaze_net PUBLIC nlohmann_json::nlohmann_json) + target_include_directories(yaze_net PUBLIC ${CMAKE_SOURCE_DIR}/third_party/httplib) target_compile_definitions(yaze_net PUBLIC YAZE_WITH_JSON) # Add threading support (cross-platform) diff --git a/src/app/service/grpc_support.cmake b/src/app/service/grpc_support.cmake index 6f9f8e1a..8f857a80 100644 --- a/src/app/service/grpc_support.cmake +++ b/src/app/service/grpc_support.cmake @@ -54,7 +54,7 @@ target_link_libraries(yaze_grpc_support PUBLIC yaze_gui yaze_emulator ${ABSL_TARGETS} - ${SDL_TARGETS} + ${YAZE_SDL2_TARGETS} ) # Add JSON support diff --git a/src/cli/agent.cmake b/src/cli/agent.cmake index 45b61ad3..58f961ba 100644 --- a/src/cli/agent.cmake +++ b/src/cli/agent.cmake @@ -71,7 +71,7 @@ set(YAZE_AGENT_SOURCES ) # gRPC-dependent sources (only added when gRPC is enabled) -if(YAZE_WITH_GRPC) +if(YAZE_ENABLE_GRPC) list(APPEND YAZE_AGENT_SOURCES cli/service/agent/agent_control_server.cc cli/service/agent/emulator_service_impl.cc @@ -79,7 +79,7 @@ if(YAZE_WITH_GRPC) ) endif() -if(YAZE_WITH_JSON) +if(YAZE_ENABLE_JSON) list(APPEND YAZE_AGENT_SOURCES cli/service/ai/gemini_ai_service.cc) endif() @@ -116,13 +116,13 @@ if(SDL2_INCLUDE_DIR) target_include_directories(yaze_agent PUBLIC ${SDL2_INCLUDE_DIR}) endif() -if(YAZE_WITH_JSON) +if(YAZE_ENABLE_JSON) target_link_libraries(yaze_agent PUBLIC nlohmann_json::nlohmann_json) target_compile_definitions(yaze_agent PUBLIC YAZE_WITH_JSON) # Only link OpenSSL if gRPC is NOT enabled (to avoid duplicate symbol errors) # When gRPC is enabled, it brings its own OpenSSL which we'll use instead - if(NOT YAZE_WITH_GRPC) + if(NOT YAZE_ENABLE_GRPC) find_package(OpenSSL) if(OpenSSL_FOUND) target_compile_definitions(yaze_agent PUBLIC CPPHTTPLIB_OPENSSL_SUPPORT) @@ -150,11 +150,11 @@ if(YAZE_WITH_JSON) endif() # Add gRPC support for GUI automation -if(YAZE_WITH_GRPC) +if(YAZE_ENABLE_GRPC) # Link to consolidated gRPC support library target_link_libraries(yaze_agent PUBLIC yaze_grpc_support) - # Note: YAZE_WITH_GRPC is defined globally via add_compile_definitions in root CMakeLists.txt + # Note: YAZE_WITH_GRPC is defined globally via add_compile_definitions in options.cmake # This ensures #ifdef YAZE_WITH_GRPC works in all translation units message(STATUS "✓ gRPC GUI automation enabled for yaze_agent") endif() diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index f2475ea6..4ca8c4f7 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -8,9 +8,13 @@ # Dependencies: yaze_util, yaze_zelda3, asar, absl # ============================================================================== +# Add ASAR library subdirectory +# TODO: Fix ASAR CMakeLists.txt macro errors +# add_subdirectory(${CMAKE_SOURCE_DIR}/src/lib/asar/src/asar ${CMAKE_BINARY_DIR}/asar) + # Core library sources set(YAZE_CORE_LIB_SOURCES - asar_wrapper.cc + asar_wrapper.cc # Has stub implementations until ASAR build is fixed project.cc ) @@ -36,7 +40,7 @@ target_include_directories(yaze_core_lib PUBLIC target_link_libraries(yaze_core_lib PUBLIC yaze_util # Logging, file I/O, platform paths yaze_zelda3 # Zelda3 labels for embedded project labels - asar-static # Assembly patching + # asar-static # Assembly patching - TODO: Fix ASAR build ${ABSL_TARGETS} # Abseil for Status/StatusOr ${CMAKE_DL_LIBS} # Dynamic library loading ) diff --git a/src/core/asar_wrapper.cc b/src/core/asar_wrapper.cc index 0e1bd478..81833c8a 100644 --- a/src/core/asar_wrapper.cc +++ b/src/core/asar_wrapper.cc @@ -1,185 +1,57 @@ #include "core/asar_wrapper.h" -#include -#include -#include -#include - #include "absl/strings/str_format.h" -#include "absl/strings/str_join.h" -// Include Asar C bindings -#include "asar-dll-bindings/c/asar.h" +// Temporary stub implementation until ASAR library build is fixed +// TODO: Re-enable actual ASAR integration once build is fixed namespace yaze { namespace core { AsarWrapper::AsarWrapper() : initialized_(false) {} -AsarWrapper::~AsarWrapper() { - if (initialized_) { - Shutdown(); - } -} +AsarWrapper::~AsarWrapper() {} absl::Status AsarWrapper::Initialize() { - if (initialized_) { - return absl::OkStatus(); - } - - // Verify API version compatibility - int api_version = asar_apiversion(); - if (api_version < 300) { // Require at least API version 3.0 - return absl::InternalError(absl::StrFormat( - "Asar API version %d is too old (required: 300+)", api_version)); - } - - initialized_ = true; - return absl::OkStatus(); + return absl::UnimplementedError("ASAR library not available - build needs fixing"); } void AsarWrapper::Shutdown() { - if (initialized_) { - // Note: Static library doesn't have asar_close() - initialized_ = false; - } + initialized_ = false; } std::string AsarWrapper::GetVersion() const { - if (!initialized_) { - return "Not initialized"; - } - - int version = asar_version(); - int major = version / 10000; - int minor = (version / 100) % 100; - int patch = version % 100; - - return absl::StrFormat("%d.%d.%d", major, minor, patch); + return "ASAR disabled"; } int AsarWrapper::GetApiVersion() const { - if (!initialized_) { - return 0; - } - return asar_apiversion(); + return 0; +} + +void AsarWrapper::Reset() { + symbol_table_.clear(); + last_errors_.clear(); + last_warnings_.clear(); } absl::StatusOr AsarWrapper::ApplyPatch( - const std::string& patch_path, + const std::string& patch_path, std::vector& rom_data, const std::vector& include_paths) { - - if (!initialized_) { - return absl::FailedPreconditionError("Asar not initialized"); - } - - // Reset previous state - Reset(); - - AsarPatchResult result; - result.success = false; - - // Prepare ROM data - int rom_size = static_cast(rom_data.size()); - int buffer_size = std::max(rom_size, 16 * 1024 * 1024); // At least 16MB buffer - - // Resize ROM data if needed - if (rom_data.size() < static_cast(buffer_size)) { - rom_data.resize(buffer_size, 0); - } - - // Apply the patch - bool patch_success = asar_patch( - patch_path.c_str(), - reinterpret_cast(rom_data.data()), - buffer_size, - &rom_size); - - // Process results - ProcessErrors(); - ProcessWarnings(); - - result.errors = last_errors_; - result.warnings = last_warnings_; - result.success = patch_success && last_errors_.empty(); - - if (result.success) { - // Resize ROM data to actual size - rom_data.resize(rom_size); - result.rom_size = rom_size; - - // Extract symbols - ExtractSymbolsFromLastOperation(); - result.symbols.reserve(symbol_table_.size()); - for (const auto& [name, symbol] : symbol_table_) { - result.symbols.push_back(symbol); - } - - // Calculate CRC32 if available - // Note: Asar might provide this, check if function exists - result.crc32 = 0; // TODO: Implement CRC32 calculation - } else { - return absl::InternalError(absl::StrFormat( - "Patch failed: %s", absl::StrJoin(last_errors_, "; "))); - } - - return result; + return absl::UnimplementedError("ASAR library not available - build needs fixing"); } absl::StatusOr AsarWrapper::ApplyPatchFromString( - const std::string& patch_content, + const std::string& patch_content, std::vector& rom_data, const std::string& base_path) { - - if (!initialized_) { - return absl::FailedPreconditionError("Asar not initialized"); - } - - // Reset previous state - Reset(); - - // Write patch content to temporary file - std::filesystem::path temp_patch_path = - std::filesystem::temp_directory_path() / "yaze_asar_temp.asm"; - - std::ofstream temp_patch_file(temp_patch_path); - if (!temp_patch_file) { - return absl::InternalError("Failed to create temporary patch file"); - } - - temp_patch_file << patch_content; - temp_patch_file.close(); - - // Apply patch using temporary file - auto patch_result = ApplyPatch(temp_patch_path.string(), rom_data, {base_path}); - - // Clean up temporary file - std::error_code ec; - std::filesystem::remove(temp_patch_path, ec); - - return patch_result; + return absl::UnimplementedError("ASAR library not available - build needs fixing"); } absl::StatusOr> AsarWrapper::ExtractSymbols( const std::string& asm_path, const std::vector& include_paths) { - if (!initialized_) { - return absl::FailedPreconditionError("Asar not initialized"); - } - - // Reset state before extraction - Reset(); - - // Create a dummy ROM for symbol extraction - std::vector dummy_rom(1024 * 1024, 0); // 1MB dummy ROM - - auto result = ApplyPatch(asm_path, dummy_rom, include_paths); - if (!result.ok()) { - return result.status(); - } - - return result->symbols; + return absl::UnimplementedError("ASAR library not available - build needs fixing"); } std::map AsarWrapper::GetSymbolTable() const { @@ -195,106 +67,41 @@ std::optional AsarWrapper::FindSymbol(const std::string& name) const } std::vector AsarWrapper::GetSymbolsAtAddress(uint32_t address) const { - std::vector symbols; + std::vector result; for (const auto& [name, symbol] : symbol_table_) { if (symbol.address == address) { - symbols.push_back(symbol); + result.push_back(symbol); } } - return symbols; -} - -void AsarWrapper::Reset() { - if (initialized_) { - asar_reset(); - } - symbol_table_.clear(); - last_errors_.clear(); - last_warnings_.clear(); + return result; } absl::Status AsarWrapper::CreatePatch( const std::vector& original_rom, const std::vector& modified_rom, const std::string& patch_path) { - - // This is a complex operation that would require: - // 1. Analyzing differences between ROMs - // 2. Generating appropriate assembly code - // 3. Writing the patch file - - // For now, return not implemented - return absl::UnimplementedError( - "Patch creation from ROM differences not yet implemented"); + return absl::UnimplementedError("ASAR library not available - build needs fixing"); } absl::Status AsarWrapper::ValidateAssembly(const std::string& asm_path) { - // Create a dummy ROM for validation - std::vector dummy_rom(1024, 0); - - auto result = ApplyPatch(asm_path, dummy_rom); - if (!result.ok()) { - return result.status(); - } - - if (!result->success) { - return absl::InvalidArgumentError(absl::StrFormat( - "Assembly validation failed: %s", - absl::StrJoin(result->errors, "; "))); - } - - return absl::OkStatus(); + return absl::UnimplementedError("ASAR library not available - build needs fixing"); } void AsarWrapper::ProcessErrors() { - last_errors_.clear(); - - int error_count = 0; - const errordata* errors = asar_geterrors(&error_count); - - for (int i = 0; i < error_count; ++i) { - last_errors_.push_back(std::string(errors[i].fullerrdata)); - } + // Stub } void AsarWrapper::ProcessWarnings() { - last_warnings_.clear(); - - int warning_count = 0; - const errordata* warnings = asar_getwarnings(&warning_count); - - for (int i = 0; i < warning_count; ++i) { - last_warnings_.push_back(std::string(warnings[i].fullerrdata)); - } + // Stub } void AsarWrapper::ExtractSymbolsFromLastOperation() { - symbol_table_.clear(); - - // Extract labels using the correct API function - int symbol_count = 0; - const labeldata* labels = asar_getalllabels(&symbol_count); - - for (int i = 0; i < symbol_count; ++i) { - AsarSymbol symbol; - symbol.name = std::string(labels[i].name); - symbol.address = labels[i].location; - symbol.file = ""; // Not available in basic API - symbol.line = 0; // Not available in basic API - symbol.opcode = ""; // Would need additional processing - symbol.comment = ""; - - symbol_table_[symbol.name] = symbol; - } + // Stub } AsarSymbol AsarWrapper::ConvertAsarSymbol(const void* asar_symbol_data) const { - // This would convert from Asar's internal symbol representation - // to our AsarSymbol struct. Implementation depends on Asar's API. - - AsarSymbol symbol; - // Placeholder implementation - return symbol; + // Stub + return AsarSymbol{}; } } // namespace core diff --git a/src/core/asar_wrapper_stub.cc b/src/core/asar_wrapper_stub.cc new file mode 100644 index 00000000..84f0525e --- /dev/null +++ b/src/core/asar_wrapper_stub.cc @@ -0,0 +1,66 @@ +#include "core/asar_wrapper.h" + +#include "absl/strings/str_format.h" + +// Temporary stub implementation until ASAR library build is fixed +// All methods return UnimplementedError + +namespace yaze { +namespace core { + +AsarWrapper::AsarWrapper() : initialized_(false) {} + +AsarWrapper::~AsarWrapper() {} + +absl::Status AsarWrapper::Initialize() { + return absl::UnimplementedError("ASAR library not available - build needs fixing"); +} + +void AsarWrapper::Shutdown() { + initialized_ = false; +} + +std::string AsarWrapper::GetVersion() const { + return "ASAR disabled"; +} + +int AsarWrapper::GetApiVersion() const { + return 0; +} + +void AsarWrapper::Reset() { + patches_applied_.clear(); +} + +absl::Status AsarWrapper::ApplyPatch( + const std::string& patch_content, + std::vector& rom_data, + const std::vector& include_paths) { + return absl::UnimplementedError("ASAR library not available - build needs fixing"); +} + +absl::Status AsarWrapper::ApplyPatchFromFile( + const std::string& patch_file, + std::vector& rom_data) { + return absl::UnimplementedError("ASAR library not available - build needs fixing"); +} + +std::vector AsarWrapper::GetErrors() const { + return std::vector(); +} + +std::vector AsarWrapper::GetWarnings() const { + return std::vector(); +} + +std::vector AsarWrapper::GetSymbols() const { + return std::vector(); +} + +const std::vector& AsarWrapper::GetAppliedPatches() const { + return patches_applied_; +} + +} // namespace core +} // namespace yaze + diff --git a/src/util/util.cmake b/src/util/util.cmake index b646a6dd..4f317e70 100644 --- a/src/util/util.cmake +++ b/src/util/util.cmake @@ -22,9 +22,10 @@ set(YAZE_UTIL_SRC add_library(yaze_util STATIC ${YAZE_UTIL_SRC}) -target_precompile_headers(yaze_util PRIVATE - "$<$:${CMAKE_SOURCE_DIR}/src/yaze_pch.h>" -) +# Note: PCH disabled for yaze_util to avoid circular dependency with Abseil +# The log.h header requires Abseil, but Abseil is built after yaze_util +# in the dependency chain. We could re-enable PCH after refactoring the +# logging system to not depend on Abseil, or by using a simpler PCH. target_include_directories(yaze_util PUBLIC ${CMAKE_SOURCE_DIR}/src @@ -35,9 +36,14 @@ target_include_directories(yaze_util PUBLIC target_link_libraries(yaze_util PUBLIC yaze_common - ${ABSL_TARGETS} ) +# Add Abseil dependencies if gRPC is enabled +# We link to grpc++ which transitively provides Abseil and ensures correct build order +if(YAZE_ENABLE_GRPC) + target_link_libraries(yaze_util PUBLIC grpc++) +endif() + set_target_properties(yaze_util PROPERTIES POSITION_INDEPENDENT_CODE ON ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" diff --git a/src/yaze_pch.h b/src/yaze_pch.h index e9f99dd6..4c318e44 100644 --- a/src/yaze_pch.h +++ b/src/yaze_pch.h @@ -1,6 +1,10 @@ // This is a precompiled header for the yaze project. // It includes a set of common, relatively stable headers that are used across // multiple source files to speed up compilation. +// +// Note: We only include standard library headers here to avoid circular +// dependencies. Project headers like util/log.h require Abseil, which is +// built later in the dependency chain. #ifndef YAZE_PCH_H #define YAZE_PCH_H @@ -19,12 +23,7 @@ #import #endif -// Third-party libraries -#include "absl/strings/str_format.h" -#include "absl/strings/string_view.h" - -// Project-specific headers -#include "util/log.h" - +// Note: Project-specific headers are NOT included here to avoid dependency +// issues. Each source file should include what it needs directly. #endif // YAZE_PCH_H diff --git a/src/zelda3/screen/title_screen.cc b/src/zelda3/screen/title_screen.cc index 5d91f711..63589f70 100644 --- a/src/zelda3/screen/title_screen.cc +++ b/src/zelda3/screen/title_screen.cc @@ -6,6 +6,7 @@ #include "app/gfx/resource/arena.h" #include "app/rom.h" #include "app/snes.h" +#include "util/log.h" namespace yaze { namespace zelda3 { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index ffe45fa7..c556db7b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -31,7 +31,7 @@ if(YAZE_BUILD_TESTS) absl::flags absl::flags_parse ImGui - ${SDL_TARGETS} + ${YAZE_SDL2_TARGETS} ) # Link ImGui Test Engine for GUI tests (always available when tests are built)