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 關鍵字的單元) 的來源。此檔案集合類型可能沒有 INTERFACE 範圍,除非在 IMPORTED 目標上。

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

PRIVATEPUBLIC 檔案集合中的檔案會被標記為來源檔,以用於 IDE 整合。此外,HEADERS 檔案集合中的檔案會將其 HEADER_FILE_ONLY 屬性設定為 TRUEINTERFACEPUBLIC 檔案集合中的檔案可以使用 install(TARGETS) 指令安裝,並使用 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> 中,並附加到此屬性。

另請參閱