Как я могу сказать, внутри CMakeLists.txt, используется ли он с add_subdirectory()?
У меня есть этот код проекта может быть построен независимо или в качестве подпроекта большого хранилища (проверка его как суб-хранилище). В последнем случае у меня на высшем уровне CMakeLists.txt
для основного проекта, который имеет
add_subdirectory(${MY_SUBPROJ_SUBDIR})
Теперь я хочу, чтобы подпроект вел себя несколько иначе, если он используется через the add_directory()
, Очевидно, я бы использовал большой if
инструкция. Но в каком состоянии я проверяю? Как CMake может "сказать", когда работает для некоторых CMakeLists.txt
будь то файл subdir или основной файл?
1 ответ
После
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()
Альтернатива для использования до
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.