target_sources()
新版本 3.1。
将源文件添加到目标。
target_sources(<target> <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
指定在构建目标及其依赖项时要使用的源。名为的目标必须由 add_executable()、add_library() 或者 add_custom_target() 等命令创建,且不能是 ALIAS 目标。 可以使用生成器表达式。
在新版本 3.20 中:允许使用 指定自定义目标。
INTERFACE、PUBLIC 和 PRIVATE 关键字用于指定紧随其后的源文件路径()的范围。PRIVATE 和 PUBLIC 项目将填充 的 SOURCES 属性,用于构建目标本身。PUBLIC 和 INTERFACE 项目将填充 的 INTERFACE_SOURCES 属性,用于构建依赖项。由 add_custom_target() 创建的目标只能是 PRIVATE 范围。
对同一个 的多次调用将按顺序追加项目。
新版本 3.3:允许导出带有 INTERFACE_SOURCES 的目标。
新版本 3.11:允许在 IMPORTED 目标上设置 INTERFACE 项目。
更新于版本 3.13:相对源文件路径将被解释为相对于当前源目录(即 CMAKE_CURRENT_SOURCE_DIR)。参见策略 CMP0076。
以生成器表达式开头的路径将保持不变。当目标的 SOURCE_DIR 属性与 CMAKE_CURRENT_SOURCE_DIR 不同时,请在生成器表达式中使用绝对路径,以确保源文件正确分配给目标。
#错误:以生成器表达式开始,但使用了相对路径 target_sources(MyTarget PRIVATE "$<$<CONFIG:Debug>:dbgsrc.cpp>") #正确:在生成器表达式中使用了绝对路径 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>...]]... ]...)
将文件集添加到目标,或将文件添加到现有文件集。目标有0个或多个命名的文件集。每个文件集有一个名称、一个类型、INTERFACE、PUBLIC 或 PRIVATE 中的一个作用域,一个或多个基本目录以及这些目录中的文件。可接受的类型包括:
HEADERS
计划通过语言的 #include 机制使用的源文件。
CXX_MODULES
注意:实验性。由 CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API 限制
包含 C++ 接口模块或分区单元(即,使用 export 关键字的源)的源。除非在 IMPORTED 目标上,否则 FILE_SET 类型可能没有 INTERFACE 范围。
CXX_MODULE_HEADER_UNITS
注意:实验性。由 CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API 限制.
C++ 头文件,可由其他 C++ 源代码导入。除非在 IMPORTED 目标上,否则该类别的 FILE_SET 类型可能没有 INTERFACE 范围。
默认文件集是可选的,它们的名称与它们的类型相同。目标不能是自定义目标或 FRAMEWORK 目标。
私有或公共文件集中的文件将标记为用于 IDE 集成的源文件。另外,将 HEADER_FILE_ONLY 属性设置为 TRUE 的文件在 HEADERS 文件集中。INTERFACE 或 PUBLIC 文件集中的文件可以使用 install(TARGETS) 命令进行安装,并使用 install(EXPORT) 和 export() 命令进行导出。
每个 target_sources(FILE_SET) 条目以 INTERFACE,PUBLIC 或 PRIVATE 开头,并接受以下参数:
FILE_SET
要创建或添加的文件集的名称。它必须只包含字母、数字和下划线。以大写字母开头的名称保留给 CMake 预定义的内置文件集。唯一预定义的集合名称是与可接受类型相匹配的名称。所有其他集合名称不得以大写字母或下划线开头。
TYPE
每个文件集与特定类型的文件关联。只能使用上面指定的类型,指定其他类型将导致错误。作为一个特例,如果文件集的名称是类型之一,则不需要指定类型,并且可以省略 TYPE 参数。对于所有其他文件集名称,TYPE 是必需的。
BASE_DIRS …
文件集的一个或多个基本目录的可选列表。任何相对路径都被视为相对于当前源目录(即 CMAKE_CURRENT_SOURCE_DIR)。如果在文件集首次创建时未指定 BASE_DIRS,则会添加 CMAKE_CURRENT_SOURCE_DIR 的值。此参数支持生成器表达式。
一个文件集的多个基本目录不能互为子目录,并且在每次 target_sources() 调用中添加的文件集必须满足该要求。
FILES …
要添加到文件集的文件的可选列表。每个文件必须位于基本目录之一或基本目录的子目录中。此参数支持生成器表达式。
如果指定了相对路径,它们会被视为相对于调用 target_sources() 时的CMAKE_CURRENT_SOURCE_DIR。唯一的例外是以 $< 开头的路径。这些路径在评估生成器表达式后被视为相对于目标的源目录。
以下目标属性由 target_sources(FILE_SET) 设置,但通常不应直接操作:
对于类型为 HEADERS 的文件集:
HEADER_SETS
INTERFACE_HEADER_SETS
HEADER_SET
HEADER_SET_
HEADER_DIRS
HEADER_DIRS_
对于类型为 CXX_MODULES 的文件集:
CXX_MODULE_SETS
INTERFACE_CXX_MODULE_SETS
CXX_MODULE_SET
CXX_MODULE_SET_
CXX_MODULE_DIRS
CXX_MODULE_DIRS_
对于类型为 CXX_MODULE_HEADER_UNITS 的文件集:
CXX_MODULE_HEADER_UNIT_SETS
INTERFACE_CXX_MODULE_HEADER_UNIT_SETS
CXX_MODULE_HEADER_UNIT_SET
CXX_MODULE_HEADER_UNIT_SET_
CXX_MODULE_HEADER_UNIT_DIRS
CXX_MODULE_HEADER_UNIT_DIRS_
目标属性与包括目录相关的 target_sources(FILE_SET) 也按以下方式进行更改:
如果 TYPE 是 HEADERS 或 CXX_MODULE_HEADER_UNITS,并且文件集的范围是 PRIVATE 或 PUBLIC,则将文件集的所有 BASE_DIRS 包装在 $ 中并附加到此属性。
INTERFACE_INCLUDE_DIRECTORIES
如果 TYPE 是 HEADERS 或 CXX_MODULE_HEADER_UNITS,并且文件集的范围是 INTERFACE 或 PUBLIC,则将文件集的所有 BASE_DIRS 包装在 $ 中并附加到此属性。
通过 target_sources(FILE_SET) 命令,您可以添加文件集以及设置文件集的类型、范围、基本目录和文件。此命令还通过相应的属性管理各种文件集以及与包含目录相关的属性。在创建目标时,这些属性有助于构建系统更好地组织和管理源文件。