这个问题在这里已经有了答案:
How to detect if current scope has a parent in CMake?
(3 个回答)
3年前关闭。
我有这个代码项目可以独立构建,也可以作为更大存储库的子项目(将其检查为子存储库)。在后一种情况下,我有一个顶级 CMakeLists.txt
对于主要项目有
add_subdirectory(${MY_SUBPROJ_SUBDIR})
现在,我希望子项目的行为有所不同,以防它通过
the add_directory()
使用。 .显然,我会使用一个大的 if
操作说明。但是我要检查什么条件? CMake 如何在运行时“告诉”一些 CMakeLists.txt
,到底是subdir文件还是主文件?
最佳答案
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
属性,如 that answer 中所述对于重复的问题,似乎更健壮。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 的一部分构建。
关于build - 在 CMakeLists.txt 中,如何判断它是否与 add_subdirectory() 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42716466/