Как определить, имеет ли текущий объем родительский элемент в 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})