target_sources¶
New in version 3.1.
Add sources to a target.
target_sources(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
Specifies sources to use when building a target and/or its dependents.
The named <target>
must have been created by a command such as
add_executable()
or add_library()
or
add_custom_target()
and must not be an
ALIAS target. The <items>
may use
generator expressions
.
New in version 3.20: <target>
can be a custom target.
The INTERFACE
, PUBLIC
and PRIVATE
keywords are required to
specify the scope of the source file paths
(<items>
) that follow them. PRIVATE
and PUBLIC
items will
populate the SOURCES
property of <target>
, which are used when
building the target itself. PUBLIC
and INTERFACE
items will populate the
INTERFACE_SOURCES
property of <target>
, which are used
when building dependents. A target created by add_custom_target()
can only have PRIVATE
scope.
Repeated calls for the same <target>
append items in the order called.
New in version 3.3: Allow exporting targets with INTERFACE_SOURCES
.
New in version 3.11: Allow setting INTERFACE
items on
IMPORTED targets.
Changed in version 3.13: Relative source file paths are interpreted as being relative to the current
source directory (i.e. CMAKE_CURRENT_SOURCE_DIR
).
See policy CMP0076
.
A path that begins with a generator expression is left unmodified.
When a target's SOURCE_DIR
property differs from
CMAKE_CURRENT_SOURCE_DIR
, use absolute paths in generator
expressions to ensure the sources are correctly assigned to the target.
# 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>")
See the cmake-buildsystem(7)
manual for more on defining
buildsystem properties.
File Sets¶
New in version 3.23.
target_sources(<target>
[<INTERFACE|PUBLIC|PRIVATE>
[FILE_SET <set> [TYPE <type>] [BASE_DIRS <dirs>...] [FILES <files>...]]...
]...)
Adds a file set to a target, or adds files to an existing file set. Targets
have zero or more named file sets. Each file set has a name, a type, a scope of
INTERFACE
, PUBLIC
, or PRIVATE
, one or more base directories, and
files within those directories. The acceptable types include:
HEADERS
Sources intended to be used via a language's
#include
mechanism.
CXX_MODULES
New in version 3.28.
Sources which contain C++ interface module or partition units (i.e., those using the
export
keyword). This file set type may not have anINTERFACE
scope except onIMPORTED
targets.
The optional default file sets are named after their type. The target may not
be a custom target or FRAMEWORK
target.
Files in a PRIVATE
or PUBLIC
file set are marked as source files for
the purposes of IDE integration. Additionally, files in HEADERS
file sets
have their HEADER_FILE_ONLY
property set to TRUE
. Files in an
INTERFACE
or PUBLIC
file set can be installed with the
install(TARGETS)
command, and exported with the
install(EXPORT)
and export()
commands.
Each target_sources(FILE_SET)
entry starts with INTERFACE
, PUBLIC
, or
PRIVATE
and accepts the following arguments:
FILE_SET <set>
The name of the file set to create or add to. It must contain only letters, numbers and underscores. Names starting with a capital letter are reserved for built-in file sets predefined by CMake. The only predefined set names are those matching the acceptable types. All other set names must not start with a capital letter or underscore.
TYPE <type>
Every file set is associated with a particular type of file. Only types specified above may be used and it is an error to specify anything else. As a special case, if the name of the file set is one of the types, the type does not need to be specified and the
TYPE <type>
arguments can be omitted. For all other file set names,TYPE
is required.
BASE_DIRS <dirs>...
An optional list of base directories of the file set. Any relative path is treated as relative to the current source directory (i.e.
CMAKE_CURRENT_SOURCE_DIR
). If noBASE_DIRS
are specified when the file set is first created, the value ofCMAKE_CURRENT_SOURCE_DIR
is added. This argument supportsgenerator expressions
.No two base directories for a file set may be sub-directories of each other. This requirement must be met across all base directories added to a file set, not just those within a single call to
target_sources()
.
FILES <files>...
An optional list of files to add to the file set. Each file must be in one of the base directories, or a subdirectory of one of the base directories. This argument supports
generator expressions
.If relative paths are specified, they are considered relative to
CMAKE_CURRENT_SOURCE_DIR
at the timetarget_sources()
is called. An exception to this is a path starting with$<
. Such paths are treated as relative to the target's source directory after evaluation of generator expressions.
The following target properties are set by target_sources(FILE_SET)
,
but they should not generally be manipulated directly:
For file sets of type HEADERS
:
For file sets of type CXX_MODULES
:
Target properties related to include directories are also modified by
target_sources(FILE_SET)
as follows:
If the
TYPE
isHEADERS
, and the scope of the file set isPRIVATE
orPUBLIC
, all of theBASE_DIRS
of the file set are wrapped in$<BUILD_INTERFACE>
and appended to this property.
If the
TYPE
isHEADERS
, and the scope of the file set isINTERFACE
orPUBLIC
, all of theBASE_DIRS
of the file set are wrapped in$<BUILD_INTERFACE>
and appended to this property.