Spec-Zone.ru › CMake 3.27

UNITY_BUILD

Новое в версии 3.16.

При установке этого свойства в значение true, целевые исходные файлы будут объединены в пакеты для более быстрого компиляции. Это делается путём создания (набора) источников unity, #include исходных источников, а затем компиляции этих источников unity вместо оригинальных. Это известно как сборка Unity или Jumbo.

CMake предоставляет различные алгоритмы для выбора источников, которые будут сгруппированы вместе в пакет. Выбор алгоритма определяется свойством целевого объекта UNITY_BUILD_MODE, имеющим следующие допустимые значения:

  • BATCH В этом режиме CMake определяет, какие файлы будут сгруппированы вместе. Свойство UNITY_BUILD_BATCH_SIZE контролирует верхний предел количества источников, которые могут быть объединены в один файл unity.
  • GROUP В этом режиме каждый целевой объект явно указывает, как сгруппировать исходные файлы. Все исходные файлы, имеющие одинаковое значение свойства UNITY_GROUP, будут сгруппированы вместе. Любые источники, у которых нет этого свойства, будут компилироваться по отдельности. Свойство UNITY_BUILD_BATCH_SIZE игнорируется при использовании этого режима.

Если явно не задано свойство UNITY_BUILD_MODE, CMake по умолчанию будет использовать BATCH.

Сборки Unity в настоящее время не поддерживаются для всех языков. Версия CMake 3.27.9 поддерживает объединение C и CXX исходных файлов. Для целевых объектов, которые смешивают исходные файлы из более чем одного языка, CMake будет разделять языки таким образом, чтобы каждый сгенерированный файл unity содержал источники только одного языка.

Это свойство инициализируется значением переменной CMAKE_UNITY_BUILD при создании целевого объекта.

Примечание

Проекты не должны напрямую устанавливать свойство UNITY_BUILD или связанную с ним переменную CMAKE_UNITY_BUILD в значение true. В зависимости от возможностей машины сборки и используемого компилятора, включение сборок unity может быть или не быть уместным. Поэтому эта функция должна находиться под контролем разработчика, который обычно решает, включать или нет сборки unity, установив переменную CMAKE_UNITY_BUILD в командной строке cmake(1) или каким-либо другим эквивалентным методом. Однако рекомендуется установить свойство целевого объекта UNITY_BUILD в значение false, если известно, что включение сборок unity для целевого объекта может привести к проблемам.

ODR (правило одной дефиниции) ошибки

Когда несколько исходных файлов включаются в один исходный файл, как это делается при сборках unity, это потенциально может привести к ошибкам ODR. CMake предоставляет ряд мер для решения таких проблем:

  • Любой исходный файл, имеющий непустое свойство COMPILE_OPTIONS, COMPILE_DEFINITIONS, COMPILE_FLAGS или INCLUDE_DIRECTORIES, не будет объединён в источник unity.
  • Проекты могут предотвратить объединение отдельного исходного файла в источник unity, установив его свойство SKIP_UNITY_BUILD_INCLUSION в значение true. Это может быть более эффективным способом предотвращения проблем со специфическими файлами, чем отключение сборок unity для всего целевого объекта.
  • Проекты могут установить UNITY_BUILD_UNIQUE_ID, чтобы сгенерировать допустимый C-идентификатор, уникальный для каждого файла в сборке unity. Это может быть использовано для предотвращения проблем с анонимными именованными пространствами в сборках unity.
  • Свойства целевого объекта UNITY_BUILD_CODE_BEFORE_INCLUDE и UNITY_BUILD_CODE_AFTER_INCLUDE могут быть использованы для вставки кода в файлы unity перед и после каждого #include оператора.
  • Порядок добавления исходных файлов в целевой объект с помощью команд, таких как add_library(), add_executable() или target_sources(), будет сохранён в сгенерированных файлах unity. Это можно использовать для ручного задания группировки на основе свойства целевого объекта UNITY_BUILD_BATCH_SIZE.

© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.27/prop_tgt/UNITY_BUILD.html

Spec-Zone.ru

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