AUTOMOC_DEPEND_FILTERS¶
版本 3.9 新增。
AUTOMOC
使用的篩選器定義,用於從來源檔案中提取檔案名稱,這些檔案名稱註冊為來源檔案的 moc
檔案的額外依賴項。
篩選器定義為 KEYWORD;REGULAR_EXPRESSION
配對。首先在檔案內容中搜尋 KEYWORD
。如果至少找到一次,則透過連續搜尋 REGULAR_EXPRESSION
並取得第一個匹配群組來提取檔案名稱。
在第一個匹配群組中找到的檔案名稱會被搜尋
首先在來源檔案的附近
然後在目標的
INCLUDE_DIRECTORIES
中。
如果任何提取的檔案發生變更,即使來源檔案本身沒有變更,來源檔案的 moc
檔案也會被重建。
如果任何提取的檔案是 GENERATED
,或者如果它不在目標的來源中,則可能需要將其新增到 <ORIGIN>_autogen 目標 目標依賴項中。請參閱 AUTOGEN_TARGET_DEPENDS
以供參考。
預設情況下,AUTOMOC_DEPEND_FILTERS
從 CMAKE_AUTOMOC_DEPEND_FILTERS
初始化,預設為空。
從 Qt 5.15.0 開始,此變數被忽略,因為 moc
能夠輸出正確的依賴項。
請參閱 cmake-qt(7)
手冊,以取得更多關於將 CMake 與 Qt 搭配使用的資訊。
範例 1¶
標頭檔 my_class.hpp
使用自訂巨集 JSON_FILE_MACRO
,該巨集在另一個標頭檔 macros.hpp
中定義。我們希望 my_class.hpp
的 moc
檔案依賴於 JSON_FILE_MACRO
的檔案名稱引數
// my_class.hpp
class My_Class : public QObject
{
Q_OBJECT
JSON_FILE_MACRO ( "info.json" )
...
};
在 CMakeLists.txt
中,我們將篩選器新增到 CMAKE_AUTOMOC_DEPEND_FILTERS
,如下所示
list(APPEND CMAKE_AUTOMOC_DEPEND_FILTERS
"JSON_FILE_MACRO"
"[\n][ \t]*JSON_FILE_MACRO[ \t]*\\([ \t]*\"([^\"]+)\""
)
我們假設 info.json
是一個純文字(非 GENERATED
)檔案,該檔案列在目標的來源中。因此,我們不需要將其新增到 AUTOGEN_TARGET_DEPENDS
。
範例 2¶
在目標 my_target
中,標頭檔 complex_class.hpp
使用自訂巨集 JSON_BASED_CLASS
,該巨集在另一個標頭檔 macros.hpp
中定義
// macros.hpp
...
#define JSON_BASED_CLASS(name, json) \
class name : public QObject \
{ \
Q_OBJECT \
Q_PLUGIN_METADATA(IID "demo" FILE json) \
name() {} \
};
...
// complex_class.hpp
#pragma once
JSON_BASED_CLASS(Complex_Class, "meta.json")
// end of file
由於 complex_class.hpp
不包含 Q_OBJECT
巨集,因此會被 AUTOMOC
忽略。我們透過將 JSON_BASED_CLASS
新增到 CMAKE_AUTOMOC_MACRO_NAMES
來變更此行為
list(APPEND CMAKE_AUTOMOC_MACRO_NAMES "JSON_BASED_CLASS")
我們希望 complex_class.hpp
的 moc
檔案依賴於 meta.json
。因此,我們將篩選器新增到 CMAKE_AUTOMOC_DEPEND_FILTERS
list(APPEND CMAKE_AUTOMOC_DEPEND_FILTERS
"JSON_BASED_CLASS"
"[\n^][ \t]*JSON_BASED_CLASS[ \t]*\\([^,]*,[ \t]*\"([^\"]+)\""
)
此外,我們假設 meta.json
是 GENERATED
,這就是為什麼我們必須將其新增到 AUTOGEN_TARGET_DEPENDS
set_property(TARGET my_target APPEND PROPERTY AUTOGEN_TARGET_DEPENDS "meta.json")