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



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

add_subdirectory(${MY_SUBPROJ_SUBDIR})

现在,我希望子项目的行为有所不同,以防通过the add_directory()使用。显然,我将使用一个大的if指令。但是我检查什么条件?CMake 在运行某些CMakeLists.txt时如何"分辨"它是 subdir 文件还是主文件?

  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包含小写版本的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的一部分。

最新更新