【问题标题】:How do you prevent CMake from install()-ing targets from within projects included with add_subdirectory()?如何防止 CMake 从 add_subdirectory() 包含的项目中安装()-ing 目标?
【发布时间】:2020-11-18 20:36:33
【问题描述】:

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

add_subdirectory (some-library)

然后使用

链接它
target_link_libraries (my-project PRIVATE some-library)

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

但是,如果some-library 定义了一些install (TARGETS some-library ...) 指令,它们会与我的项目目标的安装混为一谈,因为一些子目录依赖项会产生一堆额外的、不必要的垃圾在我想避免的系统安装目录中。

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

【问题讨论】:

    标签: cmake


    【解决方案1】:

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

    add_subdirectory (some-library EXCLUDE_FROM_ALL)
    

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

    由于您的顶级项目的目标固有地包含在默认规则中(例如,除非您创建还指定EXCLUDE_FROM_ALL 的自定义目标),然后将EXCLUDE_FROM_ALL 传递给add_subdirectory (),然后链接到依赖项目标将按照您的预期自动构建您的项目所需的任何依赖项,但在默认的install 规则中省略安装目标

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

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 2010-09-20
      • 2014-03-24
      • 1970-01-01
      • 2019-11-05
      相关资源
      最近更新 更多