vcpkg/scripts/cmake/z_vcpkg_fixup_rpath.cmake

58 lines
2.0 KiB
CMake
Raw Normal View History

function(z_vcpkg_fixup_rpath_in_dir)
vcpkg_find_acquire_program(PATCHELF)
# We need to iterate trough everything because we
# can't predict where an elf file will be located
file(GLOB root_entries LIST_DIRECTORIES TRUE "${CURRENT_PACKAGES_DIR}/*")
# Skip some folders for better throughput
list(APPEND folders_to_skip "include")
list(JOIN folders_to_skip "|" folders_to_skip_regex)
set(folders_to_skip_regex "^(${folders_to_skip_regex})$")
foreach(folder IN LISTS root_entries)
if(NOT IS_DIRECTORY "${folder}")
continue()
endif()
get_filename_component(folder_name "${folder}" NAME)
if(folder_name MATCHES "${folders_to_skip_regex}")
continue()
endif()
file(GLOB_RECURSE elf_files LIST_DIRECTORIES FALSE "${folder}/*")
foreach(elf_file IN LISTS elf_files)
if(IS_SYMLINK "${elf_file}")
continue()
endif()
get_filename_component(elf_file_dir "${elf_file}" DIRECTORY)
set(current_prefix "${CURRENT_PACKAGES_DIR}")
if(elf_file_dir MATCHES "debug/")
set(current_prefix "${CURRENT_PACKAGES_DIR}/debug")
endif()
# compute path relative to lib
file(RELATIVE_PATH relative_to_lib "${elf_file_dir}" "${current_prefix}/lib")
if(relative_to_lib STREQUAL "")
set(rpath "\$ORIGIN")
else()
set(rpath "\$ORIGIN:\$ORIGIN/${relative_to_lib}")
endif()
# If this fails, the file is not an elf
execute_process(
COMMAND "${PATCHELF}" --set-rpath "${rpath}" "${elf_file}"
OUTPUT_QUIET
ERROR_VARIABLE set_rpath_error
)
if("${set_rpath_error}" STREQUAL "")
message(STATUS "Fixed rpath: ${elf_file} (${rpath})")
endif()
endforeach()
endforeach()
endfunction()
z_vcpkg_fixup_rpath_in_dir()