Spec-Zone.ru › CMake 3.18

target_precompile_headers

Добавить список файлов заголовков для предварительной компиляции.

Предварительная компиляция файлов заголовков может ускорить компиляцию, создавая частично обработанную версию некоторых файлов заголовков и затем используя эту версию во время компиляции вместо многократного разбора исходных заголовков.

Основная форма

target_precompile_headers(<target>
  <INTERFACE|PUBLIC|PRIVATE> [header1...]
  [<INTERFACE|PUBLIC|PRIVATE> [header2...] ...])

Команда добавляет файлы заголовков в свойства цели PRECOMPILE_HEADERS и/или INTERFACE_PRECOMPILE_HEADERS цели <target>. Указанная <target> должна быть создана командой, такой как add_executable() или add_library(), и не должна быть целевой ALIAS-целью.

Ключевые слова INTERFACE, PUBLIC и PRIVATE необходимы для указания области действия следующих аргументов. PRIVATE и PUBLIC элементы заполнят свойство PRECOMPILE_HEADERS цели <target>. PUBLIC и INTERFACE элементы заполнят свойство INTERFACE_PRECOMPILE_HEADERS цели <target> (только импортированные цели поддерживают INTERFACE элементы). Повторные вызовы для той же <target> добавятся в порядке вызова.

Проекты обычно должны избегать использования PUBLIC или INTERFACE для целей, которые будут экспортированы, или по крайней мере использовать выражение генератора $<BUILD_INTERFACE:...>, чтобы предотвратить появление предварительно скомпилированных заголовков в экспортируемой установленной цели. Потребители цели обычно должны контролировать, какие предварительно скомпилированные заголовки они используют, а не иметь предварительно скомпилированные заголовки, навязанные им потребляемыми целями (поскольку предварительно скомпилированные заголовки обычно не являются требованиями к использованию). Заметное исключение из этого — случай, когда создана интерфейсная библиотека для определения набора часто используемых предварительно скомпилированных заголовков в одном месте, а затем другие цели связываются с этой интерфейсной библиотекой в частном порядке. В этом случае интерфейсная библиотека существует специально для распространения предварительно скомпилированных заголовков своим потребителям, и потребитель по-прежнему контролирует ситуацию, поскольку он решает, связываться ли с интерфейсной библиотекой или нет.

Список файлов заголовков используется для генерации файла заголовков, названного cmake_pch.h|xx, который используется для генерации предварительно скомпилированного файла заголовка (.pch, .gch, .pchi) артефакта. Файл заголовков cmake_pch.h|xx будет принудительно включён (-include для GCC, /FI для MSVC) во все исходные файлы, поэтому исходные файлы не нуждаются в #include "pch.h".

Имена файлов заголовков, указанные в угловых скобках (например, <unordered_map>) или явных двойных кавычках (экранированных для cmake-language(7), например, [["other_header.h"]]) будут обработаны как есть, и каталоги включения должны быть доступны для поиска компилятором. Другие имена файлов заголовков (например, project_header.h) интерпретируются как относительные к текущей директории исходных кодов (например, CMAKE_CURRENT_SOURCE_DIR) и будут включены с абсолютным путем. Например:

target_precompile_headers(myTarget
  PUBLIC
    project_header.h
  PRIVATE
    [["other_header.h"]]
    <unordered_map>
)

Аргументы для target_precompile_headers() могут использовать «выражения генератора» с синтаксисом $<...>. См. руководство cmake-generator-expressions(7) для доступных выражений. Выражение генератора $<COMPILE_LANGUAGE:...> особенно полезно для указания языка-специфичного заголовка для предварительной компиляции только для одного языка (например, CXX, а не C). В этом случае имена файлов заголовков, не указанные явно в двойных кавычках или угловых скобках, должны быть указаны с абсолютным путем. Также, при указании угловых скобок внутри выражения генератора, убедитесь, что вы закодировали закрывающую > как $<ANGLE-R>. Например:

target_precompile_headers(mylib PRIVATE
  "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/cxx_only.h>"
  "$<$<COMPILE_LANGUAGE:C>:<stddef.h$<ANGLE-R>>"
  "$<$<COMPILE_LANGUAGE:CXX>:<cstddef$<ANGLE-R>>"
)

Использование повторно предварительно скомпилированных заголовков

Команда также поддерживает вторую подпись, которая может использоваться для указания того, что одна цель повторно использует артефакт предварительно скомпилированного файла заголовка из другой цели вместо генерации своего собственного:

target_precompile_headers(<target> REUSE_FROM <other_target>)

Эта форма устанавливает свойство PRECOMPILE_HEADERS_REUSE_FROM в значение <other_target> и добавляет зависимость, так что <target> будет зависеть от <other_target>. CMake остановится с ошибкой, если свойство PRECOMPILE_HEADERS цели <target> уже установлено при использовании формы REUSE_FROM.

Примечание

Форма REUSE_FROM требует одного и того же набора параметров компилятора, флагов компилятора и определений компилятора для <target> и <other_target>. Некоторые компиляторы (например, GCC) могут выдать предупреждение, если предварительно скомпилированный файл заголовков нельзя использовать (-Winvalid-pch).

См. также

Чтобы отключить предварительно скомпилированные заголовки для определенных целей, см. свойство цели DISABLE_PRECOMPILE_HEADERS.

Чтобы предотвратить использование предварительно скомпилированных заголовков при компиляции определенного исходного файла, см. свойство исходного файла SKIP_PRECOMPILE_HEADERS.

© 2000–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.18/command/target_precompile_headers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API