target_sources — CMake 3.24.4 Documentation (original) (raw)

New in version 3.1.

Add sources to a target.

target_sources( <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 asadd_executable() or add_library() oradd_custom_target() and must not be anALIAS target. The <items> may usegenerator 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 SOURCESproperty of <target>, which are used when building the target itself.PUBLIC and INTERFACE items will populate theINTERFACE_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.11: Allow setting INTERFACE items onIMPORTED 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 fromCMAKE_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( [<INTERFACE|PUBLIC|PRIVATE> [FILE_SET [TYPE ] [BASE_DIRS ...] [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 ofINTERFACE, 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. 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 anINTERFACE or PUBLIC file set can be installed with theinstall(TARGETS) command, and exported with theinstall(EXPORT) and export() commands.

Each target_sources(FILE_SET) entry starts with INTERFACE, PUBLIC, orPRIVATE 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 name isHEADERS. 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. HEADERSis currently the only defined type and it is an error to specify anything else. As a special case, if the name of the file set is HEADERS, 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 no BASE_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 supportsgenerator expressions.

If relative paths are specified, they are considered relative toCMAKE_CURRENT_SOURCE_DIR at the time target_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:

Target properties related to include directories are also modified bytarget_sources(FILE_SET) as follows:

INCLUDE_DIRECTORIES

If the TYPE is HEADERS, and the scope of the file set is PRIVATEor 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 isINTERFACE or PUBLIC, all of the BASE_DIRS of the file set are wrapped in $<BUILD_INTERFACE> and appended to this property.