UNITY_BUILD
При установке этого свойства в значение 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.18.4 поддерживает объединение C и CXX исходных файлов. Для целевых объектов, которые смешивают исходные файлы из более чем одного языка, CMake будет разделять языки таким образом, чтобы каждый созданный единый исходный файл содержал только источники одного языка.
Это свойство инициализируется значением переменной CMAKE_UNITY_BUILD при создании целевого объекта.
Примечание
Проекты не должны напрямую устанавливать свойство UNITY_BUILD или связанную с ним переменную CMAKE_UNITY_BUILD в значение true. В зависимости от возможностей машины сборки и используемого компилятора, включение сборки 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_CODE_BEFORE_INCLUDEиUNITY_BUILD_CODE_AFTER_INCLUDEмогут использоваться для вставки кода в единые исходные файлы до и после каждой#includeинструкции. - Порядок исходных файлов, добавленных в целевой объект с помощью команд, таких как
add_library(),add_executable()илиtarget_sources(), сохранится в созданных единых исходных файлах. Это можно использовать для ручного обеспечения конкретной группировки на основе свойства целевого объектаUNITY_BUILD_BATCH_SIZE.
© 2000–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.18/prop_tgt/UNITY_BUILD.html