diff --git a/scripts/cmake/vcpkg_copy_pdbs.cmake b/scripts/cmake/vcpkg_copy_pdbs.cmake index ce26c8d1ffa77a..3a0bb51377e66a 100644 --- a/scripts/cmake/vcpkg_copy_pdbs.cmake +++ b/scripts/cmake/vcpkg_copy_pdbs.cmake @@ -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()