У меня недостаточно репутации, чтобы комментировать ответ Сакры ...
Одна проблема, которую я вижу с этим решением, состоит в том, что если вы используете какой-либо подкаталог, изменения, которые вы вносите в переменную _allTargets внутри подкаталога, не будутраспространяется на родительскую область.
Копать больше, список (добавление ...) не может использоваться в этом случае:
Аналогично команде SET,команда LIST создает новые значения переменных в текущей области, даже если сам список фактически определен в родительской области.Чтобы распространить результаты этих операций вверх, используйте SET с PARENT_SCOPE, SET с CACHE INTERNAL, или некоторые другие средства распространения значения.
http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:set:
Если присутствует PARENT_SCOPE, переменная будет установлена в области видимости над текущей областью видимости. Каждый новый каталог или функция создает новую область действия .Эта команда установит значение переменной в родительский каталог или вызывающую функцию (в зависимости от того, что применимо к данному случаю).
(примечание для меня: макрос не равен функция)
Я не вижу общего решения (например, независимого от использования add_subdirectory) при использовании PARENT_SCOPE.Однако здесь, похоже, есть решение с использованием CACHE INTERNAL.
Цитирование из: http://www.cmake.org/pipermail/cmake/2007-November/018109.html
# A macro for passing lists between different directories
# through an internal cache variable.
MACRO (APPEND_INTERNAL_LIST LIST_NAME VALUE)
# If the list in not in the cache, create it.
IF (${LIST_NAME})
SET (${LIST_NAME} "${${LIST_NAME}};${VALUE}" CACHE INTERNAL "Internal
variable")
ELSE (${LIST_NAME})
SET (${LIST_NAME} "${VALUE}" CACHE INTERNAL "Internal variable")
ENDIF (${LIST_NAME})
ENDMACRO (APPEND_INTERNAL_LIST)
# A macro for passing lists between different directories
# through an internal cache variable.
# This function empties the variable (usually because of older runs)
MACRO (INITIALIZE_INTERNAL_LIST LIST_NAME)
SET (${LIST_NAME} "" CACHE INTERNAL "Internal variable")
ENDMACRO (INITIALIZE_INTERNAL_LIST)