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>
可以是自訂目標。
需要 INTERFACE
、PUBLIC
和 PRIVATE
關鍵字來指定後續原始檔路徑 (<items>
) 的範圍。PRIVATE
和 PUBLIC
項目將會填充 <target>
的 SOURCES
屬性,這些屬性在建置目標本身時使用。PUBLIC
和 INTERFACE
項目將會填充 <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>...]]...
]...)
將檔案集合新增至目標,或將檔案新增至現有的檔案集合。目標具有零個或多個具名的檔案集合。每個檔案集合都有一個名稱、一個類型、INTERFACE
、PUBLIC
或 PRIVATE
的範圍、一個或多個基本目錄,以及這些目錄中的檔案。可接受的類型包括
HEADERS
旨在透過語言的
#include
機制使用的來源。
CXX_MODULES
版本 3.28 新增。
包含 C++ 介面模組或分割單元 (即,使用
export
關鍵字的單元) 的來源。此檔案集合類型可能沒有INTERFACE
範圍,除非在IMPORTED
目標上。
選用的預設檔案集合以其類型命名。目標不得為自訂目標或 FRAMEWORK
目標。
PRIVATE
或 PUBLIC
檔案集合中的檔案會被標記為來源檔,以用於 IDE 整合。此外,HEADERS
檔案集合中的檔案會將其 HEADER_FILE_ONLY
屬性設定為 TRUE
。INTERFACE
或 PUBLIC
檔案集合中的檔案可以使用 install(TARGETS)
指令安裝,並使用 install(EXPORT)
和 export()
指令匯出。
每個 target_sources(FILE_SET)
條目都以 INTERFACE
、PUBLIC
或 PRIVATE
開頭,並接受以下引數
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)
修改,如下所示
如果
TYPE
為HEADERS
,且檔案集合的範圍為PRIVATE
或PUBLIC
,則檔案集合的所有BASE_DIRS
都會包裝在$<BUILD_INTERFACE>
中,並附加到此屬性。
如果
TYPE
為HEADERS
,且檔案集合的範圍為INTERFACE
或PUBLIC
,則檔案集合的所有BASE_DIRS
都會包裝在$<BUILD_INTERFACE>
中,並附加到此屬性。