Spec-Zone.ru › CMake 3.29

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 поддерживаются для следующих языков:

C

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

CXX

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

OBJC

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

OBJCXX

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

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

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

Примечание

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

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

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

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

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

Spec-Zone.ru

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