问题
I have this code project can be built either independently or as a subproject of a larger repository (checking it our as a sub-repository). In the latter case, I have a top-level CMakeLists.txt
for the main project which has
add_subdirectory(${MY_SUBPROJ_SUBDIR})
now, I want the subproject to behave somewhat differently in case it's used via the add_directory()
. Obviously, I would be using a large if
instruction. But what condition do I check? How can CMake "tell", when running for some CMakeLists.txt
, whether it's a subdir file or the main file?
回答1:
After the
project()
call in project'sCMakeLists.txt
and in the project's subdirectories you may use:if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) # I am top-level project. else() # I am called from other project with add_subdirectory(). endif()
Alternative for use before the
project()
call: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()
This alternative can also be used anywhere in project's
CMakeLists.txt
(but not in subdirectories).
Assume you have a project A with two CMakeLists.txt
: one in the project's directory, and one in subdirectory src/
. Scheme for use approaches described above:
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>
...
With given scheme project A may detect, whether it is built standalone (top-level project) or as a part of another project B.
来源:https://stackoverflow.com/questions/42716466/how-can-i-tell-within-a-cmakelists-txt-whether-its-used-with-add-subdirectory