目标源¶
在 3.1 版本加入.
将源添加到目标。
target_sources(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
指定在构建目标和/或其依赖项时要使用的源。命名的 <target>
必须由命令创建,例如 add_executable()
或 add_library()
或 add_custom_target()
并且不能是 ALIAS 目标。 <items>
可以使用 generator expressions
。
在 3.20 版本加入: <target>
可以是自定义目标。
需要``INTERFACE``、PUBLIC
和``PRIVATE`` 关键字来指定源文件路径(<items>
)的 scope <Target Usage Requirements>`跟着他们。 ``PRIVATE` 和 PUBLIC
项将填充 <target>
的 SOURCES
属性,它们在构建目标本身时使用。 PUBLIC
和 INTERFACE
项将填充 <target>
的 INTERFACE_SOURCES
属性,在构建依赖项时使用。由 add_custom_target()
创建的目标只能有 PRIVATE
作用域。
重复调用相同的 <target>
按调用的顺序追加项目。
在 3.3 版本加入: 允许使用 INTERFACE_SOURCES
导出目标。
在 3.11 版本加入: 允许在 IMPORTED 目标 <Imported Targets> 上设置 ``INTERFACE` 项目。
在 3.13 版本发生变更: 相对源文件路径被解释为相对于当前源目录(即 CMAKE_CURRENT_SOURCE_DIR
)。请参阅政策:policy: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”的范围、一个或多个基本目录以及这些目录中的文件。可接受的类型包括:
标题
旨在通过语言的“#include”机制使用的源代码。
CXX_MODULES
备注
实验性的。由
CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API
控制包含 C++ 接口模块或分区单元的源代码(即使用
export
关键字的源代码)。此文件集类型可能没有INTERFACE
范围,除了``IMPORTED`` 目标。
CXX_MODULE_HEADER_UNITS
备注
实验性的。由
CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API
控制可以由其他 C++ 源代码导入的 C++ 标头源。此文件集类型可能没有
INTERFACE
范围,除了``IMPORTED`` 目标。
可选的默认文件集以其类型命名。目标可能不是自定义目标或 FRAMEWORK
目标。
出于 IDE 集成的目的,PRIVATE
或 PUBLIC
文件集中的文件被标记为源文件。此外,HEADERS
文件集中的文件的 HEADER_FILE_ONLY
属性设置为 TRUE
。 INTERFACE
或 PUBLIC
文件集中的文件可以使用 install(TARGETS)
命令安装,并使用 install(EXPORT)
和 :command:` 导出导出命令。
每个“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
的值。此参数支持generator expressions
。一个文件集的两个基目录不能互为子目录。必须在添加到文件集的所有基本目录中满足此要求,而不仅仅是对“target_sources()”的单个调用中的那些。
FILES <文件>...
要添加到文件集中的可选文件列表。每个文件必须位于基本目录之一或基本目录之一的子目录中。此参数支持
generator expressions
。如果指定了相对路径,则在调用 target_sources() 时,它们被认为是相对于 CMAKE_CURRENT_SOURCE_DIR 的。一个例外是以
$<
开头的路径。在对生成器表达式求值后,此类路径被视为相对于目标的源目录。
以下目标属性由“target_sources(FILE_SET)”设置,但通常不应直接操作它们:
对于类型为“HEADERS”的文件集:
对于类型为“CXX_MODULES”的文件集:
CXX_MODULE_DIRS_<名称>
对于类型为“CXX_MODULE_HEADER_UNITS”的文件集:
与包含目录相关的目标属性也由 target_sources(FILE_SET)
修改如下:
如果
TYPE
是HEADERS
或CXX_MODULE_HEADER_UNITS
,并且文件集的范围是PRIVATE
或PUBLIC
,则所有的 ``BASE_DIRS``文件集包装在$<BUILD_INTERFACE>
中并附加到此属性。
如果
TYPE
是HEADERS
或CXX_MODULE_HEADER_UNITS
,并且文件集的范围是INTERFACE
或PUBLIC
,则所有的 ``BASE_DIRS``文件集包装在$<BUILD_INTERFACE>
中并附加到此属性。