CMake: Clean up qt_deploy_runtime_dependencies for 6.3

Ensure both versioned and versionless functions
are available.

Use the versioned function in the implementation of
qt6_generate_deploy_app_script.

Move the low-level warning to the top of the documentation page,
after the TP message.

Clarify documentation of the EXECUTABLE and
ADDITIONAL_ options, that they take relative paths and can use
generator expressions, but can't reference raw target names.

Adjust documentation snippet to cover mac / windows cases.
This mostly coincides with the internal implementation of
qt_generate_deploy_app_script.
Also adjust it to show case more options, like installation of a
helper app and its dependencies.

Output the working directory when executing the deploy tool.

Remove the MACOS_BUNDLE option, it serves no good purpose at the
moment, we already detect bundles by checking if the dir name has
an '.app' suffix.

Pick-to: 6.3
Fixes: QTBUG-100923
Change-Id: If7e5d65ce920eb69fd45f004aa4c5bad800c7ba9
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Alexandru Croitor 2022-02-17 16:14:09 +01:00
parent 6ee4f4233d
commit 0ada264dda
4 changed files with 66 additions and 22 deletions

View File

@ -104,14 +104,13 @@ endif()
# This function is currently in Technical Preview.
# Its signature and behavior might change.
function(qt_deploy_runtime_dependencies)
function(qt6_deploy_runtime_dependencies)
if(NOT __QT_DEPLOY_TOOL)
message(FATAL_ERROR "No Qt deploy tool available for this target platform")
endif()
set(no_value_options
MACOS_BUNDLE
GENERATE_QT_CONF
VERBOSE
NO_OVERWRITE
@ -162,7 +161,7 @@ function(qt_deploy_runtime_dependencies)
# macdeployqt always writes out a qt.conf file. It will complain if one
# already exists, so leave it to create it for us if we will be running it.
if(MACOS_BUNDLE AND __QT_DEPLOY_SYSTEM_NAME STREQUAL Darwin)
if(__QT_DEPLOY_SYSTEM_NAME STREQUAL Darwin)
# We might get EXECUTABLE pointing to either the actual binary under the
# Contents/MacOS directory, or it might be pointing to the top of the
# app bundle (i.e. the <appname>.app directory). We want the latter to
@ -239,7 +238,8 @@ function(qt_deploy_runtime_dependencies)
list(APPEND tool_options "${extra_binaries_option}${extra_binary}")
endforeach()
message(STATUS "Running Qt deploy tool for ${arg_EXECUTABLE}")
message(STATUS
"Running Qt deploy tool for ${arg_EXECUTABLE} in working directory '${QT_DEPLOY_PREFIX}'")
execute_process(
COMMAND_ECHO STDOUT
COMMAND "${__QT_DEPLOY_TOOL}" "${arg_EXECUTABLE}" ${tool_options}
@ -252,6 +252,16 @@ function(qt_deploy_runtime_dependencies)
endfunction()
if(NOT __QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
function(qt_deploy_runtime_dependencies)
if(__QT_DEFAULT_MAJOR_VERSION EQUAL 6)
qt6_deploy_runtime_dependencies(${ARGV})
else()
message(FATAL_ERROR "qt_deploy_runtime_dependencies() is only available in Qt 6.")
endif()
endfunction()
endif()
function(_qt_internal_show_skip_runtime_deploy_message qt_build_type_string)
message(STATUS
"Skipping runtime deployment steps. "

View File

@ -2700,16 +2700,15 @@ function(qt6_generate_deploy_app_script)
endif()
file(GENERATE OUTPUT "${file_name}" CONTENT "
include(${QT_DEPLOY_SUPPORT})
qt_deploy_runtime_dependencies(
qt6_deploy_runtime_dependencies(
EXECUTABLE $<TARGET_FILE_NAME:${arg_TARGET}>.app
MACOS_BUNDLE
)
")
elseif(WIN32 AND QT6_IS_SHARED_LIBS_BUILD)
file(GENERATE OUTPUT "${file_name}" CONTENT "
include(${QT_DEPLOY_SUPPORT})
qt_deploy_runtime_dependencies(
qt6_deploy_runtime_dependencies(
EXECUTABLE \${QT_DEPLOY_BIN_DIR}/$<TARGET_FILE_NAME:${arg_TARGET}>
GENERATE_QT_CONF
)")

View File

@ -42,13 +42,15 @@ project during the configure stage.
\cmakecommandsince 6.3
\preliminarycmakecommand
\note This command does not usually need to be called directly. It is used
internally by other higher level commands, but projects wishing to
implement more customized deployment logic may find it useful.
\section1 Synopsis
\badcode
qt_deploy_runtime_dependencies(
EXECUTABLE executable
[MACOS_BUNDLE]
[ADDITIONAL_EXECUTABLES files...]
[ADDITIONAL_LIBRARIES files...]
[ADDITIONAL_MODULES files...]
@ -65,10 +67,6 @@ qt_deploy_runtime_dependencies(
\section1 Description
\note This command does not usually need to be called directly. It is used
internally by other higher level commands, but projects wishing to
implement more customized deployment logic may find it useful.
When installing an application, it may be desirable to also install the
libraries and plugins it depends on. When the application is a macOS app bundle
or a Windows executable, \c{qt_deploy_runtime_dependencies()} can be called
@ -82,22 +80,35 @@ see \l{qt_deploy_qml_imports()} for that.
\section1 Arguments
The \c{EXECUTABLE} option must be provided. The \c{executable} argument should
be the path relative to the base install location. For macOS app bundles, the
\c{MACOS_BUNDLE} option should be given and the \c{executable} argument should
be the path to the executable in the \c{<bundle-name>.app/Contents/MacOS}
directory.
The \c{EXECUTABLE} option must be provided.
The \c{executable} argument should be a path to the executable file, relative to
the base install location. For example, \c{bin/MyApp.exe}, or more dynamically
\c{\${QT_DEPLOY_BIN_DIR}/$<TARGET_FILE_NAME:MyApp>}.
Specifying raw target names not wrapped in a generator epxression like
\c{<TARGET_FILE_NAME:>} is not supported.
For macOS app bundles, the \c{executable} argument should be a path to the
bundle directory, relative to the base install location.
For example \c{MyApp.app}, or more dynamically
\c{$<TARGET_FILE_NAME:MyApp>.app}.
Specifying raw target names not wrapped in a generator epxression like
\c{<TARGET_FILE_NAME:>} is not supported.
It may also be desirable to install dependencies for other binaries related to
the \c{executable}. For example, plugins provided by the project might have
further dependencies, but because those plugins won't be linked directly to the
executable, \c{qt_deploy_runtime_dependencies()} won't automatically discover
them. The \c{ADDITIONAL_EXECUTABLES}, \c{ADDITIONAL_LIBRARIES}, and
\c{ADDITIONAL_MODULES} arguments can be used to specify additional binaries
\c{ADDITIONAL_MODULES} options can be used to specify additional binaries
whose dependencies should also be deployed (installing the named binaries
themselves is still the project's responsibility). The naming of these keywords
follows CMake's conventions, so Qt plugins would be specified using
\c{ADDITIONAL_MODULES}.
Each value should be a path relative to the base install location. The values
can use generator expressions, same as with the \c{EXECUTABLE} option.
Specifying raw target names not wrapped in a generator epxression like
\c{<TARGET_FILE_NAME:>} is not supported.
When installing a Windows application, it is common to need a
\l{Using qt.conf}{qt.conf} file when following CMake's default install

View File

@ -7,16 +7,40 @@ qt_standard_project_setup()
qt_add_executable(MyApp main.cpp)
set_target_properties(MyApp PROPERTIES
WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE
)
# App bundles on macOS have an .app suffix
if(APPLE)
set(executable_path "$<TARGET_FILE_NAME:MyApp>.app")
else()
set(executable_path "\${QT_DEPLOY_BIN_DIR}/$<TARGET_FILE_NAME:MyApp>")
endif()
# Helper app, not necessarily built as part of this project.
qt_add_executable(HelperApp helper.cpp)
set(helper_app_path "\${QT_DEPLOY_BIN_DIR}/$<TARGET_FILE_NAME:HelperApp>")
# The following script must only be executed at install time
set(deploy_script "${CMAKE_CURRENT_BINARY_DIR}/deploy_MyApp.cmake")
file(GENERATE OUTPUT ${deploy_script} CONTENT "
include(\"${QT_DEPLOY_SUPPORT}\")
qt_deploy_runtime_dependencies(
EXECUTABLE \"\${QT_DEPLOY_BIN_DIR}/$<TARGET_FILE_NAME:MyApp>\"
)
")
EXECUTABLE \"${executable_path}\"
ADDITIONAL_EXECUTABLES \"${helper_app_path}\"
GENERATE_QT_CONF
VERBOSE
)")
install(TARGETS MyApp) # Install the target
# Omitting RUNTIME DESTINATION will install a non-bundle target to CMAKE_INSTALL_BINDIR,
# which coincides with the default value of QT_DEPLOY_BIN_DIR used above, './bin'.
# Installing macOS bundles always requires an explicit BUNDLE DESTINATION option.
install(TARGETS MyApp HelperApp # Install to CMAKE_INSTALL_PREFIX/bin/MyApp.exe
# and ./binHelperApp.exe
BUNDLE DESTINATION . # Install to CMAKE_INSTALL_PREFIX/MyApp.app/Contents/MacOS/MyApp
)
install(SCRIPT ${deploy_script}) # Add its runtime dependencies
\endcode