target_precompile_headers.rst 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. For example:
  50. .. code-block:: cmake
  51. target_precompile_headers(myTarget
  52. PUBLIC
  53. project_header.h
  54. PRIVATE
  55. [["other_header.h"]]
  56. <unordered_map>
  57. )
  58. Arguments to ``target_precompile_headers()`` may use "generator expressions"
  59. with the syntax ``$<...>``.
  60. See the :manual:`cmake-generator-expressions(7)` manual for available
  61. expressions.
  62. The ``$<COMPILE_LANGUAGE:...>`` generator expression is particularly
  63. useful for specifying a language-specific header to precompile for
  64. only one language (e.g. ``CXX`` and not ``C``). In this case, header
  65. file names that are not explicitly in double quotes or angle brackets
  66. must be specified by absolute path. Also, when specifying angle brackets
  67. inside a generator expression, be sure to encode the closing ``>`` as
  68. ``$<ANGLE-R>``. For example:
  69. .. code-block:: cmake
  70. target_precompile_headers(mylib PRIVATE
  71. "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/cxx_only.h>"
  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.