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.
-
CUDA -
Добавлена в версии 3.31.
-
OBJC -
Добавлена в версии 3.29.
-
OBJCXX -
Добавлена в версии 3.29.
Для целевых объектов, которые смешивают исходные файлы из более чем одного языка, CMake разделяет языки таким образом, что каждый сгенерированный унифицированный исходный файл содержит только источники одного языка.
Это свойство инициализируется значением переменной CMAKE_UNITY_BUILD при создании целевого объекта.
Примечание
Проекты не должны напрямую устанавливать свойство UNITY_BUILD или связанную переменную CMAKE_UNITY_BUILD в значение true. В зависимости от возможностей вычислительной машины и используемого компилятора, включение сборки Unity может быть или не быть целесообразным. Поэтому эта функция должна контролироваться разработчиком, который обычно выбирает, включить или выключить сборку Unity, установив переменную CMAKE_UNITY_BUILD в командной строке cmake(1) или каким-либо другим эквивалентным методом. Однако рекомендуется установить свойство целевого объекта UNITY_BUILD в значение false, если известно, что включение сборки Unity для целевого объекта может привести к проблемам.
ODR (правило одной дефиниции) ошибки
Когда несколько исходных файлов включаются в один исходный файл, как это делается для сборок Unity, это может потенциально привести к ошибкам 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 для всего целевого объекта. - Проекты могут установить
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–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/prop_tgt/UNITY_BUILD.html