AUTOMOC_DEPEND_FILTERS

新增於 3.9 版本。

AUTOMOC 使用的篩選器定義,用於從原始碼檔案中提取檔名,這些檔名被註冊為該原始碼檔案的 moc 檔案的額外相依性。

篩選器定義為 關鍵字;正規表示式 配對。首先會在檔案內容中搜尋 關鍵字。如果至少找到一次,則會透過連續搜尋 正規表示式 並取得第一個匹配群組來提取檔名。

在第一個匹配群組中找到的檔名會被搜尋

如果任何提取的檔案發生變更,即使原始碼檔案本身沒有變更,該原始碼檔案的 moc 檔案也會被重建。

如果任何提取的檔案是 GENERATED,或者它不在目標的原始碼中,則可能需要將其新增至 <ORIGIN>_autogen 目標 目標相依性中。請參閱 AUTOGEN_TARGET_DEPENDS 以供參考。

預設情況下,AUTOMOC_DEPEND_FILTERSCMAKE_AUTOMOC_DEPEND_FILTERS 初始化,而該變數預設為空。

從 Qt 5.15.0 開始,這個變數被忽略,因為 moc 能夠輸出正確的相依性。

請參閱 cmake-qt(7) 手冊,以取得更多關於在 CMake 中使用 Qt 的資訊。

範例 1

標頭檔案 my_class.hpp 使用自訂巨集 JSON_FILE_MACRO,該巨集定義在另一個標頭 macros.hpp 中。我們希望 my_class.hppmoc 檔案相依於 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.hppmoc 檔案相依於 meta.json。因此,我們將篩選器新增至 CMAKE_AUTOMOC_DEPEND_FILTERS

list(APPEND CMAKE_AUTOMOC_DEPEND_FILTERS
  "JSON_BASED_CLASS"
  "[\n^][ \t]*JSON_BASED_CLASS[ \t]*\\([^,]*,[ \t]*\"([^\"]+)\""
)

此外,我們假設 meta.jsonGENERATED,這就是為什麼我們必須將其新增至 AUTOGEN_TARGET_DEPENDS

set_property(TARGET my_target APPEND PROPERTY AUTOGEN_TARGET_DEPENDS "meta.json")