在 CMakeLists.txt 中,我如何判断它是否与 add_subdirectory() 一起使用?
How can I tell, within a CMakeLists.txt, whether it's used with add_subdirectory()?
我有这个代码项目可以独立构建,也可以作为更大存储库的子项目(将其作为子存储库检查)。在后一种情况下,我的主项目有一个顶级 CMakeLists.txt
add_subdirectory(${MY_SUBPROJ_SUBDIR})
现在,我希望子项目在通过 the add_directory()
使用时表现得有所不同。显然,我会使用一个大的 if
指令。但是我要检查什么条件? CMake "tell",当 运行 对于某些 CMakeLists.txt
时,它是一个子目录文件还是主文件?
在 项目的 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
包含 [= 的小写版本17=] 因此不能直接比较是否相等。对于那种检查 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.
我有这个代码项目可以独立构建,也可以作为更大存储库的子项目(将其作为子存储库检查)。在后一种情况下,我的主项目有一个顶级 CMakeLists.txt
add_subdirectory(${MY_SUBPROJ_SUBDIR})
现在,我希望子项目在通过 the add_directory()
使用时表现得有所不同。显然,我会使用一个大的 if
指令。但是我要检查什么条件? CMake "tell",当 运行 对于某些 CMakeLists.txt
时,它是一个子目录文件还是主文件?
在 项目的
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
包含 [= 的小写版本17=] 因此不能直接比较是否相等。对于那种检查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.