2011-08-20 8 views
7

Actualmente, utilizo una variable MYPROJECT_CURRENT_HEADERS en CMake para listar todos los encabezados. Como utilizo Qt, mi CMakeLists.txt contiene:CMake: detectar "Q_OBJECT" en un archivo y agregarlo a una lista de archivos a tratar por MOC

QT4_WRAP_CPP(MYPROJECT_CURRENT_MOC ${MYPROJECT_CURRENT_HEADERS}) 

El problema es que todas las cabeceras son tratados por moc, incluso aquellos que no tienen un Q_OBJECT: lo que genera muchas archivo vacío.

¿Existe una solución para "grep"/detectar si el archivo contiene la cadena Q_OBJECT y si es el caso, agréguela al MYPROJECT_CURRENT_MOC?

Gracias

Respuesta

5

no sé un simple comando para recoger las cabeceras que tienen una cadena de la lista, pero siempre se puede hacer un bucle para encontrar todos estos encabezados:

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() 

pero esta solución tiene su propio inconveniente: si agrega un Q_OBJECT en uno de los archivos filtrados, debe volver a ejecutar cmake manualmente. De lo contrario, el código moc para el nuevo archivo no se generará automáticamente durante el proceso de compilación.

5

Hay una nueva propiedad de destino en el CMake 2.8.6 pronto llamado para ser llamado "AUTOMOC" que puede ser de ayuda.

La prueba para esta función (que se puede utilizar como una guía o ejemplo) se encuentra aquí:

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

El archivo CMakeLists.txt es muy simple aquí:

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

Si usa esta característica, cmake escaneará los encabezados de Q_OBJECT y automáticamente ejecutará moc por usted.

Si desea probarlo antes de la versión final de CMake 2.8.6, puede descargar uno de los candidatos de liberación aquí:

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

Los archivos "-rc2" no incluyen la propiedad AUTOMOC.

Aquí está el texto de ayuda de funcionamiento "cmake AUTOMOC --help-propiedad":

 
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. 
Cuestiones relacionadas