捆绑实用程序

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

一组 CMake 实用函数,可用于处理 Mac 上的“.app”包和任何操作系统上的类包目录。

该模块提供以下功能:

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 或更高版本,因为它使用函数、中断和 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>”是否有效。如果应用程序未通过验证,则调用:command:message(FATAL_ERROR)

在 3.6 版本加入: 作为可选参数(IGNORE_ITEM)可以传递文件名列表,然后忽略它们(例如``IGNORE_ITEM“vcredist_x86.exe;vcredist_x64.exe”``

get_bundle_main_executable(<bundle> <result_var>)

结果将是 bundle 的主要可执行文件的完整路径名,或者如果无法确定则为 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”未设置。如果你想在你的包中嵌入完整的框架,请在调用 fixup_bundle 之前将“BU_COPY_FULL_FRAMEWORK_CONTENTS”设置为“ON”。默认情况下,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>`` 已经``inside`` 包。换句话说,如果您将插件作为 libs 参数传递给 fixup_bundle,您应该在调用 fixup_bundle 之前安装它们或将它们复制到包中。 libs 参数是必须修复的库列表,但无法通过 otool 输出分析确定。 (即``插件``)

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

累积局部变量中的更改,并在函数末尾*一次*调用 install_name_tool,同时包含所有更改。

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

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

验证捆绑包中所有文件的所有先决条件的总和是否包含在捆绑包中,或者是假定存在于任何地方的“系统”库。

在 3.6 版本加入: 作为可选参数(IGNORE_ITEM)可以传递文件名列表,然后忽略它们(例如``IGNORE_ITEM“vcredist_x86.exe;vcredist_x64.exe”``

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

验证在 <bundle> 包中找到的任何符号链接是否指向其他已经在包中的文件...任何指向外部文件的内容都会导致此函数无法通过验证。