Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 65 additions & 17 deletions scripts/cmake/vcpkg_copy_pdbs.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -11,37 +11,85 @@ function(vcpkg_copy_pdbs)
"${CURRENT_PACKAGES_DIR}/debug/bin/*.dll"
)
endif()
set(debug_packages_prefix "${CURRENT_PACKAGES_DIR}/debug")

set(dlls_without_matching_pdbs "")

if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic" AND VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW)
if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic" AND VCPKG_TARGET_IS_WINDOWS)
file(GLOB_RECURSE dlls ${arg_BUILD_PATHS})

set(USE_DUMPBIN TRUE)
if(NOT VCPKG_HOST_IS_WINDOWS)
set(USE_DUMPBIN FALSE)
endif()

set(vslang_backup "$ENV{VSLANG}")
set(ENV{VSLANG} 1033)
if(USE_DUMPBIN)
set(vslang_backup "$ENV{VSLANG}")
set(ENV{VSLANG} 1033)
endif()

foreach(dll IN LISTS dlls)
execute_process(COMMAND dumpbin /PDBPATH "${dll}"
COMMAND findstr PDB
OUTPUT_VARIABLE pdb_line
ERROR_QUIET
RESULT_VARIABLE error_code
)

if(error_code EQUAL "0" AND pdb_line MATCHES "PDB file found at.*'(.*)'")
set(pdb_path "${CMAKE_MATCH_1}")
set(found_pdb FALSE)
if(USE_DUMPBIN)
execute_process(COMMAND dumpbin /PDBPATH "${dll}"
COMMAND findstr PDB
OUTPUT_VARIABLE pdb_line
ERROR_QUIET
RESULT_VARIABLE error_code
)

if(error_code EQUAL "0" AND pdb_line MATCHES "PDB file found at.*'(.*)'")
set(pdb_path "${CMAKE_MATCH_1}")
cmake_path(GET dll PARENT_PATH dll_dir)
file(COPY "${pdb_path}" DESTINATION "${dll_dir}")
set(found_pdb TRUE)
endif()
endif()

if(NOT found_pdb AND VCPKG_TARGET_IS_MINGW)
# Support llvm / clang mingw (with PDB generation) in cross-compilation scenarios by looking for the default case
# of a .pdb file matching the dll name in the build directory

set(dll_build_dir "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel")
cmake_path(IS_PREFIX debug_packages_prefix "${dll}" NORMALIZE is_debug_package)
if(is_debug_package)
set(dll_build_dir "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg")
endif()

cmake_path(GET dll STEM LAST_ONLY dll_name)
cmake_path(GET dll PARENT_PATH dll_dir)
file(COPY "${pdb_path}" DESTINATION "${dll_dir}")
else()
set(pdb_path "${dll_build_dir}/${dll_name}.pdb")
if (EXISTS "${pdb_path}")
file(COPY "${pdb_path}" DESTINATION "${dll_dir}")
set(found_pdb TRUE)
else()
file(GLOB_RECURSE pdb_path "${dll_build_dir}/${dll_name}.pdb")
list(LENGTH pdb_path pdb_path_count)
if(pdb_path_count EQUAL "1")
file(COPY "${pdb_path}" DESTINATION "${dll_dir}")
set(found_pdb TRUE)
else()
message(WARNING "Unexpectedly found more than one matching PDB for: ${dll}\n${pdb_path}\n")
endif()
endif()
endif()

if(NOT found_pdb)
list(APPEND dlls_without_matching_pdbs "${dll}")
endif()
endforeach()

set(ENV{VSLANG} "${vslang_backup}")

if(USE_DUMPBIN)
set(ENV{VSLANG} "${vslang_backup}")
endif()

if(NOT dlls_without_matching_pdbs STREQUAL "")
list(JOIN dlls_without_matching_pdbs "\n " message)
message(WARNING "Could not find a matching pdb file for:
set(_message_level WARNING)
if(VCPKG_TARGET_IS_MINGW)
set(_message_level STATUS) # not all mingw toolchains support generating .pdb
endif()
message(${_message_level} "Could not find a matching pdb file for:
${message}\n")
endif()
endif()
Expand Down