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.21.0-rc3 поддерживает объединение 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_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.21/prop_tgt/UNITY_BUILD.html