| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- CMP0154
- -------
- .. versionadded:: 3.28
- Generated files are private by default in targets using :ref:`file sets`.
- CMake 3.27 and below assume that any file generated as an output or byproduct
- of :command:`add_custom_command` or :command:`add_custom_target` may be a
- public header file meant for inclusion by dependents' source files. This
- requires :ref:`Ninja Generators` to add conservative order-only dependencies
- that prevent a target's source files from compiling before custom commands
- from the target's dependencies are finished, even if those custom commands
- only produce sources private to their own target.
- :ref:`File Sets`, introduced by CMake 3.23, provide a way to express the
- visibility of generated header files. CMake 3.28 and above prefer to
- assume that, in targets using file sets, generated files are private to
- their own target by default. Generated public headers must be specified
- as members of a ``PUBLIC`` (or ``INTERFACE``) ``FILE_SET``, typically of
- type ``HEADERS``. With this information, :ref:`Ninja Generators` may omit
- the above-mentioned conservative dependencies and produce more efficient
- build graphs. Dependents to such targets may also prune dependencies to such
- targets when using the :prop_tgt:`OPTIMIZE_DEPENDENCIES` target property.
- Additionally, if the custom command's output is a member of a file set of type
- ``CXX_MODULES``, it will additionally not be required to exist before
- compiling other sources in the same target. Since these files should not be
- included at compile time directly, they may not be implicitly required to
- exist for other compilation rules.
- This policy provides compatibility for projects using file sets in targets
- with generated header files that have not been updated. Such projects
- should be updated to express generated public headers in a file set.
- For example:
- .. code-block:: cmake
- add_custom_command(
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/foo.h
- ...
- )
- target_sources(foo
- PUBLIC FILE_SET HEADERS
- BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}
- FILES ${CMAKE_CURRENT_BINARY_DIR}/foo.h
- )
- The ``OLD`` behavior for this policy is to assume generated files are
- public, even in targets using file sets, and for :ref:`Ninja Generators`
- to produce conservative build graphs. The ``NEW`` behavior for this
- policy is to assume generated files are private in targets using file sets,
- and for :ref:`Ninja Generators` to produce more efficient build graphs.
- .. |INTRODUCED_IN_CMAKE_VERSION| replace:: 3.28
- .. |WARNS_OR_DOES_NOT_WARN| replace:: does *not* warn
- .. include:: include/STANDARD_ADVICE.rst
- .. include:: include/DEPRECATED.rst
|