target_sources

版本 3.1 中新增。

向目标添加源文件。

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

指定在构建目标和/或其依赖项时使用的源文件。指定的 <target> 必须已经由诸如 add_executable()add_library()add_custom_target() 的命令创建,并且不得是 ALIAS 目标<items> 可以使用 生成器表达式

版本 3.20 新增: <target> 可以是自定义目标。

需要 INTERFACEPUBLICPRIVATE 关键字来指定后面跟随的源文件路径 (<items>) 的范围PRIVATEPUBLIC 项将填充 <target>SOURCES 属性,这些属性在构建目标本身时使用。PUBLICINTERFACE 项将填充 <target>INTERFACE_SOURCES 属性,这些属性在构建依赖项时使用。由 add_custom_target() 创建的目标只能有 PRIVATE 范围。

对同一 <target> 的重复调用将按调用顺序追加项。

版本 3.3 新增:允许使用 INTERFACE_SOURCES 导出目标。

版本 3.11 新增:允许在 IMPORTED 目标上设置 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> 包裹并附加到此属性。

另请参阅