mirror of
https://github.com/microsoft/vcpkg.git
synced 2024-11-24 01:59:00 +08:00
[vcpkg] Fixup rpath after building dynamic libraries on linux (#23035)
* Fixup rpath after building dynamic libraries on linux * Switch back to a single variable VCPKG_FIXUP_ELF_RPATH Co-authored-by: Victor Romero <romerosanchezv@gmail.com> * Don't force fixup in x64-linux triplet yet Co-authored-by: Victor Romero <romerosanchezv@gmail.com> Co-authored-by: Osyotr <8740768+Osyotr@users.noreply.github.com>
This commit is contained in:
parent
15a0ab7a3e
commit
42b2876645
@ -545,6 +545,24 @@ function(vcpkg_find_acquire_program program)
|
||||
set(apt_package_name pkg-config)
|
||||
set(paths_to_search "/bin" "/usr/bin" "/usr/local/bin")
|
||||
endif()
|
||||
elseif(program STREQUAL "PATCHELF")
|
||||
set(program_name patchelf)
|
||||
set(program_version 0.14.5)
|
||||
set(supported_on_unix ON)
|
||||
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
|
||||
if(HOST_ARCH STREQUAL "aarch64")
|
||||
set(patchelf_platform "aarch64")
|
||||
set(download_sha512 "3B5EB4405FAB1D5202728AA390DD9F059CD7AFD582BAD9C50383CAD605127BC77DFCE3F2F26E9714F6BD5CCFFD49D3973BA2F061D2E2931B6E1BD0C263B99E75")
|
||||
else()
|
||||
set(patchelf_platform "x86_64")
|
||||
set(download_sha512 "5E983A25B3F3F3B8582D1DE6C7DE30812E8D6E58E96F711F33A2634D3FB1F2370531DA179927AA401328319F92465E6F76274A6F994D1DC54C74B98E704D0D29")
|
||||
endif()
|
||||
set(download_filename "${program_name}-${program_version}-${patchelf_platform}.tar.gz")
|
||||
set(download_urls "https://github.com/NixOS/patchelf/releases/download/${program_version}/${download_filename}")
|
||||
set(tool_subdirectory "${program_version}-${patchelf_platform}-linux")
|
||||
set(paths_to_search "${DOWNLOADS}/tools/patchelf/${program_version}-${patchelf_platform}-linux/bin")
|
||||
endif()
|
||||
set(version_command --version)
|
||||
else()
|
||||
message(FATAL "unknown tool ${program} -- unable to acquire.")
|
||||
endif()
|
||||
|
57
scripts/cmake/z_vcpkg_fixup_rpath.cmake
Normal file
57
scripts/cmake/z_vcpkg_fixup_rpath.cmake
Normal file
@ -0,0 +1,57 @@
|
||||
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()
|
@ -146,6 +146,9 @@ if(CMD STREQUAL "BUILD")
|
||||
|
||||
include("${CURRENT_PORT_DIR}/portfile.cmake")
|
||||
if(DEFINED PORT)
|
||||
if(VCPKG_FIXUP_ELF_RPATH)
|
||||
include("${SCRIPTS}/cmake/z_vcpkg_fixup_rpath.cmake")
|
||||
endif()
|
||||
include("${SCRIPTS}/build_info.cmake")
|
||||
endif()
|
||||
elseif(CMD STREQUAL "CREATE")
|
||||
|
7
triplets/community/x64-linux-dynamic.cmake
Normal file
7
triplets/community/x64-linux-dynamic.cmake
Normal file
@ -0,0 +1,7 @@
|
||||
set(VCPKG_TARGET_ARCHITECTURE x64)
|
||||
set(VCPKG_CRT_LINKAGE dynamic)
|
||||
set(VCPKG_LIBRARY_LINKAGE dynamic)
|
||||
|
||||
set(VCPKG_CMAKE_SYSTEM_NAME Linux)
|
||||
|
||||
set(VCPKG_FIXUP_ELF_RPATH ON)
|
Loading…
Reference in New Issue
Block a user