forked from qt-creator/qt-creator
CMake Deployment: Fix deployment / rpath handing on Linux
Change-Id: Ic8eb8665e4ac43a49ecbf07f2a92873453c9faca Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -86,6 +86,8 @@ list(APPEND DEFAULT_DEFINES
|
|||||||
)
|
)
|
||||||
|
|
||||||
file(RELATIVE_PATH _PLUGIN_TO_LIB "/${IDE_PLUGIN_PATH}" "/${IDE_LIBRARY_PATH}")
|
file(RELATIVE_PATH _PLUGIN_TO_LIB "/${IDE_PLUGIN_PATH}" "/${IDE_LIBRARY_PATH}")
|
||||||
|
file(RELATIVE_PATH _PLUGIN_TO_QT "/${IDE_PLUGIN_PATH}" "/${IDE_LIBRARY_BASE_PATH}/Qt/lib")
|
||||||
|
file(RELATIVE_PATH _LIB_TO_QT "/${IDE_LIBRARY_PATH}" "/${IDE_LIBRARY_BASE_PATH}/Qt/lib")
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
set(_RPATH_BASE "@executable_path")
|
set(_RPATH_BASE "@executable_path")
|
||||||
@@ -97,8 +99,8 @@ elseif (WIN32)
|
|||||||
set(_PLUGIN_RPATH "")
|
set(_PLUGIN_RPATH "")
|
||||||
else()
|
else()
|
||||||
set(_RPATH_BASE "\$ORIGIN")
|
set(_RPATH_BASE "\$ORIGIN")
|
||||||
set(_LIB_RPATH "\$ORIGIN")
|
set(_LIB_RPATH "\$ORIGIN;\$ORIGIN/${_LIB_TO_QT}")
|
||||||
set(_PLUGIN_RPATH "\$ORIGIN;\$ORIGIN/${_PLUGIN_TO_LIB}")
|
set(_PLUGIN_RPATH "\$ORIGIN;\$ORIGIN/${_PLUGIN_TO_LIB};\$ORIGIN/${_PLUGIN_TO_QT}")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
set(__QTC_PLUGINS "" CACHE INTERNAL "*** Internal ***")
|
set(__QTC_PLUGINS "" CACHE INTERNAL "*** Internal ***")
|
||||||
@@ -907,8 +909,6 @@ function(add_qtc_executable name)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
file(RELATIVE_PATH _RELATIVE_LIB_PATH "/${_EXECUTABLE_PATH}" "/${IDE_LIBRARY_PATH}")
|
|
||||||
|
|
||||||
add_executable("${name}" ${_arg_SOURCES})
|
add_executable("${name}" ${_arg_SOURCES})
|
||||||
target_include_directories("${name}" PRIVATE "${CMAKE_BINARY_DIR}/src" ${_arg_INCLUDES})
|
target_include_directories("${name}" PRIVATE "${CMAKE_BINARY_DIR}/src" ${_arg_INCLUDES})
|
||||||
target_compile_definitions("${name}" PRIVATE ${default_defines_copy} ${TEST_DEFINES} ${_arg_DEFINES} )
|
target_compile_definitions("${name}" PRIVATE ${default_defines_copy} ${TEST_DEFINES} ${_arg_DEFINES} )
|
||||||
@@ -919,10 +919,20 @@ function(add_qtc_executable name)
|
|||||||
set(skip_translation ON)
|
set(skip_translation ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
file(RELATIVE_PATH relative_lib_path "/${_EXECUTABLE_PATH}" "/${IDE_LIBRARY_PATH}")
|
||||||
|
|
||||||
|
set(build_rpath "${_RPATH_BASE}/${relative_lib_path}")
|
||||||
|
set(install_rpath "${_RPATH_BASE}/${relative_lib_path}")
|
||||||
|
if (NOT WIN32 AND NOT APPLE)
|
||||||
|
file(RELATIVE_PATH relative_qt_path "/${_EXECUTABLE_PATH}" "/${IDE_LIBRARY_BASE_PATH}/Qt/lib")
|
||||||
|
file(RELATIVE_PATH relative_plugins_path "/${_EXECUTABLE_PATH}" "/${IDE_PLUGIN_PATH}")
|
||||||
|
set(install_rpath "${install_rpath};${_RPATH_BASE}/${relative_qt_path};${_RPATH_BASE}/${relative_plugins_path}")
|
||||||
|
endif()
|
||||||
|
|
||||||
qtc_output_binary_dir(_output_binary_dir)
|
qtc_output_binary_dir(_output_binary_dir)
|
||||||
set_target_properties("${name}" PROPERTIES
|
set_target_properties("${name}" PROPERTIES
|
||||||
BUILD_RPATH "${_RPATH_BASE}/${_RELATIVE_LIB_PATH}"
|
BUILD_RPATH "${build_rpath}"
|
||||||
INSTALL_RPATH "${_RPATH_BASE}/${_RELATIVE_LIB_PATH}"
|
INSTALL_RPATH "${install_rpath}"
|
||||||
RUNTIME_OUTPUT_DIRECTORY "${_output_binary_dir}/${_DESTINATION}"
|
RUNTIME_OUTPUT_DIRECTORY "${_output_binary_dir}/${_DESTINATION}"
|
||||||
QT_SKIP_TRANSLATION "${skip_translation}"
|
QT_SKIP_TRANSLATION "${skip_translation}"
|
||||||
CXX_VISIBILITY_PRESET hidden
|
CXX_VISIBILITY_PRESET hidden
|
||||||
|
@@ -89,10 +89,9 @@ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.16)
|
|||||||
set(CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL objdump)
|
set(CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL objdump)
|
||||||
endif()
|
endif()
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(pre_exclude_regexes PRE_EXCLUDE_REGEXES \"api-ms-.*|ext-ms-\.*\")
|
set(filter_regex PRE_EXCLUDE_REGEXES \"api-ms-.*|ext-ms-\.*\")
|
||||||
endif()
|
elseif (APPLE)
|
||||||
if (APPLE)
|
set(filter_regex PRE_EXCLUDE_REGEXES \"libiodbc\.*|libpq\.*\")
|
||||||
set(pre_exclude_regexes PRE_EXCLUDE_REGEXES \"libiodbc\.*|libpq\.*\")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
get_filename_component(install_prefix \"\${CMAKE_INSTALL_PREFIX}\" ABSOLUTE)
|
get_filename_component(install_prefix \"\${CMAKE_INSTALL_PREFIX}\" ABSOLUTE)
|
||||||
@@ -133,14 +132,17 @@ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.16)
|
|||||||
|
|
||||||
file(GET_RUNTIME_DEPENDENCIES
|
file(GET_RUNTIME_DEPENDENCIES
|
||||||
UNRESOLVED_DEPENDENCIES_VAR unresolved_deps
|
UNRESOLVED_DEPENDENCIES_VAR unresolved_deps
|
||||||
|
RESOLVED_DEPENDENCIES_VAR resolved_deps
|
||||||
|
CONFLICTING_DEPENDENCIES_PREFIX conflicts
|
||||||
\${EXECUTABLES_TO_ANALYZE}
|
\${EXECUTABLES_TO_ANALYZE}
|
||||||
\${LIBRARIES_TO_ANALYZE}
|
\${LIBRARIES_TO_ANALYZE}
|
||||||
\${MODULES_TO_ANALYZE}
|
\${MODULES_TO_ANALYZE}
|
||||||
DIRECTORIES
|
DIRECTORIES
|
||||||
|
\"\${install_prefix}/${IDE_BIN_PATH}\"
|
||||||
\"\${install_prefix}/${IDE_PLUGIN_PATH}\"
|
\"\${install_prefix}/${IDE_PLUGIN_PATH}\"
|
||||||
\"\${install_prefix}/${IDE_LIBEXEC_PATH}\"
|
|
||||||
\"\${install_prefix}/${IDE_LIBRARY_PATH}\"
|
\"\${install_prefix}/${IDE_LIBRARY_PATH}\"
|
||||||
\${pre_exclude_regexes}
|
\"\${install_prefix}/${IDE_LIBRARY_BASE_PATH}/Qt/lib\"
|
||||||
|
\${filter_regex}
|
||||||
)
|
)
|
||||||
|
|
||||||
# Clear for second step
|
# Clear for second step
|
||||||
@@ -149,6 +151,7 @@ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.16)
|
|||||||
set(installed_MODULES \"\${qt5_plugin_files}\")
|
set(installed_MODULES \"\${qt5_plugin_files}\")
|
||||||
|
|
||||||
list(REMOVE_DUPLICATES unresolved_deps)
|
list(REMOVE_DUPLICATES unresolved_deps)
|
||||||
|
list(REMOVE_DUPLICATES resolved_deps)
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
# Needed by QmlDesigner, QmlProfiler, but they are not referenced directly.
|
# Needed by QmlDesigner, QmlProfiler, but they are not referenced directly.
|
||||||
@@ -158,40 +161,61 @@ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.16)
|
|||||||
file(TO_CMAKE_PATH \"${CMAKE_PREFIX_PATH}\" prefix_path)
|
file(TO_CMAKE_PATH \"${CMAKE_PREFIX_PATH}\" prefix_path)
|
||||||
|
|
||||||
# Add parent link directory paths. Needed for e.g. MinGW choco libstdc++-6.dll
|
# Add parent link directory paths. Needed for e.g. MinGW choco libstdc++-6.dll
|
||||||
foreach(path \"${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES}\")
|
if (WIN32)
|
||||||
get_filename_component(parent_path \"\${path}\" DIRECTORY)
|
foreach(path \"${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES}\")
|
||||||
list(APPEND prefix_path \"\${parent_path}\")
|
get_filename_component(parent_path \"\${path}\" DIRECTORY)
|
||||||
endforeach()
|
list(APPEND prefix_path \"\${parent_path}\")
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
foreach(so IN LISTS unresolved_deps)
|
# On Linux the Qt libraries might exist in the system, and they are passed
|
||||||
string(REPLACE \"@rpath/\" \"\" so \"\${so}\")
|
# as resolved, therefore scan the resolved dependencies too
|
||||||
get_filename_component(so_dir \"\${so}\" DIRECTORY)
|
foreach(so IN LISTS unresolved_deps resolved_deps)
|
||||||
message(STATUS \"Unresolved dependency: \${so}\")
|
|
||||||
|
# Skip the installed dependencies
|
||||||
|
string(FIND \"\${so}\" \"\${install_prefix}\" found_prefix_path)
|
||||||
|
if (NOT found_prefix_path EQUAL -1)
|
||||||
|
continue()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# On Linux get the name of the resolved Qt dependency, this would come from ldconfig
|
||||||
|
# with the full path on the system
|
||||||
|
if (NOT APPLE AND NOT WIN32)
|
||||||
|
get_filename_component(so \"\${so}\" NAME)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (APPLE)
|
||||||
|
string(REPLACE \"@rpath/\" \"\" so \"\${so}\")
|
||||||
|
get_filename_component(so_dir \"\${so}\" DIRECTORY)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS \"Dependency: \${so}\")
|
||||||
foreach(p IN LISTS prefix_path)
|
foreach(p IN LISTS prefix_path)
|
||||||
message(STATUS \"Trying: \${p}/\${so}\")
|
if (WIN32)
|
||||||
if (EXISTS \"\${p}/\${so}\")
|
set(so_src \"\${p}/bin/\${so}\")
|
||||||
file(INSTALL \"\${p}/\${so}\"
|
set(so_dest \"\${install_prefix}/${IDE_BIN_PATH}\")
|
||||||
DESTINATION \"\${install_prefix}/${IDE_APP_PATH}/\${so_dir}\"
|
elseif(APPLE)
|
||||||
FOLLOW_SYMLINK_CHAIN)
|
set(so_src \"\${p}/lib/\${so}\")
|
||||||
list(APPEND installed_LIBRARIES \"\${install_prefix}/${IDE_APP_PATH}/\${so}\")
|
set(so_dest \"\${install_prefix}/${IDE_LIBRARY_PATH}/\${so_dir}\")
|
||||||
break()
|
else()
|
||||||
endif()
|
set(so_src \"\${p}/lib/\${so}\")
|
||||||
message(STATUS \"Trying: \${p}/bin/\${so}\")
|
if (p STREQUAL \"${qt5_base_dir}\")
|
||||||
if (EXISTS \"\${p}/bin/\${so}\")
|
set(so_dest \"\${install_prefix}/${IDE_LIBRARY_BASE_PATH}/Qt/lib\")
|
||||||
file(INSTALL \"\${p}/bin/\${so}\"
|
else()
|
||||||
DESTINATION \"\${install_prefix}/${IDE_BIN_PATH}/\${so_dir}\"
|
set(so_dest \"\${install_prefix}/${IDE_LIBRARY_PATH}\")
|
||||||
FOLLOW_SYMLINK_CHAIN)
|
endif()
|
||||||
list(APPEND installed_LIBRARIES \"\${install_prefix}/${IDE_BIN_PATH}/\${so}\")
|
endif()
|
||||||
break()
|
|
||||||
endif()
|
message(STATUS \"Looking at: \${so_src}\")
|
||||||
message(STATUS \"Trying: \${p}/lib/\${so}\")
|
if (EXISTS \"\${so_src}\")
|
||||||
if (EXISTS \"\${p}/lib/\${so}\")
|
file(INSTALL \"\${so_src}\" DESTINATION \"\${so_dest}\" FOLLOW_SYMLINK_CHAIN)
|
||||||
file(INSTALL \"\${p}/lib/\${so}\"
|
if (APPLE)
|
||||||
DESTINATION \"\${install_prefix}/${IDE_LIBRARY_PATH}/\${so_dir}\"
|
get_filename_component(so \"\${so}\" NAME)
|
||||||
FOLLOW_SYMLINK_CHAIN)
|
endif()
|
||||||
list(APPEND installed_LIBRARIES \"\${install_prefix}/${IDE_LIBRARY_PATH}/\${so}\")
|
list(APPEND installed_LIBRARIES \"\${so_dest}/\${so}\")
|
||||||
break()
|
break()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
endforeach()
|
endforeach()
|
||||||
endforeach()
|
endforeach()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
Reference in New Issue
Block a user