GetPrerequisites

已弃用,自版本 3.16 起: 请改用 file(GET_RUNTIME_DEPENDENCIES)

此模块提供用于分析和列出可执行文件或共享库文件依赖项(先决条件)的命令。这些命令列出可执行文件或共享库所需的共享库(.dll.dylib.so 文件)。

使用 CMake 加载此模块

include(GetPrerequisites)

此模块使用以下特定于平台的工具确定依赖项:

  • dumpbin(Windows)

  • objdump(Windows 上的 MinGW)

  • ldd(Linux/Unix)

  • otool(Apple 操作系统)

自版本 3.16 起已更改: 如果设置了 CMAKE_OBJDUMP 变量,则将使用该变量指定的工具。

命令

本模块提供以下命令

get_prerequisites

获取指定目标所需的共享库文件列表

get_prerequisites(<target> <prerequisites-var> <exclude-system> <recurse>
                  <exepath> <dirs> [<rpaths>])

传递给此命令的 <prerequisites-var> 变量中的列表在首次调用时应为空。退出时,<prerequisites-var> 将包含所需的共享库文件列表。

参数为

<target>

可执行文件或共享库文件的完整路径。

<prerequisites-var>

用于包含结果的 CMake 变量的名称。

<exclude-system>

如果设置为 1,则排除系统先决条件;如果设置为 0,则包含它们。

<recurse>

如果设置为 1,则递归查找所有先决条件;如果设置为 0,则仅列出直接先决条件。

<exepath>

在 Apple 操作系统上用于 @executable_path 替换的顶级可执行文件的路径。

<dirs>

可能找到库的路径列表:当给定不带任何路径信息的 target 时,首先搜索这些路径。然后也搜索标准的系统位置:PATH、Framework 位置、/usr/lib... 等。

<rpaths>

可执行文件或库的可选运行时搜索路径,用于帮助查找文件。

已添加于版本 3.14: 在调用此命令之前,可以将变量 GET_PREREQUISITES_VERBOSE 设置为 true 以启用详细输出。

list_prerequisites

打印一条消息,列出指定目标的先决条件

list_prerequisites(<target> [<recurse> [<exclude-system> [<verbose>]]])

参数为

<target>

共享库或可执行目标名称,或共享库或可执行文件的完整路径。

<recurse>

如果设置为 1,则递归查找所有先决条件;如果设置为 0,则仅列出直接先决条件。

<exclude-system>

如果设置为 1,则排除系统先决条件;如果设置为 0,则包含它们。

<verbose>

如果设置为 0,则仅打印先决文件的完整路径名。如果设置为 1,则显示额外信息。

list_prerequisites_by_glob

打印匹配 globbing 模式的共享库和可执行文件的先决条件

list_prerequisites_by_glob(<GLOB|GLOB_RECURSE>
                           <glob-exp>
                           [<optional-args>...])

参数为

GLOBGLOB_RECURSE

globbing 模式,是仅遍历匹配项还是递归遍历其子目录。

<glob-exp>

file(GLOB)file(GLOB_RECURSE) 一起使用的 globbing 表达式,用于检索匹配文件列表。如果匹配的文件是可执行文件,则会列出其先决条件。

<optional-args>...

提供的任何额外(可选)参数将作为可选参数传递给 list_prerequisite() 调用。

gp_append_unique

仅当值不在列表中时,才将其添加到列表中

gp_append_unique(<list-var> <value>)

参数为

<value>

要添加到列表中的值。

<list-var>

列表变量名,如果值尚不在列表中,则将该值添加到其中。

is_file_executable

检查给定文件是否为二进制可执行文件

is_file_executable(<file> <result-var>)

如果 <file> 是二进制可执行文件,此命令会将 <result-var> 设置为 1;否则将其设置为 0。

gp_item_default_embedded_path

确定指定项的引用路径

gp_item_default_embedded_path(<item> <default-embedded-path-var>)

此命令确定 <item> 嵌入包内时的引用路径,并将其存储到变量 <default-embedded-path-var> 中。

项目可以通过定义自定义 gp_item_default_embedded_path_override() 命令来覆盖此命令。

gp_resolve_item

将给定项解析为现有完整路径文件,并将其存储到变量中

gp_resolve_item(<context> <item> <exepath> <dirs> <resolved-item-var>
                [<rpaths>])

参数为

<context>

顶级加载路径,用于在 Apple 操作系统上进行 @loader_path 替换。解析项时,@loader_path 引用将相对于给定上下文值(可能是另一个库)的目录进行解析。

<item>

要解析的项。

<exepath>

请参阅 get_prerequisites() 中的参数说明。

<dirs>

请参阅 get_prerequisites() 中的参数说明。

<resolved-item-var>

将解析后的项存储到的结果变量。

<rpaths>

请参阅 get_prerequisites() 中的参数说明。

项目可以通过定义自定义 gp_resolve_item_override() 命令来覆盖此命令。

gp_resolved_file_type

确定给定文件的类型

gp_resolved_file_type(<original-file> <file> <exepath> <dirs> <type-var>
                      [<rpaths>])

此命令确定 <file> 相对于 <original-file> 的类型。先决条件的结果类型存储在 <type-var> 变量中。

如有必要,请使用 <exepath><dirs> 来解析非绝对 <file> 值——但仅限于非嵌入式项。

<rpaths>

请参阅 get_prerequisites() 中的参数说明。

<type-var> 变量将设置为以下值之一:

  • system

  • local

  • embedded

  • other

项目可以通过定义自定义 gp_resolved_file_type_override() 命令来覆盖此命令。

gp_file_type

确定给定文件的类型

gp_file_type(<original-file> <file> <type-var>)

此命令确定 <file> 相对于 <original-file> 的类型。先决条件的结果类型存储在 <type-var> 变量中。

<type-var> 变量将设置为以下值之一:

  • system

  • local

  • embedded

  • other

示例

示例:基本用法

打印共享库的所有依赖项,包括系统库,并带有详细输出

include(GetPrerequisites)
list_prerequisites("path/to/libfoo.dylib" 1 0 1)

示例:升级代码

例如

include(GetPrerequisites)
# ...
gp_append_unique(keys "${key}")

新的代码中的 gp_append_unique() 可以替换为

if(NOT key IN_LIST keys)
  list(APPEND keys "${key}")
endif()