CMake: define "Q_OBJECT" in the file and add it to the list of files for processing MOC

I am currently using the variable MYPROJECT_CURRENT_HEADERS in CMake to display all the headers. When I use Qt, my CMakeLists.txt contains:

 QT4_WRAP_CPP(MYPROJECT_CURRENT_MOC ${MYPROJECT_CURRENT_HEADERS}) 

The problem is that all headers are processed by moc, even those that do not have Q_OBJECT : therefore it generates a lot of empty file.

Is there a solution for grep / to determine if the file contains a Q_OBJECT string, and if so, add it to MYPROJECT_CURRENT_MOC ?

thanks

+7
source share
2 answers

I don’t know a simple command to select headers having a line from the list, but you can always do a loop to find all such headers:

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

But this solution has its own drawback: if you add Q_OBJECT to one of the filtered files, you need to restart cmake manually. Otherwise, the moc code for the new file will not be automatically generated during the build process.

+5
source

In the upcoming CMake 2.8.6 release, there is a new target property called "AUTOMOC" that can help you.

The test for this function (which you can use as a guide or an example) can be found here:

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

The simplest CMakeLists.txt file is here:

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

If you use this function, cmake scans the headers for Q_OBJECT and automatically starts moc for you.

If you want to try before the final version of CMake 2.8.6, you can download one of the following releases:

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

The "-rc2" files include the AUTOMOC property.

Here is the help text: "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, ie 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
source

All Articles