CMake:检测文件中的“Q_OBJECT”并将其添加到需要通过MOC处理的文件列表中。

7

目前,我在CMake中使用变量MYPROJECT_CURRENT_HEADERS列出所有头文件。由于我使用Qt,我的CMakeLists.txt包含:

QT4_WRAP_CPP(MYPROJECT_CURRENT_MOC ${MYPROJECT_CURRENT_HEADERS})

问题在于 moc 会处理所有的头文件,即使这些头文件没有 Q_OBJECT :因此它会生成很多空文件。
是否有一种方法可以“grep” / 检测文件中是否包含字符串 Q_OBJECT ,如果是,则将其添加到 MYPROJECT_CURRENT_MOC 中?
谢谢
2个回答

6
即将发布的CMake 2.8.6版本中有一个名为“AUTOMOC”的新目标属性,可能会对您有所帮助。您可以使用此功能的测试作为指南或示例,该测试在此处找到: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版本为2.8.6-rc2。 AUTOMOC 指定目标是否应该使用automoc(用于Qt项目)。
AUTOMOC是一个布尔值,指定CMake是否会自动处理Qt moc预处理器,即不需要使用QT4_WRAP_CPP()宏。目前支持Qt4。当将此属性设置为TRUE时,CMake会在构建时扫描源文件并相应地调用moc。如果找到像#include "moc_foo.cpp"这样的#include语句,则期望在头文件中声明Q_OBJECT类,并在头文件上运行moc。如果找到像#include "foo.moc"这样的#include语句,则期望在当前源文件中声明Q_OBJECT,并在文件本身上运行moc。此外,所有头文件都会解析Q_OBJECT宏,如果找到,则还会在这些文件上执行moc。生成的moc文件不包含在任何源文件中,而是包含在生成的_automoc.cpp文件中,该文件作为目标的一部分进行编译。如果在创建目标时设置了变量CMAKE_AUTOMOC的值,则初始化此属性。

5

我不知道一个简单的命令来选择列表中包含字符串的标头,但您始终可以创建循环来查找所有这样的标头:

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 代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接