在 CMakeLists.txt 中,我如何判断它是否与 add_subdirectory() 一起使用?

How can I tell, within a CMakeLists.txt, whether it's used with add_subdirectory()?

我有这个代码项目可以独立构建,也可以作为更大存储库的子项目(将其作为子存储库检查)。在后一种情况下,我的主项目有一个顶级 CMakeLists.txt

add_subdirectory(${MY_SUBPROJ_SUBDIR})

现在,我希望子项目在通过 the add_directory() 使用时表现得有所不同。显然,我会使用一个大的 if 指令。但是我要检查什么条件? CMake "tell",当 运行 对于某些 CMakeLists.txt 时,它是一个子目录文件还是主文件?

  1. 项目的 CMakeLists.txt 和项目的子目录中调用 project() 之后,您可以使用:

     if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
         # I am top-level project.
     else()
         # I am called from other project with add_subdirectory().
     endif()
    

    注意:如评论中所述,此方法可能不适用于 Windows,其中 CMAKE_SOURCE_DIR 包含 [= 的小写版本17=] 因此不能直接比较是否相等。对于那种检查 PARENT_DIRECTORY 属性 的方法,如 that answer 中对重复问题的描述,似乎更可靠。

  2. project() 调用之前的替代方法:

     if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
         # I am top-level project.
     else()
         # I am called from other project with add_subdirectory().
     endif()
    

    这个替代方案也可以在项目 CMakeLists.txt 的任何地方使用(但不能在子目录中)。


假设您有一个项目 A,其中有两个 CMakeLists.txt:一个在项目目录中,一个在子目录 src/ 中。上述方案使用方法:

CMakeLists.txt:

cmake_minimum_required(...)
...
<only approach *2* can be used there>
...
project(A)
...
<approach *1* or *2* can be used there>
...
add_subdirectory(src)
...

src/CMakeLists.txt:

...
<only approach *1* can be used there>
...

对于给定的方案项目 A 可以检测它是独立构建的(顶级项目)还是作为另一个项目的一部分 B.