AUTOMOC_DEPEND_FILTERS¶
新增於 3.9 版本。
由 AUTOMOC
使用的篩選器定義,用於從原始碼檔案中提取檔名,這些檔名被註冊為該原始碼檔案的 moc
檔案的額外相依性。
篩選器定義為 關鍵字;正規表示式
配對。首先會在檔案內容中搜尋 關鍵字
。如果至少找到一次,則會透過連續搜尋 正規表示式
並取得第一個匹配群組來提取檔名。
在第一個匹配群組中找到的檔名會被搜尋
首先在原始碼檔案附近
然後在目標的
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")