如何在CMakeLists.txt中告诉它是否与add_subdirectory()一起使用?

时间:2017-03-10 10:47:02

标签: build cmake subdirectory subrepos

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

add_subdirectory(${MY_SUBPROJ_SUBDIR})

现在,我希望子项目在the add_directory()使用的情况下表现得有些不同。显然,我会使用大if指令。但我检查的条件是什么?在运行某些CMakeLists.txt时,如果它是一个子文件或主文件,CM怎么能告诉"

1 个答案:

答案 0 :(得分:4)

  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()
    
  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中的任何位置(但不在子目录中)。

  3. 假设你有一个带有两个CMakeLists.txt的项目 A :一个在项目目录中,一个在子目录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 的一部分。