aboutsummaryrefslogtreecommitdiff
path: root/cmake/LinuxPackages.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/LinuxPackages.cmake')
-rw-r--r--cmake/LinuxPackages.cmake34
1 files changed, 34 insertions, 0 deletions
diff --git a/cmake/LinuxPackages.cmake b/cmake/LinuxPackages.cmake
new file mode 100644
index 0000000..9e9f26b
--- /dev/null
+++ b/cmake/LinuxPackages.cmake
@@ -0,0 +1,34 @@
+function(cpsc_prepare_linux_packages)
+ # Development packages can contain absolute links to runtime packages.
+ file(GLOB_RECURSE files LIST_DIRECTORIES FALSE "${CPSC_DEPS_ROOT}/*")
+ foreach(path IN LISTS files)
+ if(IS_SYMLINK "${path}")
+ execute_process(COMMAND readlink "${path}" OUTPUT_VARIABLE target
+ OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE result)
+ if(NOT result EQUAL 0)
+ message(FATAL_ERROR "Cannot read dependency symlink ${path}")
+ endif()
+ if(IS_ABSOLUTE "${target}" AND EXISTS "${CPSC_DEPS_ROOT}${target}")
+ get_filename_component(directory "${path}" DIRECTORY)
+ file(RELATIVE_PATH relative "${directory}" "${CPSC_DEPS_ROOT}${target}")
+ file(REMOVE "${path}")
+ execute_process(COMMAND "${CMAKE_COMMAND}" -E create_symlink
+ "${relative}" "${path}" RESULT_VARIABLE result)
+ if(NOT result EQUAL 0)
+ message(FATAL_ERROR "Cannot relocate dependency symlink ${path}")
+ endif()
+ endif()
+ elseif(path MATCHES "\\.cmake$")
+ # For example, Debian's LLVMSupport interface hard-codes libz3.so.
+ file(READ "${path}" contents)
+ string(REGEX MATCHALL "/(usr/)?lib[^\" ;()\n]+" references "${contents}")
+ foreach(reference IN LISTS references)
+ if(EXISTS "${CPSC_DEPS_ROOT}${reference}")
+ string(REPLACE "${reference}" "${CPSC_DEPS_ROOT}${reference}"
+ contents "${contents}")
+ endif()
+ endforeach()
+ file(WRITE "${path}" "${contents}")
+ endif()
+ endforeach()
+endfunction()