【问题标题】:How to determine whether cmake project included via add_subdirectory?如何确定cmake项目是否通过add_subdirectory包含?
【发布时间】:2022-10-24 21:00:19
【问题描述】:

我有一个小型 CMake 项目,它封装了一个小型 C++ 库。对于这个库,我想在开发时默认启用几乎所有可用的警告。但是,如果有人想使用我的库并因此使用add_subdirectory 来包含我的项目,我想禁用我的库的警告。

我知道如何禁用警告,但我想知道如何检测 CMake 项目当前是独立处理还是嵌入到另一个 CMake 项目中。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    免责声明:此答案假定project 调用始终发生在为每个项目处理的第一个处理的CMakeLists.txt 文件中。


    最好的检查方法(据我所知)是测试变量CMAKE_SOURCE_DIRPROJECT_SOURCE_DIR(注意:没有CMAKE_ 前缀)是否引用相同的路径。

    来自文档12CMAKE_SOURCE_DIR

    源树顶层的路径。

    这是当前 CMake 源代码树顶层的完整路径。

    PROJECT_SOURCE_DIR

    这是在当前目录范围或其父目录之一中对 project() 命令的最后一次调用的源目录。请注意,它不受子目录范围内对 project() 的调用的影响(即从当前范围内对 add_subdirectory() 的调用)。

    所以它的要点是,如果项目是独立构建的,顶级源目录是包含您自己的 CMakeLists.txt 文件的目录,该文件(通常情况下)包含您的 project 调用自己的项目。假设您的项目中没有多个 project 调用(同样:通常情况下),这意味着发生最后一次 project 调用的目录(并且不在您的 sun 目录中)当前目录,根据文档不计算)与顶级源目录相同。因此,提到的变量将引用相同的路径。

    但是,如果您的项目嵌入到其他人的 CMake 项目中,则他们的 CMakeLists.txt 位置将定义顶级源目录。在某些时候,它们将包含您的项目,该项目由它自己的project 调用开始,将PROJECT_SOURCE_DIR 更新为所在目录的路径您的CMakeLists.txt 文件谎言。因此,CMAKE_SOURCE_DIR != PROJECT_SOURCE_DIR


    TL;DR:这是必要的检查

    if (CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
        message(STATUS "Your project is standalone")
    else()
        message(STATUS "Your project is embedded")
    endif()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-10
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多