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 版中添加: 允许在 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、一个或多个基本目录以及这些目录中的文件。可接受的类型包括

头文件

旨在通过某个语言的 #include 机制使用的源。

CXX_模块

在 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>...

要添加到文件集中的文件可选列表。每个文件都必须位于以下某个目录中:根目录或某个根目录的子目录。此参数支持 generator expressions

如果指定了相对路径,则它们在调用 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> 中,并添加到此属性。

另请参阅