我有这个代码项目可以独立构建,也可以作为更大存储库的子项目(将其检查为子存储库)。CMakeLists.txt
在后一种情况下,我有一个主项目的顶层,它有
add_subdirectory(${MY_SUBPROJ_SUBDIR})
现在,我希望子项目的行为有所不同,以防它通过the add_directory()
. 显然,我会使用大if
指令。但是我要检查什么条件?CMake 如何在运行时“告诉”CMakeLists.txt
它是子目录文件还是主文件?
我有这个代码项目可以独立构建,也可以作为更大存储库的子项目(将其检查为子存储库)。CMakeLists.txt
在后一种情况下,我有一个主项目的顶层,它有
add_subdirectory(${MY_SUBPROJ_SUBDIR})
现在,我希望子项目的行为有所不同,以防它通过the add_directory()
. 显然,我会使用大if
指令。但是我要检查什么条件?CMake 如何在运行时“告诉”CMakeLists.txt
它是子目录文件还是主文件?
在项目和项目的子目录中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
属性的案例方法,如对重复问题的回答中所述,似乎更稳健。
通话前使用的替代方案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的一部分。