chore: update protobuf linking strategy for Windows
- Adjusted CMake files to conditionally link protobuf using /WHOLEARCHIVE on Windows to include internal symbols while avoiding LNK1241 errors. - Updated linking logic for `yaze`, `yaze_editor`, `yaze_emu`, `z3ed`, and test suites to ensure compatibility across platforms. Benefits: - Improves build stability and compatibility for Windows users by ensuring proper symbol inclusion without resource duplication issues.
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -14,7 +14,6 @@ compile_commands.json
|
|||||||
CPackConfig.cmake
|
CPackConfig.cmake
|
||||||
CPackSourceConfig.cmake
|
CPackSourceConfig.cmake
|
||||||
CTestTestfile.cmake
|
CTestTestfile.cmake
|
||||||
Testing/
|
|
||||||
|
|
||||||
# Build artifacts
|
# Build artifacts
|
||||||
*.o
|
*.o
|
||||||
@@ -92,4 +91,5 @@ recent_files.txt
|
|||||||
.vs/*
|
.vs/*
|
||||||
.gitignore
|
.gitignore
|
||||||
.genkit
|
.genkit
|
||||||
.claude
|
.claude
|
||||||
|
scripts/__pycache__/
|
||||||
|
|||||||
@@ -127,9 +127,10 @@ if(YAZE_WITH_GRPC)
|
|||||||
grpc++
|
grpc++
|
||||||
grpc++_reflection
|
grpc++_reflection
|
||||||
)
|
)
|
||||||
if(YAZE_PROTOBUF_TARGETS)
|
# NOTE: Do NOT link protobuf at library level on Windows - causes LNK1241
|
||||||
|
# Executables will link it with /WHOLEARCHIVE to include internal symbols
|
||||||
|
if(NOT WIN32 AND YAZE_PROTOBUF_TARGETS)
|
||||||
target_link_libraries(yaze_app_core_lib PUBLIC ${YAZE_PROTOBUF_TARGETS})
|
target_link_libraries(yaze_app_core_lib PUBLIC ${YAZE_PROTOBUF_TARGETS})
|
||||||
# NOTE: Removed /WHOLEARCHIVE for protobuf - causes duplicate version.res in dependency chain
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
message(STATUS " - gRPC ROM service + canvas automation enabled")
|
message(STATUS " - gRPC ROM service + canvas automation enabled")
|
||||||
@@ -202,13 +203,14 @@ target_link_libraries(yaze PRIVATE
|
|||||||
absl::flags_parse
|
absl::flags_parse
|
||||||
)
|
)
|
||||||
if(YAZE_WITH_GRPC AND YAZE_PROTOBUF_TARGETS)
|
if(YAZE_WITH_GRPC AND YAZE_PROTOBUF_TARGETS)
|
||||||
target_link_libraries(yaze PRIVATE ${YAZE_PROTOBUF_TARGETS})
|
# On Windows: Use /WHOLEARCHIVE instead of normal linking to include internal symbols
|
||||||
# Apply /WHOLEARCHIVE only at executable level to avoid duplicate version.res
|
# On Unix: Use normal linking (symbols resolve correctly without whole-archive)
|
||||||
# This ensures protobuf internal symbols are included while preventing resource duplication
|
|
||||||
if(MSVC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
if(MSVC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
||||||
foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
||||||
target_link_options(yaze PRIVATE /WHOLEARCHIVE:$<TARGET_FILE:${_yaze_proto_target}>)
|
target_link_options(yaze PRIVATE /WHOLEARCHIVE:$<TARGET_FILE:${_yaze_proto_target}>)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
else()
|
||||||
|
target_link_libraries(yaze PRIVATE ${YAZE_PROTOBUF_TARGETS})
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -167,9 +167,10 @@ if(YAZE_WITH_GRPC)
|
|||||||
grpc++
|
grpc++
|
||||||
grpc++_reflection
|
grpc++_reflection
|
||||||
)
|
)
|
||||||
if(YAZE_PROTOBUF_TARGETS)
|
# NOTE: Do NOT link protobuf at library level on Windows - causes LNK1241
|
||||||
|
# Executables will link it with /WHOLEARCHIVE to include internal symbols
|
||||||
|
if(NOT WIN32 AND YAZE_PROTOBUF_TARGETS)
|
||||||
target_link_libraries(yaze_editor PRIVATE ${YAZE_PROTOBUF_TARGETS})
|
target_link_libraries(yaze_editor PRIVATE ${YAZE_PROTOBUF_TARGETS})
|
||||||
# NOTE: Removed /WHOLEARCHIVE for protobuf - causes duplicate version.res in dependency chain
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -154,9 +154,7 @@ void OverworldEditor::Initialize() {
|
|||||||
entity_renderer_ = std::make_unique<OverworldEntityRenderer>(
|
entity_renderer_ = std::make_unique<OverworldEntityRenderer>(
|
||||||
&overworld_, &ow_map_canvas_, &sprite_previews_);
|
&overworld_, &ow_map_canvas_, &sprite_previews_);
|
||||||
|
|
||||||
// Setup Canvas Automation API callbacks (Phase 4)
|
|
||||||
SetupCanvasAutomation();
|
SetupCanvasAutomation();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
absl::Status OverworldEditor::Load() {
|
absl::Status OverworldEditor::Load() {
|
||||||
|
|||||||
@@ -34,11 +34,13 @@ if(YAZE_BUILD_EMU AND NOT YAZE_MINIMAL_BUILD)
|
|||||||
message(WARNING "yaze_emu needs yaze_test_support but TARGET not found")
|
message(WARNING "yaze_emu needs yaze_test_support but TARGET not found")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Apply /WHOLEARCHIVE for protobuf at executable level (Windows)
|
# Windows: Link protobuf with /WHOLEARCHIVE (not via libraries to avoid LNK1241)
|
||||||
if(WIN32 AND MSVC AND YAZE_WITH_GRPC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
if(WIN32 AND MSVC AND YAZE_WITH_GRPC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
||||||
foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
||||||
target_link_options(yaze_emu PRIVATE /WHOLEARCHIVE:$<TARGET_FILE:${_yaze_proto_target}>)
|
target_link_options(yaze_emu PRIVATE /WHOLEARCHIVE:$<TARGET_FILE:${_yaze_proto_target}>)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
elseif(YAZE_WITH_GRPC AND YAZE_PROTOBUF_TARGETS)
|
||||||
|
target_link_libraries(yaze_emu PRIVATE ${YAZE_PROTOBUF_TARGETS})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Test engine is always available when tests are built
|
# Test engine is always available when tests are built
|
||||||
@@ -61,11 +63,13 @@ if(YAZE_BUILD_EMU AND NOT YAZE_MINIMAL_BUILD)
|
|||||||
absl::str_format
|
absl::str_format
|
||||||
)
|
)
|
||||||
|
|
||||||
# Apply /WHOLEARCHIVE for protobuf at executable level (Windows)
|
# Windows: Link protobuf with /WHOLEARCHIVE (not via libraries to avoid LNK1241)
|
||||||
if(WIN32 AND MSVC AND YAZE_WITH_GRPC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
if(WIN32 AND MSVC AND YAZE_WITH_GRPC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
||||||
foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
||||||
target_link_options(yaze_emu_test PRIVATE /WHOLEARCHIVE:$<TARGET_FILE:${_yaze_proto_target}>)
|
target_link_options(yaze_emu_test PRIVATE /WHOLEARCHIVE:$<TARGET_FILE:${_yaze_proto_target}>)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
elseif(YAZE_WITH_GRPC AND YAZE_PROTOBUF_TARGETS)
|
||||||
|
target_link_libraries(yaze_emu_test PRIVATE ${YAZE_PROTOBUF_TARGETS})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
message(STATUS "✓ yaze_emu_test: Headless emulator test harness configured")
|
message(STATUS "✓ yaze_emu_test: Headless emulator test harness configured")
|
||||||
|
|||||||
@@ -84,9 +84,10 @@ if(YAZE_WITH_GRPC)
|
|||||||
grpc++
|
grpc++
|
||||||
grpc++_reflection
|
grpc++_reflection
|
||||||
)
|
)
|
||||||
if(YAZE_PROTOBUF_TARGETS)
|
# NOTE: Do NOT link protobuf at library level on Windows - causes LNK1241
|
||||||
|
# Executables will link it with /WHOLEARCHIVE to include internal symbols
|
||||||
|
if(NOT WIN32 AND YAZE_PROTOBUF_TARGETS)
|
||||||
target_link_libraries(yaze_net PUBLIC ${YAZE_PROTOBUF_TARGETS})
|
target_link_libraries(yaze_net PUBLIC ${YAZE_PROTOBUF_TARGETS})
|
||||||
# NOTE: Removed /WHOLEARCHIVE for protobuf - causes duplicate version.res in dependency chain
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
message(STATUS " - gRPC ROM service enabled")
|
message(STATUS " - gRPC ROM service enabled")
|
||||||
|
|||||||
@@ -161,9 +161,10 @@ if(YAZE_WITH_GRPC)
|
|||||||
grpc++
|
grpc++
|
||||||
grpc++_reflection
|
grpc++_reflection
|
||||||
)
|
)
|
||||||
if(YAZE_PROTOBUF_TARGETS)
|
# NOTE: Do NOT link protobuf at library level on Windows - causes LNK1241
|
||||||
|
# Executables will link it with /WHOLEARCHIVE to include internal symbols
|
||||||
|
if(NOT WIN32 AND YAZE_PROTOBUF_TARGETS)
|
||||||
target_link_libraries(yaze_agent PUBLIC ${YAZE_PROTOBUF_TARGETS})
|
target_link_libraries(yaze_agent PUBLIC ${YAZE_PROTOBUF_TARGETS})
|
||||||
# NOTE: Removed /WHOLEARCHIVE for protobuf - causes duplicate version.res in dependency chain
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# 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 root CMakeLists.txt
|
||||||
|
|||||||
@@ -41,13 +41,14 @@ if(YAZE_WITH_GRPC)
|
|||||||
message(STATUS "Adding gRPC support to z3ed CLI")
|
message(STATUS "Adding gRPC support to z3ed CLI")
|
||||||
target_link_libraries(z3ed PRIVATE grpc++ grpc++_reflection)
|
target_link_libraries(z3ed PRIVATE grpc++ grpc++_reflection)
|
||||||
if(YAZE_PROTOBUF_TARGETS)
|
if(YAZE_PROTOBUF_TARGETS)
|
||||||
target_link_libraries(z3ed PRIVATE ${YAZE_PROTOBUF_TARGETS})
|
# On Windows: Use /WHOLEARCHIVE instead of normal linking to include internal symbols
|
||||||
# Apply /WHOLEARCHIVE only at executable level to avoid duplicate version.res
|
# On Unix: Use normal linking (symbols resolve correctly without whole-archive)
|
||||||
# This ensures protobuf internal symbols are included while preventing resource duplication
|
|
||||||
if(MSVC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
if(MSVC AND YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
||||||
foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
foreach(_yaze_proto_target IN LISTS YAZE_PROTOBUF_WHOLEARCHIVE_TARGETS)
|
||||||
target_link_options(z3ed PRIVATE /WHOLEARCHIVE:$<TARGET_FILE:${_yaze_proto_target}>)
|
target_link_options(z3ed PRIVATE /WHOLEARCHIVE:$<TARGET_FILE:${_yaze_proto_target}>)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
else()
|
||||||
|
target_link_libraries(z3ed PRIVATE ${YAZE_PROTOBUF_TARGETS})
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -43,16 +43,17 @@ if(YAZE_BUILD_TESTS)
|
|||||||
YAZE_GUI_TEST_TARGET=1) # Mark this as a GUI test target
|
YAZE_GUI_TEST_TARGET=1) # Mark this as a GUI test target
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# 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:$<TARGET_FILE:${_yaze_proto_target}>)
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
message(STATUS "Configuring Windows stack size for ${suite_name} to 16MB")
|
message(STATUS "Configuring Windows stack size for ${suite_name} to 16MB")
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
target_link_options(${suite_name} PRIVATE /STACK:16777216)
|
target_link_options(${suite_name} PRIVATE /STACK:16777216)
|
||||||
# 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:$<TARGET_FILE:${_yaze_proto_target}>)
|
|
||||||
endforeach()
|
|
||||||
endif()
|
|
||||||
else()
|
else()
|
||||||
target_link_options(${suite_name} PRIVATE -Wl,--stack,16777216)
|
target_link_options(${suite_name} PRIVATE -Wl,--stack,16777216)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -47,15 +47,18 @@ set(HELPER_TOOLS
|
|||||||
)
|
)
|
||||||
|
|
||||||
foreach(TOOL ${HELPER_TOOLS})
|
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:$<TARGET_FILE:${_yaze_proto_target}>)
|
||||||
|
endforeach()
|
||||||
|
elseif(YAZE_WITH_GRPC AND YAZE_PROTOBUF_TARGETS)
|
||||||
|
target_link_libraries(${TOOL} PRIVATE ${YAZE_PROTOBUF_TARGETS})
|
||||||
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
target_link_options(${TOOL} PRIVATE /STACK:16777216)
|
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:$<TARGET_FILE:${_yaze_proto_target}>)
|
|
||||||
endforeach()
|
|
||||||
endif()
|
|
||||||
elseif(MINGW OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
elseif(MINGW OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
target_link_options(${TOOL} PRIVATE -Wl,--stack,16777216)
|
target_link_options(${TOOL} PRIVATE -Wl,--stack,16777216)
|
||||||
else()
|
else()
|
||||||
|
|||||||
Reference in New Issue
Block a user