BundleUtilities

用于帮助组装独立捆绑应用程序的函数。

CMake 实用工具函数集合,用于处理 Mac 上的 .app 捆绑包以及任何操作系统上的类似捆绑包的目录。

注意

请勿在配置时(从 CMakeLists.txt 中)使用这些函数。相反,从 install(CODE)install(SCRIPT) 中调用它们。

函数

此模块提供了以下函数

fixup_bundle
fixup_bundle(<app> <libs> <dirs> [IGNORE_ITEM <file>...])

就地修复 <app> 捆绑包,并使其成为独立的,以便可以将其拖放到另一台机器上并在该机器上运行,只要所有系统库都是兼容的。

如果将插件作为 libs 参数传递给 fixup_bundle,则应在调用 fixup_bundle 之前安装它们或将它们复制到捆绑包中。<libs> 参数是必须修复的库列表,但不能通过 otool 输出分析(即 plugins)确定。

收集捆绑包中所有可执行文件和库的所有键,然后,对于每个键,将每个先决条件复制到捆绑包中。然后根据其自身的先决条件列表修复每个文件。

然后清除所有键,并在最终捆绑包上调用 verify_app,以确保它真正是独立的。

3.6 版本新增: 作为可选参数 (IGNORE_ITEM) 可以传递文件名列表,这些文件名将被忽略(例如 IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe")。

copy_and_fixup_bundle
copy_and_fixup_bundle(<src> <dst> <libs> <dirs>)

在位置 <dst> 创建捆绑包 <src> 的副本,然后在 <dst> 就地修复新的复制的捆绑包。

verify_app
verify_app(<app> [IGNORE_ITEM <file>...])

根据对其运行的分析工具验证应用程序 <app> 看起来是否有效。如果应用程序未通过验证,则调用 message(FATAL_ERROR)

3.6 版本新增: 作为可选参数 (IGNORE_ITEM) 可以传递文件名列表,这些文件名将被忽略(例如 IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe"

get_bundle_main_executable
get_bundle_main_executable(<bundle> <result_var>)

结果将是捆绑包主可执行文件的完整路径名;如果无法确定,则结果为 error: 前缀的字符串。

get_dotapp_dir
get_dotapp_dir(<exe> <dotapp_dir_var>)

给定可执行文件的完整路径,返回名称以 .app 结尾的最近的父目录。如果没有这样的父目录,则仅返回包含可执行文件的目录。

返回的目录可能存在,也可能不存在。

get_bundle_and_executable
get_bundle_and_executable(<app> <bundle_var> <executable_var> <valid_var>)

接受 .app 目录名称或嵌套在 .app 目录中的可执行文件的名称,并在 <bundle_var> 中返回 .app 目录的路径,并在 <executable_var> 中返回其主可执行文件的路径。

get_bundle_all_executables
get_bundle_all_executables(<bundle> <exes_var>)

递归扫描 <bundle> 捆绑包中的所有 <exes_var> 可执行文件,并将它们累积到一个变量中。

get_item_key
get_item_key(<item> <key_var>)

给定 <item> 文件名,生成 <key_var> 键,该键应是唯一的,并考虑需要复制或修复以使捆绑包独立的库集。这本质上是文件名(包括扩展名),其中 . 替换为 _

此键用作 CMake 变量的前缀,以便我们可以基于给定项的键将其与一组变量关联。

get_item_rpaths
get_item_rpaths(<item> <rpaths_var>)

获取 <item> 文件名的 RPATHS,并将它们存储到具有提供的名称 <rpaths_var> 的变量中。

clear_bundle_keys
clear_bundle_keys(<keys_var>)

循环遍历 <keys_var> 键列表,清除与每个键关联的所有变量。循环结束后,清除键列表本身。

get_bundle_keys 的调用者在完成键列表后应调用 clear_bundle_keys

set_bundle_key_values
set_bundle_key_values(<keys_var> <context> <item> <exepath> <dirs>
                      <copyflag> [<rpaths>])

<keys_var> 键添加到给定项的列表(如果需要)。如果添加,还要设置与该键关联的所有变量。

get_bundle_keys
get_bundle_keys(<app> <libs> <dirs> <keys_var> [IGNORE_ITEM <file>...])

循环遍历 <app> 捆绑包中(以及作为额外的 <libs> 给出的)所有可执行文件和库文件,并累积表示它们的键列表。设置与每个键关联的值,以便我们可以循环遍历所有键,并将先决条件库复制到捆绑包中,然后执行适当的 install_name_tool 修复。

3.6 版本新增: 作为可选参数 (IGNORE_ITEM) 可以传递文件名列表,这些文件名将被忽略(例如 IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe"

copy_resolved_item_into_bundle
copy_resolved_item_into_bundle(<resolved_item> <resolved_embedded_item>)

如有必要,将已解析的项复制到捆绑包中。如果 <resolved_item><resolved_embedded_item> “相同”,则无需复制。

copy_resolved_framework_into_bundle
copy_resolved_framework_into_bundle(<resolved_item> <resolved_embedded_item>)

如有必要,将已解析的框架复制到捆绑包中。如果 <resolved_item><resolved_embedded_item> “相同”,则无需复制。

默认情况下,未设置 BU_COPY_FULL_FRAMEWORK_CONTENTS。如果希望在捆绑包中嵌入完整的框架,请在调用 fixup_bundle 之前将 BU_COPY_FULL_FRAMEWORK_CONTENTS 设置为 ON。默认情况下,COPY_RESOLVED_FRAMEWORK_INTO_BUNDLE 复制框架 dylib 本身以及框架 Resources 目录。

fixup_bundle_item
fixup_bundle_item(<resolved_embedded_item> <exepath> <dirs>)

获取 <resolved_embedded_item> 的直接/非系统先决条件。对于每个先决条件,将其引用方式更改为该先决条件的键控变量 _EMBEDDED_ITEM 的值。(最有可能更改为 @executable_path 样式引用。)

此函数要求 <resolved_embedded_item> 已经 捆绑包内部。换句话说,如果将插件作为 libs 参数传递给 fixup_bundle,则应在调用 fixup_bundle 之前安装它们或将它们复制到捆绑包中。 libs 参数是必须修复的库列表,但不能通过 otool 输出分析确定。(即,plugins

此外,将要修复的项的 ID 更改为其自身的 _EMBEDDED_ITEM 值。

将更改累积在局部变量中,并在函数末尾使用所有更改一次调用 install_name_tool

如果设置了 BU_CHMOD_BUNDLE_ITEMS 变量,则在 install_name_tool 尝试更改捆绑包项之前,会将它们标记为可写。

verify_bundle_prerequisites
verify_bundle_prerequisites(<bundle> <result_var> <info_var>
                            [IGNORE_ITEM <file>...])

验证捆绑包内所有文件的所有先决条件的总和是否包含在捆绑包中,或者是否为 system 库(假定在任何地方都存在)。

3.6 版本新增: 作为可选参数 (IGNORE_ITEM) 可以传递文件名列表,这些文件名将被忽略(例如 IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe"

verify_bundle_symlinks(<bundle> <result_var> <info_var>)

验证在 <bundle> 捆绑包中找到的任何符号链接是否指向也已在捆绑包中的其他文件... 任何指向外部文件的内容都会导致此函数验证失败。