5

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

add_subdirectory(${MY_SUBPROJ_SUBDIR})

现在,我希望子项目的行为有所不同,以防它通过the add_directory(). 显然,我会使用大if指令。但是我要检查什么条件?CMake 如何在运行时“告诉”CMakeLists.txt它是子目录文件还是主文件?

4

1 回答 1

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

     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包含小写版本,PROJECT_SOURCE_DIR因此无法直接比较是否相等。对于那种检查PARENT_DIRECTORY属性的案例方法,如对重复问题的回答中所述,似乎更稳健。

  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的一部分。

于 2017-03-10T10:52:50.860 回答