【发布时间】:2022-10-24 21:00:19
【问题描述】:
我有一个小型 CMake 项目,它封装了一个小型 C++ 库。对于这个库,我想在开发时默认启用几乎所有可用的警告。但是,如果有人想使用我的库并因此使用add_subdirectory 来包含我的项目,我想禁用我的库的警告。
我知道如何禁用警告,但我想知道如何检测 CMake 项目当前是独立处理还是嵌入到另一个 CMake 项目中。
【问题讨论】:
标签: cmake
我有一个小型 CMake 项目,它封装了一个小型 C++ 库。对于这个库,我想在开发时默认启用几乎所有可用的警告。但是,如果有人想使用我的库并因此使用add_subdirectory 来包含我的项目,我想禁用我的库的警告。
我知道如何禁用警告,但我想知道如何检测 CMake 项目当前是独立处理还是嵌入到另一个 CMake 项目中。
【问题讨论】:
标签: cmake
免责声明:此答案假定project 调用始终发生在为每个项目处理的第一个处理的CMakeLists.txt 文件中。
最好的检查方法(据我所知)是测试变量CMAKE_SOURCE_DIR 和PROJECT_SOURCE_DIR(注意:没有CMAKE_ 前缀)是否引用相同的路径。
源树顶层的路径。
这是当前 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()
【讨论】: