测试是否使用 CMakeLists.txt 作为子目录

qwe*_*iop 3 cmake

我想写一个CMakeLists不仅可以用作子项CMakeLists也可以独立使用的程序。例如,在以下设置中

a
??? b
?   ??? CMakeLists.txt
??? CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

$ cat a/CMakeLists.txt
add_subdirectory(b)
Run Code Online (Sandbox Code Playgroud)

但是,我还想制作a/b/CMakeLists.txt一个独立的 CMake 文件,可以直接由cmake. 特别是,a/b/CMakeLists.txt需要根据使用方式进行条件初始化。基本上是这样的:

$ cat a/b/CMakeLists.txt
IF_INCLUDED # dummy
   DO_INIT()
ENDIF
# something else
Run Code Online (Sandbox Code Playgroud)

所以,我想知道

  1. 这是人们会做的事情吗?
  2. 有没有像前面提到的IF_INCLUDE(再次是虚拟的)谓词?

Rei*_*ica 5

我见过几次这样的设置,所以这肯定是人们做的事情。这种测试最常见的表述方式是:

if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
Run Code Online (Sandbox Code Playgroud)

(或与二进制目录相同)。

CMAKE_SOURCE_DIR是包含顶层的目录CMakeLists.txt(最初调用 CMake的目录)。CMAKE_CURRENT_SOURCE_DIR是包含CMakeLists.txt当前正在处理的目录。如果它们相同,则保证当前的 CMakeList 是顶级的。