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.24.2 поддерживает объединение 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–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.24/prop_tgt/UNITY_BUILD.html