2011-08-20 27 views
7

Hiện tại, tôi sử dụng biến số MYPROJECT_CURRENT_HEADERS trong CMake để liệt kê tất cả các tiêu đề. Như tôi đã sử dụng Qt, CMakeLists.txt tôi bao gồm:CMake: phát hiện "Q_OBJECT" trong một tệp và thêm nó vào danh sách tệp để xử lý theo MOC

QT4_WRAP_CPP(MYPROJECT_CURRENT_MOC ${MYPROJECT_CURRENT_HEADERS}) 

Vấn đề là tất cả các tiêu đề được xử lý bằng moc, ngay cả những người không có một Q_OBJECT: vì vậy nó tạo ra nhiều tập tin rỗng.

Có giải pháp cho "grep"/phát hiện xem tệp có chứa chuỗi Q_OBJECT và nếu đúng như vậy, hãy thêm nó vào MYPROJECT_CURRENT_MOC?

Cảm ơn bạn

Trả lời

5

Tôi không biết một lệnh đơn giản để chọn tiêu đề có một chuỗi từ danh sách, nhưng bạn luôn có thể làm cho một vòng lặp để tìm tất cả các tiêu đề như:

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

Nhưng giải pháp này có nhược điểm riêng: nếu bạn thêm Q_OBJECT vào một trong các tệp đã lọc ra, bạn cần phải chạy lại cmake theo cách thủ công. Nếu không mã moc cho tập tin mới sẽ không được tự động tạo ra trong quá trình xây dựng.

5

Có một thuộc tính đích mới trong CMake 2.8.6 sắp phát hành được gọi là "TỰ ĐỘNG" có thể giúp bạn.

Các thử nghiệm cho tính năng này (mà bạn có thể sử dụng như một hướng dẫn hoặc ví dụ) được tìm thấy ở đây:

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

File CMakeLists.txt rất đơn giản là ở đây:

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

Nếu bạn sử dụng tính năng này, cmake sẽ quét các tiêu đề cho Q_OBJECT và tự động chạy moc cho bạn.

Nếu bạn muốn thử nó ra trước khi phát hành chính thức của CMake 2.8.6, bạn có thể tải về một trong những ứng cử viên phát hành ở đây:

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

Các tập tin "-rc2" làm bao gồm thuộc tính AUTOMOC.

Dưới đây là nội dung trợ giúp từ chạy "cmake AUTOMOC --help-bất động sản":

 
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. 
Các vấn đề liên quan