target_precompile_headers.rst 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. target_precompile_headers
  2. -------------------------
  3. Add a list of header files to precompile.
  4. Precompiling header files can speed up compilation by creating a partially
  5. processed version of some header files, and then using that version during
  6. compilations rather than repeatedly parsing the original headers.
  7. Main Form
  8. ^^^^^^^^^
  9. .. code-block:: cmake
  10. target_precompile_headers(<target>
  11. <INTERFACE|PUBLIC|PRIVATE> [header1...]
  12. [<INTERFACE|PUBLIC|PRIVATE> [header2...] ...])
  13. The command adds header files to the :prop_tgt:`PRECOMPILE_HEADERS` and/or
  14. :prop_tgt:`INTERFACE_PRECOMPILE_HEADERS` target properties of ``<target>``.
  15. The named ``<target>`` must have been created by a command such as
  16. :command:`add_executable` or :command:`add_library` and must not be an
  17. :ref:`ALIAS target <Alias Targets>`.
  18. The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
  19. specify the scope of the following arguments. ``PRIVATE`` and ``PUBLIC``
  20. items will populate the :prop_tgt:`PRECOMPILE_HEADERS` property of
  21. ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
  22. :prop_tgt:`INTERFACE_PRECOMPILE_HEADERS` property of ``<target>``
  23. (:ref:`IMPORTED targets <Imported Targets>` only support ``INTERFACE`` items).
  24. Repeated calls for the same ``<target>`` will append items in the order called.
  25. Projects should generally avoid using ``PUBLIC`` or ``INTERFACE`` for targets
  26. that will be :ref:`exported <install(EXPORT)>`, or they should at least use
  27. the ``$<BUILD_INTERFACE:...>`` generator expression to prevent precompile
  28. headers from appearing in an installed exported target. Consumers of a target
  29. should typically be in control of what precompile headers they use, not have
  30. precompile headers forced on them by the targets being consumed (since
  31. precompile headers are not typically usage requirements). A notable exception
  32. to this is where an :ref:`interface library <Interface Libraries>` is created
  33. to define a commonly used set of precompile headers in one place and then other
  34. targets link to that interface library privately. In this case, the interface
  35. library exists specifically to propagate the precompile headers to its
  36. consumers and the consumer is effectively still in control, since it decides
  37. whether to link to the interface library or not.
  38. The list of header files is used to generate a header file named
  39. ``cmake_pch.h|xx`` which is used to generate the precompiled header file
  40. (``.pch``, ``.gch``, ``.pchi``) artifact. The ``cmake_pch.h|xx`` header
  41. file will be force included (``-include`` for GCC, ``/FI`` for MSVC) to
  42. all source files, so sources do not need to have ``#include "pch.h"``.
  43. Header file names specified with angle brackets (e.g. ``<unordered_map>``) or
  44. explicit double quotes (escaped for the :manual:`cmake-language(7)`,
  45. e.g. ``[["other_header.h"]]``) will be treated as is, and include directories
  46. must be available for the compiler to find them. Other header file names
  47. (e.g. ``project_header.h``) are interpreted as being relative to the current
  48. source directory (e.g. :variable:`CMAKE_CURRENT_SOURCE_DIR`) and will be
  49. included by absolute path.
  50. Arguments to ``target_precompile_headers()`` may use "generator expressions"
  51. with the syntax ``$<...>``.
  52. See the :manual:`cmake-generator-expressions(7)` manual for available
  53. expressions. See the :manual:`cmake-compile-features(7)` manual for
  54. information on compile features and a list of supported compilers.
  55. The ``$<COMPILE_LANGUAGE:...>`` generator expression is particularly
  56. useful for specifying a language-specific header to precompile for
  57. only one language (e.g. ``CXX`` and not ``C``). For example:
  58. .. code-block:: cmake
  59. target_precompile_headers(myTarget
  60. PUBLIC
  61. project_header.h
  62. "$<$<COMPILE_LANGUAGE:CXX>:cxx_only.h>"
  63. PRIVATE
  64. [["other_header.h"]]
  65. <unordered_map>
  66. )
  67. When specifying angle brackets inside a :manual:`generator expression
  68. <cmake-generator-expressions(7)>`, be sure to encode the closing ``>``
  69. as ``$<ANGLE-R>``. For example:
  70. .. code-block:: cmake
  71. target_precompile_headers(mylib PRIVATE
  72. "$<$<COMPILE_LANGUAGE:C>:<stddef.h$<ANGLE-R>>"
  73. "$<$<COMPILE_LANGUAGE:CXX>:<cstddef$<ANGLE-R>>"
  74. )
  75. Reusing Precompile Headers
  76. ^^^^^^^^^^^^^^^^^^^^^^^^^^
  77. The command also supports a second signature which can be used to specify that
  78. one target re-uses a precompiled header file artefact from another target
  79. instead of generating its own:
  80. .. code-block:: cmake
  81. target_precompile_headers(<target> REUSE_FROM <other_target>)
  82. This form sets the :prop_tgt:`PRECOMPILE_HEADERS_REUSE_FROM` property to
  83. ``<other_target>`` and adds a dependency such that ``<target>`` will depend
  84. on ``<other_target>``. CMake will halt with an error if the
  85. :prop_tgt:`PRECOMPILE_HEADERS` property of ``<target>`` is already set when
  86. the ``REUSE_FROM`` form is used.
  87. .. note::
  88. The ``REUSE_FROM`` form requires the same set of compiler options,
  89. compiler flags and compiler definitions for both ``<target>`` and
  90. ``<other_target>``. Some compilers (e.g. GCC) may issue a warning if the
  91. precompiled header file cannot be used (``-Winvalid-pch``).
  92. See Also
  93. ^^^^^^^^
  94. To disable precompile headers for specific targets, see the
  95. :prop_tgt:`DISABLE_PRECOMPILE_HEADERS` target property.
  96. To prevent precompile headers from being used when compiling a specific
  97. source file, see the :prop_sf:`SKIP_PRECOMPILE_HEADERS` source file property.