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>包裹并追加到此属性。