| target_sources | |
| -------------- | |
| .. versionadded:: 3.1 | |
| Add sources to a target. | |
| .. code-block:: cmake | |
| 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 | |
| :command:`add_executable` or :command:`add_library` or | |
| :command:`add_custom_target` and must not be an | |
| :ref:`ALIAS target <Alias Targets>`. The ``<items>`` may use | |
| :manual:`generator expressions <cmake-generator-expressions(7)>`. | |
| .. versionadded:: 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 :prop_tgt:`SOURCES` | |
| property of ``<target>``, which are used when building the target itself. | |
| ``PUBLIC`` and ``INTERFACE`` items will populate the | |
| :prop_tgt:`INTERFACE_SOURCES` property of ``<target>``, which are used | |
| when building dependents. A target created by :command:`add_custom_target` | |
| can only have ``PRIVATE`` scope. | |
| Repeated calls for the same ``<target>`` append items in the order called. | |
| .. versionadded:: 3.3 | |
| Allow exporting targets with :prop_tgt:`INTERFACE_SOURCES`. | |
| .. versionadded:: 3.11 | |
| Allow setting ``INTERFACE`` items on | |
| :ref:`IMPORTED targets <Imported Targets>`. | |
| .. versionchanged:: 3.13 | |
| Relative source file paths are interpreted as being relative to the current | |
| source directory (i.e. :variable:`CMAKE_CURRENT_SOURCE_DIR`). | |
| See policy :policy:`CMP0076`. | |
| A path that begins with a generator expression is left unmodified. | |
| When a target's :prop_tgt:`SOURCE_DIR` property differs from | |
| :variable:`CMAKE_CURRENT_SOURCE_DIR`, use absolute paths in generator | |
| expressions to ensure the sources are correctly assigned to the target. | |
| .. code-block:: cmake | |
| # 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 :manual:`cmake-buildsystem(7)` manual for more on defining | |
| buildsystem properties. | |
| File Sets | |
| ^^^^^^^^^ | |
| .. versionadded:: 3.23 | |
| .. code-block:: cmake | |
| 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 only acceptable type is ``HEADERS``. The | |
| optional default file sets are named after their type. The target may not be a | |
| custom target or :prop_tgt:`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 :prop_sf:`HEADER_FILE_ONLY` property set to ``TRUE``. Files in an | |
| ``INTERFACE`` or ``PUBLIC`` file set can be installed with the | |
| :command:`install(TARGETS)` command, and exported with the | |
| :command:`install(EXPORT)` and :command:`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 name is | |
| ``HEADERS``. 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. ``HEADERS`` | |
| is 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. :variable:`CMAKE_CURRENT_SOURCE_DIR`). If no ``BASE_DIRS`` are | |
| specified when the file set is first created, the value of | |
| :variable:`CMAKE_CURRENT_SOURCE_DIR` is added. This argument supports | |
| :manual:`generator expressions <cmake-generator-expressions(7)>`. | |
| 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 | |
| :manual:`generator expressions <cmake-generator-expressions(7)>`. | |
| If relative paths are specified, they are considered relative to | |
| :variable:`CMAKE_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: | |
| * :prop_tgt:`HEADER_SETS` | |
| * :prop_tgt:`INTERFACE_HEADER_SETS` | |
| * :prop_tgt:`HEADER_SET` | |
| * :prop_tgt:`HEADER_SET_<NAME>` | |
| * :prop_tgt:`HEADER_DIRS` | |
| * :prop_tgt:`HEADER_DIRS_<NAME>` | |
| Target properties related to include directories are also modified by | |
| ``target_sources(FILE_SET)`` as follows: | |
| :prop_tgt:`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 | |
| :genex:`$<BUILD_INTERFACE>` and appended to this property. | |
| :prop_tgt:`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 :genex:`$<BUILD_INTERFACE>` and appended to this property. |