BundleUtilities

帮助组装独立捆绑应用程序的功能。

一系列可用于处理 Mac 上的 .app 捆绑和任意操作系统上的类似捆绑目录的 CMake 实用程序。

此模块提供以下功能

fixup_bundle
copy_and_fixup_bundle
verify_app
get_bundle_main_executable
get_dotapp_dir
get_bundle_and_executable
get_bundle_all_executables
get_item_key
get_item_rpaths
clear_bundle_keys
set_bundle_key_values
get_bundle_keys
copy_resolved_item_into_bundle
copy_resolved_framework_into_bundle
fixup_bundle_item
verify_bundle_prerequisites
verify_bundle_symlinks

需要 CMake 2.6 或更高版本,因为它使用了 function、break 和 PARENT_SCOPE。还与 GetPrerequisites.cmake 相关。

在配置期间(从 CMakeLists.txt)不要使用这些功能!从 install(CODE)install(SCRIPT) 规则调用它们。

fixup_bundle(<app> <libs> <dirs>)

就地修复 <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(<src> <dst> <libs> <dirs>)

在位置 <dst> 对捆绑 <src> 进行复制,然后在位置 <dst> 就地修复新复制的捆绑。

verify_app(<app>)

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

3.6 版本中已添加: 作为可选参数(IGNORE_ITEM),可以传递文件名的列表,然后忽略它们(例如,IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe")。

get_bundle_main_executable(<bundle> <result_var>)

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

get_dotapp_dir(<exe> <dotapp_dir_var>)

返回给定可执行文件的完整路径,且名称以 .app 结尾的最近父文件夹。如果没有此类父文件夹,则只需返回包含可执行文件的文件夹。

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

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

获取一个 .app 目录名称或嵌套在 .app 目录中的可执行文件名称,并返回在 <bundle_var> 中的 .app 目录的路径以及在 <executable_var> 中的其主可执行文件的路径。

get_bundle_all_executables(<bundle> <exes_var>)

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

get_item_key(<item> <key_var>)

给定 <item> 文件名,生成 <key_var> 密钥,在考虑需要复制的库或修正的库集(使捆绑包变得独立)的情况下,该密钥应该是唯一的。这实际上就是文件名,包括扩展名,而 . 被替换为 _

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

clear_bundle_keys(<keys_var>)

对密钥列表 <keys_var> 进行循环,清除与每个密钥关联的所有变量。循环结束后,清除密钥列表本身。

当呼叫方 get_bundle_keys 用完密钥列表时,应呼叫 clear_bundle_keys

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

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

get_bundle_keys(<app> <libs> <dirs> <keys_var>)

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

3.6 版本中已添加: 作为可选参数(IGNORE_ITEM),可以传递文件名的列表,然后忽略它们(例如,IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe")。

copy_resolved_item_into_bundle(<resolved_item> <resolved_embedded_item>)

如果需要,复制已解析的项到捆绑包。如果 <resolved_item> “与” <resolved_embedded_item> “相同”,则不需要复制。

copy_resolved_framework_into_bundle(<resolved_item> <resolved_embedded_item>)

如果需要,复制已解析的框架到捆绑包。如果 <resolved_item> “与” <resolved_embedded_item> “相同”,则不需要复制。

默认为空,BU_COPY_FULL_FRAMEWORK_CONTENTS。如果希望在 bundle 中嵌入完整的框架,请在调用 fixup_bundle 前设置 BU_COPY_FULL_FRAMEWORK_CONTENTSON。默认为 COPY_RESOLVED_FRAMEWORK_INTO_BUNDLE 复制框架 dylib 本身和框架 Resources 目录。

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

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

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

此外,将要修复的项目的 id 更改为其自己的 _EMBEDDED_ITEM 值。

将更改累积到本地变量中,并在函数结尾处使用所有更改,调用 install_name_tool 一次。

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

verify_bundle_prerequisites(<bundle> <result_var> <info_var>)

验证 bundle 内所有文件的全部先决条件是否包含在 bundle 内,或者是否是 system 库,推测它们存在于任何地方。

3.6 版本中已添加: 作为可选参数(IGNORE_ITEM),可以传递文件名的列表,然后忽略它们(例如,IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe")。

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

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