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 "$<$<CONFIG:Debug>:dbgsrc.cpp>")

# CORRECT: absolute path used inside the generator expression
target_sources(MyTarget "$<$<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 set1 [TYPE type1] [BASE_DIRS dirs1...] [FILES files1...]
  [<INTERFACE|PUBLIC|PRIVATE> FILE_SET set2 [TYPE type2] [BASE_DIRS dirs2...] [FILES files2...])

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 only acceptable type is HEADERS. The optional default file sets are named after their type.

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>

A string representing the name of the file set to create or add to. This must not start with a capital letter, unless its name is HEADERS.

TYPE <type>

A string representing the type of the file set. The only acceptable value is HEADERS. This may be omitted if the name of the file set is HEADERS.

BASE_DIRS <dirs>

An optional list of strings representing the base directories of the file set. This argument supports generator expressions. No two BASE_DIRS may be sub-directories of each other. If no BASE_DIRS are specified when the file set is first created, the value of CMAKE_CURRENT_SOURCE_DIR is added.

FILES <files>

An optional list of strings representing files in the file set. Each file must be in one of the BASE_DIRS. This argument supports generator expressions. If relative paths are specified, they are considered relative to CMAKE_CURRENT_SOURCE_DIR at the time target_sources() is called, unless they start with $<, in which case they are computed relative to the target's source directory after genex evaluation.

The following target properties are set by target_sources(FILE_SET):

HEADER_SETS

List of PRIVATE and PUBLIC header sets associated with a target. Headers listed in these header sets are treated as source files for the purposes of IDE integration, and have their HEADER_FILE_ONLY property set to TRUE.

INTERFACE_HEADER_SETS

List of INTERFACE and PUBLIC header sets associated with a target. Headers listed in these header sets can be installed with install(TARGETS) and exported with install(EXPORT) and export().

HEADER_SET

Headers in the default header set associated with a target. This property supports generator expressions.

HEADER_SET_<NAME>

Headers in the named header set <NAME> associated with a target. This property supports generator expressions.

HEADER_DIRS

Base directories of the default header set associated with a target. This property supports generator expressions.

HEADER_DIRS_<NAME>

Base directories of the header set <NAME> associated with a target. This property supports generator expressions.

INCLUDE_DIRECTORIES

If the TYPE is HEADERS, and the scope of the file set is PRIVATE or PUBLIC, all of the BASE_DIRS of the file set are wrapped in $<BUILD_INTERFACE> and appended to this property.

INTERFACE_INCLUDE_DIRECTORIES

If the TYPE is HEADERS, and the scope of the file set is INTERFACE or PUBLIC, all of the BASE_DIRS of the file set are wrapped in $<BUILD_INTERFACE> and appended to this property.