Build CMake:如何防止直接使用错误的子目录CmakeList?

Build CMake:如何防止直接使用错误的子目录CmakeList?,build,cmake,build-process,Build,Cmake,Build Process,例如,如果我有一个主CMakeLists,它构建了project的所有依赖项,然后通过add\u子目录(project)构建项目本身。 但是如果您尝试通过project/CMakeLists构建,您将失败(因为缺少依赖项)。那么,防止这种情况发生的最佳方法是什么,例如,检查给定的CmakeList是否由另一个包含,或者它是否是“根”。在需要该选项的子目录中的CmakeList.txt文件中,添加: if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURREN

例如,如果我有一个主CMakeLists,它构建了
project
的所有依赖项,然后通过
add\u子目录(project)
构建项目本身。
但是如果您尝试通过
project/CMakeLists
构建,您将失败(因为缺少依赖项)。那么,防止这种情况发生的最佳方法是什么,例如,检查给定的CmakeList是否由另一个包含,或者它是否是“根”。在需要该选项的子目录中的CmakeList.txt文件中,添加:

if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
  message(FATAL_ERROR "Blah blah wrong directory")
endif()

检查一个给定的CMakeLists是否被另一个包含,或者它是否是“根”
-您可以将
CMakeLists.txt
CMakeLists.txt
进行比较,以检查当前执行的
CMakeLists.txt
是否为顶级。通常情况下,适当的自述文件很有用-使用CMake,您很难避免所有可能的误用。您可以在根CMakeLists中定义一个变量,并在子目录中检查它。您可以使用
if(TARGET…
检查依赖项目是否已经处理/确实存在。或者直接使用
add_subdirectory()
(有其缺点)或作为外部项目(有关更多详细信息,请参阅)添加
project
所需的依赖项。在您的情况下,依赖项是什么意思?第三方图书馆?如果你说的是你也编译的另一个库,CMake会找出依赖项并在之前构建它们。好吧,我在项目根目录中有一个
CmakeList
,其中添加了所有需要的依赖项作为子目录,但是“问题”与我的项目相关的大部分内容都位于
root/project
文件夹中,我在其中添加了一个子目录,因此一些用户没有阅读自述文件(毫不奇怪=),而不是在根文件夹中运行cmake,他们试图从子文件夹中构建它,但显然失败了(因为它无法链接到未构建的依赖项)。所以我想要一个干净的方法来防止这种用例(可能已经有了内置的方法)。