target_sources

在 3.1 版本中新增。

將來源檔案新增至目標。

target_sources(<target>
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

指定在建置目標和/或其相依項時要使用的來源。指定的 <target> 必須由諸如 add_executable()add_library()add_custom_target() 之類的命令建立,而且不得為 別名目標<items> 可以使用 生成器 表達式

在 3.20 版本中新增: <target> 可以是自訂目標。

必須使用 INTERFACEPUBLICPRIVATE 關鍵字來指定後續來源檔案路徑 (<items>) 的範圍PRIVATEPUBLIC 項目將會填入 <target>SOURCES 屬性,這些屬性在建置目標本身時使用。PUBLICINTERFACE 項目將會填入 <target>INTERFACE_SOURCES 屬性,這些屬性在建置相依項時使用。由 add_custom_target() 建立的目標只能有 PRIVATE 範圍。

對相同的 <target> 重複呼叫會依呼叫順序附加項目。

在 3.3 版本中新增: 允許使用 INTERFACE_SOURCES 匯出目標。

在 3.11 版本中新增: 允許在 匯入的目標 上設定 INTERFACE 項目。

在 3.13 版本中變更: 相對來源檔案路徑會解譯為相對於目前的來源目錄(即 CMAKE_CURRENT_SOURCE_DIR)。請參閱原則 CMP0076

以生成器表達式開頭的路徑不會修改。當目標的 SOURCE_DIR 屬性與 CMAKE_CURRENT_SOURCE_DIR 不同時,請在生成器表達式中使用絕對路徑,以確保來源正確指派給目標。

# WRONG: starts with generator expression, but relative path used
target_sources(MyTarget PRIVATE "$<$<CONFIG:Debug>:dbgsrc.cpp>")

# CORRECT: absolute path used inside the generator expression
target_sources(MyTarget PRIVATE "$<$<CONFIG:Debug>:${CMAKE_CURRENT_SOURCE_DIR}/dbgsrc.cpp>")

如需有關定義建置系統屬性的詳細資訊,請參閱 cmake-buildsystem(7) 文件。

檔案集

在 3.23 版本中新增。

target_sources(<target>
  [<INTERFACE|PUBLIC|PRIVATE>
   [FILE_SET <set> [TYPE <type>] [BASE_DIRS <dirs>...] [FILES <files>...]]...
  ]...)

將檔案集新增至目標,或將檔案新增至現有的檔案集。目標有零個或多個具名的檔案集。每個檔案集都有一個名稱、類型、INTERFACEPUBLICPRIVATE 的範圍、一個或多個基準目錄,以及這些目錄中的檔案。可接受的類型包括:

HEADERS

打算透過語言的 #include 機制使用的來源。

CXX_MODULES

在 3.28 版本中新增。

包含 C++ 介面模組或分割單元的來源 (即使用 export 關鍵字的來源)。此檔案集類型除了在 IMPORTED 目標上之外,不得具有 INTERFACE 範圍。

選用的預設檔案集會以其類型命名。目標不得為自訂目標或 FRAMEWORK 目標。

PRIVATEPUBLIC 檔案集中的檔案會標示為來源檔案,以用於 IDE 整合。此外,HEADERS 檔案集中的檔案會將其 HEADER_FILE_ONLY 屬性設定為 TRUE。可以使用 install(TARGETS) 命令安裝 INTERFACEPUBLIC 檔案集中的檔案,並使用 install(EXPORT)export() 命令匯出。

每個 target_sources(FILE_SET) 項目都以 INTERFACEPUBLICPRIVATE 開頭,並接受下列引數:

FILE_SET <set>

要建立或新增至的檔案集名稱。它只能包含字母、數字和底線。以大寫字母開頭的名稱保留給 CMake 預先定義的內建檔案集。唯一預先定義的設定名稱是與可接受類型相符的名稱。所有其他設定名稱都不得以大寫字母或底線開頭。

TYPE <type>

每個檔案集都與特定類型的檔案相關聯。只能使用上述指定的類型,而且指定其他任何項目都是錯誤的。在特殊情況下,如果檔案集的名稱是其中一個類型,則不需要指定類型,而且可以省略 TYPE <type> 引數。對於所有其他檔案集名稱,TYPE 是必要的。

BASE_DIRS <dirs>...

檔案集的選用基準目錄清單。任何相對路徑都會視為相對於目前的來源目錄 (即 CMAKE_CURRENT_SOURCE_DIR)。如果第一次建立檔案集時未指定 BASE_DIRS,則會新增 CMAKE_CURRENT_SOURCE_DIR 的值。此引數支援 生成器 表達式

檔案集的任何兩個基準目錄都不得互為子目錄。此需求必須符合新增至檔案集的所有基準目錄,而不僅僅是呼叫 target_sources() 中的基準目錄。

FILES <files>...

要新增至檔案集的選用檔案清單。每個檔案都必須在其中一個基準目錄或其中一個基準目錄的子目錄中。此引數支援 生成器 表達式

如果指定相對路徑,則會視為相對於呼叫 target_sources() 時的 CMAKE_CURRENT_SOURCE_DIR。以此開頭的路徑除外:$<。在評估產生器表達式之後,這類路徑會視為相對於目標的來源目錄。

下列目標屬性是由 target_sources(FILE_SET) 設定的,但一般不應直接操作它們:

對於類型為 HEADERS 的檔案集:

對於類型為 CXX_MODULES 的檔案集合

與包含目錄相關的目標屬性也會被 target_sources(FILE_SET) 修改,如下所示

INCLUDE_DIRECTORIES

如果 TYPEHEADERS,且檔案集合的作用域為 PRIVATEPUBLIC,則檔案集合的所有 BASE_DIRS 都會被包裝在 $<BUILD_INTERFACE> 中,並附加到此屬性。

INTERFACE_INCLUDE_DIRECTORIES

如果 TYPEHEADERS,且檔案集合的作用域為 INTERFACEPUBLIC,則檔案集合的所有 BASE_DIRS 都會被包裝在 $<BUILD_INTERFACE> 中,並附加到此屬性。

另請參閱