CMake: обнаружить «Q_OBJECT» в файле и добавить его в список файлов для обработки MOC - PullRequest
7 голосов
/ 20 августа 2011

В настоящее время я использую переменную MYPROJECT_CURRENT_HEADERS в CMake для вывода списка всех заголовков. Поскольку я использую Qt, мой CMakeLists.txt содержит:

QT4_WRAP_CPP(MYPROJECT_CURRENT_MOC ${MYPROJECT_CURRENT_HEADERS})

Проблема в том, что moc обрабатывает все заголовки, даже те, которые не имеют Q_OBJECT: поэтому он генерирует много пустых файлов.

Есть ли решение для "grep" / обнаружения, если файл содержит строку Q_OBJECT и, если это так, добавьте ее в MYPROJECT_CURRENT_MOC?

Спасибо

Ответы [ 2 ]

5 голосов
/ 07 сентября 2011

В CMake 2.8.6, который скоро будет выпущен, есть новое целевое свойство, которое может помочь вам.

Тест для этой функции (который вы можете использовать в качестве руководства)или пример) находится здесь:

http://cmake.org/gitweb?p=cmake.git;a=tree;f=Tests/QtAutomoc;h=7dae3b16a54dc0b2f63bbfa5c218c48b9bbf34a9;hb=nightly-master

Очень простой файл CMakeLists.txt находится здесь:

http://cmake.org/gitweb?p=cmake.git;a=blob;f=Tests/QtAutomoc/CMakeLists.txt;h=4a5ff1099ba5249a6f22eea745a031b76e6f440f;hb=nightly-master

Если вы используетеС помощью этой функции cmake будет сканировать заголовки на наличие Q_OBJECT и автоматически запускать moc для вас.

Если вы хотите опробовать его до окончательного выпуска CMake 2.8.6, вы можете загрузить одного из кандидатов на выпускздесь:

http://cmake.org/files/v2.8/?C=M;O=D

Файлы "-rc2" содержат свойство AUTOMOC.

Вот текст справки по запуску "cmake --help-property AUTOMOC":

cmake version 2.8.6-rc2
  AUTOMOC
       Should the target be processed with automoc (for Qt projects).

       AUTOMOC is a boolean specifying whether CMake will handle the Qt moc
       preprocessor automatically, i.e.  without having to use the
       QT4_WRAP_CPP() macro.  Currently Qt4 is supported.  When this property
       is set to TRUE, CMake will scan the source files at build time and
       invoke moc accordingly.  If an #include statement like #include
       "moc_foo.cpp" is found, the Q_OBJECT class declaration is expected in
       the header, and moc is run on the header file.  If an #include
       statement like #include "foo.moc" is found, then a Q_OBJECT is
       expected in the current source file and moc is run on the file itself.
       Additionally, all header files are parsed for Q_OBJECT macros, and if
       found, moc is also executed on those files.  The resulting moc files,
       which are not included as shown above in any of the source files are
       included in a generated _automoc.cpp file, which is
       compiled as part of the target.This property is initialized by the
       value of the variable CMAKE_AUTOMOC if it is set when a target is
       created.
5 голосов
/ 23 августа 2011

Я не знаю простой команды для выбора заголовков, имеющих строку из списка, но вы всегда можете сделать цикл, чтобы найти все такие заголовки:

set(HEADERS_HAVING_Q_OBJECT)
foreach(header ${MYPROJECT_CURRENT_HEADERS})
    file(STRINGS "${header}" lines REGEX "Q_OBJECT")
    if(lines)
        list(APPEND HEADERS_HAVING_Q_OBJECT "${header}")
    endif()
endforeach()

Но у этого решения есть свой недостаток: если вы добавляете Q_OBJECT в один из отфильтрованных файлов, вам нужно перезапустить cmake вручную. В противном случае код moc для нового файла не будет автоматически сгенерирован во время процесса сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...