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_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>
已在 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 内的文件... 任何指向外部文件的内容都会导致此函数验证失败。