target_sources¶
在 3.1 版本中添加。
向目标添加源文件。
target_sources(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
指定构建目标和/或其依赖项时要使用的源文件。命名的 <target>
必须已通过诸如 add_executable()
或 add_library()
或 add_custom_target()
等命令创建,并且不得为 ALIAS target。 <items>
可以使用 generator expressions
。
在 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 版本中添加: 允许在 IMPORTED targets 上设置 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
关键字的源文件)。除非在IMPORTED
目标上,否则此文件集类型可能没有INTERFACE
作用域。
可选的默认文件集以其类型命名。目标不得是自定义目标或 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
的值。此参数支持generator expressions
。文件集的任何两个基本目录都不得互为子目录。此要求必须在添加到文件集的所有基本目录中满足,而不仅仅是在对
target_sources()
的单次调用中满足。
FILES <files>...
要添加到文件集的可选文件列表。每个文件都必须位于其中一个基本目录或其中一个基本目录的子目录中。此参数支持
generator expressions
。如果指定了相对路径,则在调用
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>
中,并追加到此属性。