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