CMake: функция ‘AUTOMOC’ пропускает источники исполняемых целей?

Есть проект среднего размера с верхним уровнем CMakeLists.txt который определяет некоторые общие вещи и вызывает настройку всех артефактов (подпроектов) в проекте следующим образом:

add_subdirectory(components/A)
add_subdirectory(components/B)
add_subdirectory(components/C)

add_subdirectory(components/E)

Артефакты — это статические / общие библиотеки или исполняемые файлы (которые так или иначе зависят друг от друга). В этом примере есть только один исполняемый файл: E, Все отлично настраивает и строит, когда старый qt4_wrap_cpp используется для обработки MOC.

При переходе на (относительно) новый AUTOMOC добавив следующее в начало CMakeLists.txt:

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

все источники статических / общих библиотек AUTOMOCЭд просто отлично. Тем не менее, источники исполняемой цели (E в этом примере) никогда AUTOMOC«Ред.

Я пробовал оба MSYS Makefiles а также Ninja генераторы, и оба просто не создают цель для AUTOMOC‘ing, но только для исходников исполняемого файла (для статических / общих библиотечных целей AUTOMOCдобавлена ​​цель).

  • Кто-нибудь уже испытал это?
  • Что может быть причиной?
  • Это пахнет как ошибка?

Обновить


Я нашел причину, обсуждение продолжается Список рассылки CMake.

3

Решение

Подводя итог, проблема заключалась в том, что E не включил модуль Qt ни явно:

find_package(Qt4 ...)

ни косвенно:

find_package(MyPrecious ...)

где MyPrecious может быть каким-то сторонним модулем, который сам включает Qt.

В результате не кэшированные переменные, такие как QT_VERSION_* не присутствуют в объеме E подпроект, и по этой причине AUTOMOC функция не может функционировать должным образом. Гадкий подводный камень, я бы сказал. Для более подробной информации обратитесь к Список рассылки CMake.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]