我有这个代码项目可以独立构建,也可以作为较大存储库的子项目构建(检查它作为子存储库)。在后一种情况下,我有一个主项目的顶级CMakeLists.txt
,它具有
add_subdirectory(${MY_SUBPROJ_SUBDIR})
现在,我希望子项目的行为有所不同,以防通过the add_directory()
使用。显然,我将使用一个大的if
指令。但是我检查什么条件?CMake 在运行某些CMakeLists.txt
时如何"分辨"它是 subdir 文件还是主文件?
-
在项目
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
属性的方法,如重复问题的回答中所述,似乎更可靠。 -
在
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
中的任何位置使用(但不能在子目录中使用)。
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的一部分。