2011-08-20 11 views
7

現在、CMakeで変数​​3210を使用してすべてのヘッダーを表示しています。CMake:ファイル内の "Q_OBJECT"を検出し、それをファイルリストに追加してMOCで扱います。

QT4_WRAP_CPP(MYPROJECT_CURRENT_MOC ${MYPROJECT_CURRENT_HEADERS}) 

問題はすべてのヘッダは、MOCでさえQ_OBJECTを持っていないものとして扱われていることである:私はQtのを使用すると、私のCMakeLists.txtは含まれていますので、多くの空のファイルを生成します。

ファイルに文字列Q_OBJECTが含まれているかどうかを "grep"/detectに解決する方法はありますか?その場合はMYPROJECT_CURRENT_MOCに追加しますか?

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

しかし、この解決策:

あなたは

答えて

5

私はリストから文字列を持つヘッダを選択するための簡単なコマンドを知らないが、あなたは常にこのようなすべてのヘッダを見つけるためにループを作ることができますありがとうございましたそれ自身の欠点があります:フィルタされたファイルにQ_OBJECTを追加すると、cmakeを手動で再実行する必要があります。さもなければ、新しいファイルのためのmocコードはビルドプロセス中に自動的に生成されません。

5

リリース予定の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の最終リリース前にそれを試してみたい場合は、ここでのリリース候補の1をダウンロードすることができますが:

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

「-rc2」のファイルが含まれませんAUTOMOCプロパティ。ここで

は "cmakeの--help-プロパティ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. 
関連する問題