Как определить, имеет ли текущий объем родительский элемент в CMake?
Есть ли способ определить, имеет ли текущий объем родительский объект?
У меня есть проект, который может быть автономным проектом или подпроектом другого. Чтобы разрешить случай субпроекта, я использую флаг PARENT_SCOPE, чтобы установить(), чтобы подталкивать вещи до родителя. Однако, когда вы создаете автономный проект, я получаю предупреждение "текущая область не имеет родительского". Я хотел бы избежать этой ошибки, обнаружив, есть ли родительский элемент и включает вызовы set() в выражении if. Или есть другой способ установить переменную в родительской области, только если есть родитель?
Ответы
Ответ 1
Я считаю, что наиболее надежным подходом является использование PARENT_DIRECTORY
каталога PARENT_DIRECTORY
.
Это даст правильный ответ независимо от того, вызывается ли он до или после команды project
, и независимо от того, имеет ли родитель и ребенок оба имени одного проекта.
get_directory_property(hasParent PARENT_DIRECTORY)
if(hasParent)
message(STATUS "Has a parent scope.")
else()
message(STATUS "Doesn't have a parent scope.")
endif()
Ответ 2
Развернувшись немного над идеей @ruslo, я бы не взял PROJECT_SOURCE_DIR
а переменную CMAKE_PROJECT_NAME
(содержит имя первого определенного проекта) и PROJECT_NAME
(содержит имя текущего проекта), поэтому вы можете сделать что-то подобное в CMakeLists.txt
подпроекта:
project(bar)
if(${CMAKE_PROJECT_NAME} STREQUAL ${PROJECT_NAME})
#do stuff
else()
#do other stuff
end(${CMAKE_PROJECT_NAME} STREQUAL ${PROJECT_NAME})