target_precompile_headers
Новое в версии 3.16.
Добавляет список файлов заголовков для предварительной компиляции.
Предварительная компиляция файлов заголовков может ускорить компиляцию, создавая частично обработанную версию некоторых файлов заголовков, а затем используя эту версию во время компиляций вместо многократного анализа исходных заголовков.
Основная форма
target_precompile_headers(<target> <INTERFACE|PUBLIC|PRIVATE> [header1...] [<INTERFACE|PUBLIC|PRIVATE> [header2...] ...])
Команда добавляет файлы заголовков в свойства цели PRECOMPILE_HEADERS и/или INTERFACE_PRECOMPILE_HEADERS цели <target>. Названная <target> должна быть создана командой, такой как add_executable() или add_library(), и не должна быть целью-псевдонимом.
Ключевые слова 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_compile_features могут использовать выражения генератора в формате $<...>. См. руководство по 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. target_compile_definitions()target_compile_features()target_compile_options()target_include_directories()target_link_libraries()target_link_directories()target_link_options()target_sources()
© 2000–2023 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.26/command/target_precompile_headers.html