From 283a21888ede23f5438dfd9382ca05a18452d2db Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 18 Oct 2025 12:53:15 -0400 Subject: [PATCH] chore: refine protobuf linking logic for Windows builds - Enhanced CMake configuration to conditionally apply /WHOLEARCHIVE linking for protobuf targets, ensuring only library targets are included. - Updated linking logic across multiple components including `yaze`, `yaze_emu`, `z3ed`, and test suites to improve compatibility and prevent linker errors. Benefits: - Increases build stability and clarity by ensuring only relevant targets are linked, reducing potential conflicts during the build process. --- cmake/dependencies.cmake | 11 ++++++++++- src/app/app.cmake | 7 ++++++- src/app/emu/emu.cmake | 14 ++++++++++++-- src/cli/z3ed.cmake | 7 ++++++- test/CMakeLists.txt | 7 ++++++- tools/test_helpers/CMakeLists.txt | 7 ++++++- 6 files changed, 46 insertions(+), 7 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index efbbe6fe..5e788cf0 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -95,7 +95,16 @@ else() endif() endif() -set(YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS ${YAZE_PROTOBUF_TARGETS}) +# Filter WHOLEARCHIVE targets to only include libraries (not executables like protoc) +set(YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) +foreach(_proto_target IN LISTS YAZE_PROTOBUF_TARGETS) + if(TARGET ${_proto_target}) + get_target_property(_target_type ${_proto_target} TYPE) + if(_target_type MATCHES ".*_LIBRARY") + list(APPEND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS ${_proto_target}) + endif() + endif() +endforeach() if(YAZE_PROTOBUF_TARGETS) list(GET YAZE_PROTOBUF_TARGETS 0 YAZE_PROTOBUF_TARGET) diff --git a/src/app/app.cmake b/src/app/app.cmake index 7588a1a0..4c539fca 100644 --- a/src/app/app.cmake +++ b/src/app/app.cmake @@ -207,7 +207,12 @@ if(YAZE_WITH_GRPC AND YAZE_PROTOBUF_TARGETS) # On Unix: Use normal linking (symbols resolve correctly without whole-archive) if(MSVC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) - target_link_options(yaze PRIVATE /WHOLEARCHIVE:$) + if(TARGET ${_yaze_proto_target}) + get_target_property(_target_type ${_yaze_proto_target} TYPE) + if(_target_type MATCHES ".*_LIBRARY") + target_link_options(yaze PRIVATE /WHOLEARCHIVE:$) + endif() + endif() endforeach() else() target_link_libraries(yaze PRIVATE ${YAZE_PROTOBUF_TARGETS}) diff --git a/src/app/emu/emu.cmake b/src/app/emu/emu.cmake index 8082be2e..0d989dbc 100644 --- a/src/app/emu/emu.cmake +++ b/src/app/emu/emu.cmake @@ -37,7 +37,12 @@ if(YAZE_BUILD_EMU AND NOT YAZE_MINIMAL_BUILD) # Windows: Link protobuf with /WHOLEARCHIVE (not via libraries to avoid LNK1241) 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:$) + if(TARGET ${_yaze_proto_target}) + get_target_property(_target_type ${_yaze_proto_target} TYPE) + if(_target_type MATCHES ".*_LIBRARY") + target_link_options(yaze_emu PRIVATE /WHOLEARCHIVE:$) + endif() + endif() endforeach() elseif(YAZE_WITH_GRPC AND YAZE_PROTOBUF_TARGETS) target_link_libraries(yaze_emu PRIVATE ${YAZE_PROTOBUF_TARGETS}) @@ -66,7 +71,12 @@ if(YAZE_BUILD_EMU AND NOT YAZE_MINIMAL_BUILD) # Windows: Link protobuf with /WHOLEARCHIVE (not via libraries to avoid LNK1241) 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:$) + if(TARGET ${_yaze_proto_target}) + get_target_property(_target_type ${_yaze_proto_target} TYPE) + if(_target_type MATCHES ".*_LIBRARY") + target_link_options(yaze_emu_test PRIVATE /WHOLEARCHIVE:$) + endif() + endif() endforeach() elseif(YAZE_WITH_GRPC AND YAZE_PROTOBUF_TARGETS) target_link_libraries(yaze_emu_test PRIVATE ${YAZE_PROTOBUF_TARGETS}) diff --git a/src/cli/z3ed.cmake b/src/cli/z3ed.cmake index 05925a81..cb30537e 100644 --- a/src/cli/z3ed.cmake +++ b/src/cli/z3ed.cmake @@ -45,7 +45,12 @@ if(YAZE_WITH_GRPC) # On Unix: Use normal linking (symbols resolve correctly without whole-archive) if(MSVC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS) - target_link_options(z3ed PRIVATE /WHOLEARCHIVE:$) + if(TARGET ${_yaze_proto_target}) + get_target_property(_target_type ${_yaze_proto_target} TYPE) + if(_target_type MATCHES ".*_LIBRARY") + target_link_options(z3ed PRIVATE /WHOLEARCHIVE:$) + endif() + endif() endforeach() else() target_link_libraries(z3ed PRIVATE ${YAZE_PROTOBUF_TARGETS}) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a5e2b2f9..ffe45fa7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -46,7 +46,12 @@ if(YAZE_BUILD_TESTS) # Link protobuf with /WHOLEARCHIVE on Windows (instead of via libraries) 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(${suite_name} PRIVATE /WHOLEARCHIVE:$) + if(TARGET ${_yaze_proto_target}) + get_target_property(_target_type ${_yaze_proto_target} TYPE) + if(_target_type MATCHES ".*_LIBRARY") + target_link_options(${suite_name} PRIVATE /WHOLEARCHIVE:$) + endif() + endif() endforeach() endif() diff --git a/tools/test_helpers/CMakeLists.txt b/tools/test_helpers/CMakeLists.txt index fea68157..cdf695f4 100644 --- a/tools/test_helpers/CMakeLists.txt +++ b/tools/test_helpers/CMakeLists.txt @@ -50,7 +50,12 @@ foreach(TOOL ${HELPER_TOOLS}) # Windows: Link protobuf with /WHOLEARCHIVE (not via yaze_core to avoid LNK1241) 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(${TOOL} PRIVATE /WHOLEARCHIVE:$) + if(TARGET ${_yaze_proto_target}) + get_target_property(_target_type ${_yaze_proto_target} TYPE) + if(_target_type MATCHES ".*_LIBRARY") + target_link_options(${TOOL} PRIVATE /WHOLEARCHIVE:$) + endif() + endif() endforeach() elseif(YAZE_WITH_GRPC AND YAZE_PROTOBUF_TARGETS) target_link_libraries(${TOOL} PRIVATE ${YAZE_PROTOBUF_TARGETS})