Spec-Zone.ru › CMake 3.20

UNITY_BUILD

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

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

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

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

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

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

Это свойство инициализируется значением переменной 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 не будет объединён в единый исходный файл.
  • Проекты могут предотвратить объединение отдельного исходного файла в единый исходный файл, установив для него свойство SKIP_UNITY_BUILD_INCLUSION в значение true. Это может быть более эффективным способом предотвращения проблем со специфическими файлами, чем отключение сборок Unity для всего целевого объекта.
  • Проекты могут установить UNITY_BUILD_UNIQUE_ID, чтобы сгенерировать уникальный C-идентификатор для каждого файла в сборке Unity. Это можно использовать для предотвращения проблем с анонимными именованными пространствами в сборках Unity.
  • Свойства целевого объекта UNITY_BUILD_CODE_BEFORE_INCLUDE и UNITY_BUILD_CODE_AFTER_INCLUDE могут быть использованы для вставки кода в единые исходные файлы до и после каждой #include директивы.
  • Порядок исходных файлов, добавленных в целевой объект с помощью команд, таких как add_library(), add_executable() или target_sources(), будет сохранён в сгенерированных единых исходных файлах. Это можно использовать для ручного обеспечения специфической группировки, основываясь на свойстве целевого объекта UNITY_BUILD_BATCH_SIZE.

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

Spec-Zone.ru

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