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.19.0-rc3 поддерживает объединение C и CXX исходных файлов. Для целевых объектов, которые смешивают исходные файлы из более чем одного языка, CMake будет разделять языки таким образом, что каждый сгенерированный файл unity будет содержать исходные файлы только для одного языка.
Это свойство инициализируется значением переменной 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, не будет объединен в исходный файл unity. - Проекты могут предотвратить объединение отдельного исходного файла в исходный файл unity, установив его свойство
SKIP_UNITY_BUILD_INCLUSIONв значение true. Это может быть более эффективным способом предотвращения проблем со специфическими файлами, чем отключение сборок 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–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.19/prop_tgt/UNITY_BUILD.html