Skip to content

Commit 90ade48

Browse files
committed
fix windows build
1 parent a0cc973 commit 90ade48

2 files changed

Lines changed: 59 additions & 24 deletions

File tree

LegacyFindPackages.cmake

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,21 @@ if (VCPKG_TRIPLET)
2323
set(CMAKE_PREFIX_PATH "${PROJECT_SOURCE_DIR}/vcpkg_installed/${VCPKG_TRIPLET}")
2424
message(STATUS "Use CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
2525
set(PROTOC_PATH "${CMAKE_PREFIX_PATH}/tools/protobuf/protoc")
26-
if (MSVC AND VCPKG_TRIPLET MATCHES ".*-static")
27-
# vcpkg installs host executables (protoc, etc.) in the non-static triplet's
28-
# tools directory. Derive it by stripping "-static" from the triplet name.
29-
string(REPLACE "-static" "" VCPKG_HOST_TRIPLET "${VCPKG_TRIPLET}")
30-
set(PROTOC_PATH "${PROJECT_SOURCE_DIR}/vcpkg_installed/${VCPKG_HOST_TRIPLET}/tools/protobuf/protoc")
26+
if (MSVC)
27+
# vcpkg host tools (protoc, etc.) are always built for the host machine
28+
# architecture (x64 on GitHub Actions), regardless of the target triplet.
29+
# Use find_program to locate protoc.exe across known host tool paths.
30+
find_program(PROTOC_PATH NAMES protoc.exe
31+
PATHS
32+
"${PROJECT_SOURCE_DIR}/vcpkg_installed/x64-windows/tools/protobuf"
33+
"${PROJECT_SOURCE_DIR}/vcpkg_installed/arm64-windows/tools/protobuf"
34+
"${PROJECT_SOURCE_DIR}/vcpkg_installed/${VCPKG_TRIPLET}/tools/protobuf"
35+
NO_DEFAULT_PATH)
36+
if (NOT PROTOC_PATH)
37+
set(PROTOC_PATH "${CMAKE_PREFIX_PATH}/tools/protobuf/protoc.exe")
38+
endif ()
3139
# Set the cache variable so protobuf's CMake module compatibility shim finds it
32-
set(Protobuf_PROTOC_EXECUTABLE "${PROTOC_PATH}.exe" CACHE FILEPATH "protoc executable" FORCE)
40+
set(Protobuf_PROTOC_EXECUTABLE "${PROTOC_PATH}" CACHE FILEPATH "protoc executable" FORCE)
3341
endif ()
3442
message(STATUS "Use protoc: ${PROTOC_PATH}")
3543
set(VCPKG_ROOT "${PROJECT_SOURCE_DIR}/vcpkg_installed/${VCPKG_TRIPLET}")

lib/CMakeLists.txt

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -140,26 +140,53 @@ if (LINK_STATIC AND BUILD_STATIC_LIB)
140140

141141
add_library(pulsarStaticWithDeps STATIC ${PULSAR_SOURCES})
142142
target_include_directories(pulsarStaticWithDeps PRIVATE ${dlfcn-win32_INCLUDE_DIRS})
143-
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
144-
remove_libtype("${COMMON_LIBS}" "optimized" STATIC_LIBS)
145-
else ()
146-
remove_libtype("${COMMON_LIBS}" "debug" STATIC_LIBS)
147-
endif ()
148-
# lib.exe (STATIC_LIBRARY_OPTIONS) cannot resolve CMake imported target names.
149-
# Replace each CMake target with $<TARGET_FILE:...>; keep only static archives
150-
# (skip system import libs that have no absolute path and non-archive targets).
151-
set(RESOLVED_STATIC_LIBS "")
152-
foreach (LIB IN LISTS STATIC_LIBS)
153-
if (TARGET ${LIB})
154-
get_target_property(_LIB_TYPE ${LIB} TYPE)
155-
if (_LIB_TYPE STREQUAL "STATIC_LIBRARY" OR _LIB_TYPE STREQUAL "UNKNOWN_LIBRARY")
156-
list(APPEND RESOLVED_STATIC_LIBS "$<TARGET_FILE:${LIB}>")
143+
if (VCPKG_TRIPLET)
144+
# Collect ALL vcpkg-installed static archives so every transitive dependency
145+
# (protobuf, abseil, curl, zlib, etc.) is merged into the fat lib without
146+
# requiring manual enumeration of individual targets.
147+
set(_vcpkg_dir "${PROJECT_SOURCE_DIR}/vcpkg_installed/${VCPKG_TRIPLET}")
148+
file(GLOB _release_libs "${_vcpkg_dir}/lib/*.lib")
149+
file(GLOB _debug_libs "${_vcpkg_dir}/debug/lib/*.lib")
150+
# Exclude the protobuf compiler tool and lite runtime (not needed at runtime)
151+
foreach (_excl "libprotoc" "libprotobuf-lite")
152+
list(FILTER _release_libs EXCLUDE REGEX "/${_excl}\\.lib$")
153+
list(FILTER _debug_libs EXCLUDE REGEX "/${_excl}\\.lib$")
154+
endforeach ()
155+
# Build per-lib generator expressions to select debug vs release archive
156+
# for multi-config generators (Visual Studio).
157+
set(_vcpkg_static_libs "")
158+
foreach (_rlib IN LISTS _release_libs)
159+
get_filename_component(_libname "${_rlib}" NAME)
160+
set(_dlib "${_vcpkg_dir}/debug/lib/${_libname}")
161+
if (EXISTS "${_dlib}")
162+
list(APPEND _vcpkg_static_libs "$<IF:$<CONFIG:Debug>,${_dlib},${_rlib}>")
163+
else ()
164+
list(APPEND _vcpkg_static_libs "${_rlib}")
157165
endif ()
158-
elseif (IS_ABSOLUTE "${LIB}" AND LIB MATCHES "\\.(lib|a)$")
159-
list(APPEND RESOLVED_STATIC_LIBS "${LIB}")
166+
endforeach ()
167+
set_property(TARGET pulsarStaticWithDeps PROPERTY STATIC_LIBRARY_OPTIONS ${_vcpkg_static_libs})
168+
else ()
169+
# Non-vcpkg MSVC static build: resolve COMMON_LIBS entries for lib.exe.
170+
# CMake imported target names cannot be passed to lib.exe directly; replace
171+
# them with $<TARGET_FILE:...> generator expressions.
172+
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
173+
remove_libtype("${COMMON_LIBS}" "optimized" STATIC_LIBS)
174+
else ()
175+
remove_libtype("${COMMON_LIBS}" "debug" STATIC_LIBS)
160176
endif ()
161-
endforeach ()
162-
set_property(TARGET pulsarStaticWithDeps PROPERTY STATIC_LIBRARY_OPTIONS ${RESOLVED_STATIC_LIBS})
177+
set(RESOLVED_STATIC_LIBS "")
178+
foreach (LIB IN LISTS STATIC_LIBS)
179+
if (TARGET ${LIB})
180+
get_target_property(_LIB_TYPE ${LIB} TYPE)
181+
if (_LIB_TYPE STREQUAL "STATIC_LIBRARY" OR _LIB_TYPE STREQUAL "UNKNOWN_LIBRARY")
182+
list(APPEND RESOLVED_STATIC_LIBS "$<TARGET_FILE:${LIB}>")
183+
endif ()
184+
elseif (IS_ABSOLUTE "${LIB}" AND LIB MATCHES "\\.(lib|a)$")
185+
list(APPEND RESOLVED_STATIC_LIBS "${LIB}")
186+
endif ()
187+
endforeach ()
188+
set_property(TARGET pulsarStaticWithDeps PROPERTY STATIC_LIBRARY_OPTIONS ${RESOLVED_STATIC_LIBS})
189+
endif ()
163190
set_property(TARGET pulsarStaticWithDeps PROPERTY OUTPUT_NAME ${LIB_NAME}WithDeps)
164191
set_property(TARGET pulsarStaticWithDeps PROPERTY VERSION ${LIBRARY_VERSION})
165192
install(TARGETS pulsarStaticWithDeps DESTINATION lib)

0 commit comments

Comments
 (0)