qt_generate_deploy_qml_app_script

为QML应用生成部署脚本。

该命令定义在Qt6包中的Qml组件中,可以通过以下方式加载:

find_package(Qt6 REQUIRED COMPONENTS Qml)

此命令是在Qt 6.3中引入的。

警告: 如果您正在使用低于3.19版本的CMake,请确保将MANUAL_FINALIZATION选项传递给qt6_add_executable(),然后在此函数调用之前调用qt6_finalize_target()

概要

qt_generate_deploy_qml_app_script(
    TARGET <target>
    OUTPUT_SCRIPT <var>
    [NO_UNSUPPORTED_PLATFORM_ERROR]
    [NO_TRANSLATIONS]
    [NO_COMPILER_RUNTIME]
    [DEPLOY_TOOL_OPTIONS ...]
    [DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM]
    [MACOS_BUNDLE_POST_BUILD]
    [PRE_INCLUDE_REGEXES regexes...]
    [PRE_EXCLUDE_REGEXES regexes...]
    [POST_INCLUDE_REGEXES regexes...]
    [POST_EXCLUDE_REGEXES regexes...]
    [POST_INCLUDE_FILES files...]
    [POST_EXCLUDE_FILES files...]
)

如果无版本命令被禁用,请使用qt6_generate_deploy_qml_app_script()代替。它支持与该命令相同的参数集。

描述

安装一个既是一个QML模块又是一个可执行目标的目标需要安装目标本身之外的很多东西。Qt库和项目中的其他库、Qt插件和应用程序使用的所有QML模块的运行时部分可能也需要安装。在macOS应用程序包与其他平台相比,安装布局也将不同。《qt_generate_deploy_qml_app_script()》是一个方便的命令,旨在简化此过程,类似于qt_generate_deploy_app_script()对非QML应用程序所做的。

此命令假定应用程序非常接近于遵循Qt推荐的安装目录结构。该结构基于CMake的默认安装布局,由GNUInstallDirs确定(除了macOS应用程序包,它们遵循Apple的要求)。QML模块安装到平台相应的位置。对于macOS应用程序包,每个QML模块的qmldir文件被安装在与Resources/qml相应的子目录下,并且如果有插件,该模块的插件也被安装到PlugIns。应用程序包假定是直接安装到基本安装位置(见以下示例)。对于所有其他平台,qmldir和模块的插件都安装在与qml相应的子目录下,该目录本身相对于基本安装位置。

qt_generate_deploy_qml_app_script()生成一个脚本,其名称由OUTPUT_SCRIPT选项命名的变量存储。该脚本仅在CMake生成时写入。它是为了与install(SCRIPT)命令一起使用,该命令应该在应用程序的目标被使用install(TARGETS)安装后使用。

部署脚本将以适用于标准安装布局的适当选项调用 qt_deploy_qml_imports()。对于 macOS 应用程序捆绑包和 Windows 目标,它还会随后调用 qtDeployRuntimeDependencies(),同样适用于标准安装布局。

对于不支持 qtDeployRuntimeDependencies 的平台调用 qt_generate_deploy_qml_app_script() 将会导致致命错误,除非提供了 NO_UNSUPPORTED_PLATFORM_ERROR 选项。当提供了此选项并且项目为不支持的平台构建时,既不会安装 QML 模块也不会安装常规的运行时依赖项。要确保仍然安装 QML 模块,请指定 NO_UNSUPPORTED_PLATFORM_ERRORDEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM 选项。后者选项将确保作为项目一部分构建的 QML 模块仍然被安装。

MACOS_BUNDLE_POST_BUILD 选项在 target 是 macOS 应用程序捆绑包时启用了一个额外的步骤。将创建一个后构建规则,该规则使用部署脚本部署足够的导入的 QML 模块,以允许应用程序直接从构建目录运行(基本上只是 qmldir 文件和插件链接符号)。这对于支持应用程序的开发通常是期望的。MACOS_BUNDLE_POST_BUILD 在所有其他平台上都会被忽略。

在 macOS 以外的平台上,Qt 翻译会被自动部署。要抑制此行为,指定 NO_TRANSLATIONS。使用 qt_deploy_translations() 以自定义方式部署翻译。

对于 Windows 桌面应用程序,默认情况下也会安装编译器所需的运行时文件。要防止此情况,请指定 NO_COMPILER_RUNTIME

从 Qt 6.7 开始,您可以使用 DEPLOY_TOOL_OPTIONS 将额外的选项传递给底层部署工具。这仅适用于底层部署工具是 macdeployqt 或 windeployqt 的情况。

可以指定 PRE_INCLUDE_REGEXESPRE_EXCLUDE_REGEXESPOST_INCLUDE_REGEXESPOST_EXCLUDE_REGEXESPOST_INCLUDE_FILESPOST_EXCLUDE_FILES 选项来控制运行时依赖的部署。这些选项不适用于所有平台,并且会原样转发到 qt_deploy_runtime_dependencies()

对于部署非 QML 应用程序,请使用 qt_generate_deploy_app_script()。对同一目标同时调用 qt_generate_deploy_qml_app_script()qt_generate_deploy_app_script() 是错误的。

示例

以下示例显示了如何部署 QtQuick 应用程序。

cmake_minimum_required(VERSION 3.16...3.22)
project(MyThings)

find_package(Qt6 6.3 REQUIRED COMPONENTS Core Qml)
qt_standard_project_setup()

qt_add_executable(MyApp main.cpp)
qt_add_qml_module(MyApp
    URI Application
    VERSION 1.0
    QML_FILES main.qml MyThing.qml
)

install(TARGETS MyApp
    BUNDLE  DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

qt_generate_deploy_qml_app_script(
    TARGET MyApp
    OUTPUT_SCRIPT deploy_script
    MACOS_BUNDLE_POST_BUILD
    NO_UNSUPPORTED_PLATFORM_ERROR
    DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM
)
install(SCRIPT ${deploy_script})

以下示例显示了如何向底层部署工具传递额外的选项。

set(deploy_tool_options_arg "")
if(APPLE)
    set(deploy_tool_options_arg --hardened-runtime)
elseif(WIN32)
    set(deploy_tool_options_arg --no-compiler-runtime)
endif()

qt_generate_deploy_qml_app_script(
    ...
    DEPLOY_TOOL_OPTIONS ${deploy_tool_options_arg}
)
install(SCRIPT ${deploy_script})

另请参阅qt_standard_project_setup()qt_generate_deploy_app_script()

© 2024 Qt 公司有限。本文件中包含的文档贡献的版权归其各自的所有者。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款进行许可的。Qt 及其各自标志是芬兰以及全球的 The Qt Company Ltd. 的商标。所有其他商标均为其各自所有者的财产。