diff --git a/src/app/app.cmake b/src/app/app.cmake index d5e5ab1a..0a93b98b 100644 --- a/src/app/app.cmake +++ b/src/app/app.cmake @@ -203,7 +203,13 @@ target_link_libraries(yaze PRIVATE ) if(YAZE_WITH_GRPC AND YAZE_PROTOBUF_TARGETS) target_link_libraries(yaze PRIVATE ${YAZE_PROTOBUF_TARGETS}) - # NOTE: Removed /WHOLEARCHIVE - already linked transitively from libraries + # Apply /WHOLEARCHIVE only at executable level to avoid duplicate version.res + # This ensures protobuf internal symbols are included while preventing resource duplication + if(MSVC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) + foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) + target_link_options(yaze PRIVATE /WHOLEARCHIVE:$) + endforeach() + endif() endif() # Link test support library (yaze_editor needs TestManager) diff --git a/src/app/emu/emu.cmake b/src/app/emu/emu.cmake index c66fe9f9..ca6656da 100644 --- a/src/app/emu/emu.cmake +++ b/src/app/emu/emu.cmake @@ -34,6 +34,13 @@ if(YAZE_BUILD_EMU AND NOT YAZE_MINIMAL_BUILD) message(WARNING "yaze_emu needs yaze_test_support but TARGET not found") endif() + # Apply /WHOLEARCHIVE for protobuf at executable level (Windows) + if(WIN32 AND MSVC AND YAZE_WITH_GRPC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) + foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) + target_link_options(yaze_emu PRIVATE /WHOLEARCHIVE:$) + endforeach() + endif() + # Test engine is always available when tests are built # No need for conditional definitions @@ -53,6 +60,14 @@ if(YAZE_BUILD_EMU AND NOT YAZE_MINIMAL_BUILD) absl::strings absl::str_format ) + + # Apply /WHOLEARCHIVE for protobuf at executable level (Windows) + if(WIN32 AND MSVC AND YAZE_WITH_GRPC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) + foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) + target_link_options(yaze_emu_test PRIVATE /WHOLEARCHIVE:$) + endforeach() + endif() + message(STATUS "✓ yaze_emu_test: Headless emulator test harness configured") message(STATUS "✓ yaze_emu: Standalone emulator executable configured") else() diff --git a/src/cli/z3ed.cmake b/src/cli/z3ed.cmake index 752a9add..631cd812 100644 --- a/src/cli/z3ed.cmake +++ b/src/cli/z3ed.cmake @@ -42,6 +42,12 @@ if(YAZE_WITH_GRPC) target_link_libraries(z3ed PRIVATE grpc++ grpc++_reflection) if(YAZE_PROTOBUF_TARGETS) target_link_libraries(z3ed PRIVATE ${YAZE_PROTOBUF_TARGETS}) - # NOTE: Removed /WHOLEARCHIVE for protobuf - causes duplicate version.res in dependency chain + # Apply /WHOLEARCHIVE only at executable level to avoid duplicate version.res + # This ensures protobuf internal symbols are included while preventing resource duplication + if(MSVC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) + foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) + target_link_options(z3ed PRIVATE /WHOLEARCHIVE:$) + endforeach() + endif() endif() endif() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f3dc94a8..510ca402 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -47,8 +47,12 @@ if(YAZE_BUILD_TESTS) message(STATUS "Configuring Windows stack size for ${suite_name} to 16MB") if(MSVC) target_link_options(${suite_name} PRIVATE /STACK:16777216) - # NOTE: Removed /WHOLEARCHIVE for protobuf - causes LNK1241 duplicate version.res - # Protobuf symbols are already linked transitively from yaze_test_support + # Apply /WHOLEARCHIVE only at executable level to prevent duplicate version.res + if(YAZE_WITH_GRPC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) + foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) + target_link_options(${suite_name} PRIVATE /WHOLEARCHIVE:$) + endforeach() + endif() else() target_link_options(${suite_name} PRIVATE -Wl,--stack,16777216) endif() diff --git a/tools/test_helpers/CMakeLists.txt b/tools/test_helpers/CMakeLists.txt index 6c40884b..9531cd40 100644 --- a/tools/test_helpers/CMakeLists.txt +++ b/tools/test_helpers/CMakeLists.txt @@ -50,6 +50,12 @@ foreach(TOOL ${HELPER_TOOLS}) if(WIN32) if(MSVC) target_link_options(${TOOL} PRIVATE /STACK:16777216) + # Apply /WHOLEARCHIVE for protobuf at executable level + if(YAZE_WITH_GRPC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) + foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) + target_link_options(${TOOL} PRIVATE /WHOLEARCHIVE:$) + endforeach() + endif() elseif(MINGW OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") target_link_options(${TOOL} PRIVATE -Wl,--stack,16777216) else()