如何防止 CMake 从 add_subdirectory() 包含的项目中 install()-ing 目标?

Qix*_*Qix 7 cmake

我的顶级 CMake 项目依赖于some-library,我使用它将其包含到我的项目中

add_subdirectory (some-library)
Run Code Online (Sandbox Code Playgroud)

然后使用链接到它

target_link_libraries (my-project PRIVATE some-library)
Run Code Online (Sandbox Code Playgroud)

我还想添加install (TARGETS my-rpoject ...)指令,以便我的项目可以通过生成的任何构建系统(例如,如果sudo ninja install使用-GNinja生成器)安装到系统中。

然而,如果some-library 还定义了一些install (TARGETS some-library ...)指令,它们就会与我的项目目标的安装混在一起,这给了一些子目录依赖项,在系统的安装目录中创建了一堆额外的、不必要的东西,我想避免这些东西。

如何让 CMakeinstall (...)从添加的子模块/依赖项项目中排除任何目标add_subdirectory (),并仅保留顶级项目中的目标?

Qix*_*Qix 5

至少从 CMake 3.0 开始,add_subdirectory ()具有EXCLUDE_FROM_ALL可以添加到调用末尾的标志。

add_subdirectory (some-library EXCLUDE_FROM_ALL)
Run Code Online (Sandbox Code Playgroud)

这会删除所有目标(包括安装目标)在构建时按默认规则进行评估,这意味着除非在命令行上显式指定它们或者以其他方式依赖于默认规则中包含的目标,否则不会构建它们规则。

由于您的顶级项目的目标本质上包含在默认规则中(EXCLUDE_FROM_ALL例如,除非您创建也指定的自定义目标),因此传递EXCLUDE_FROM_ALL到依赖项目标add_subdirectory ()然后链接到依赖项目标将自动构建您的项目所需的任何依赖项。 d 期望但省略默认规则中的安装目标install。

因此,剩下的就是您自己的install()目标 - 没有您的子目录。