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.
-
OBJC -
Новое в версии 3.29.
-
OBJCXX -
Новое в версии 3.29.
Для целевых объектов, которые смешивают исходные файлы из более чем одного языка, 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исходного файла не пустое, не будет объединён в единый исходный файл. - Любой исходный файл, который сканируется для исходных файлов модулей 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/v3.30/prop_tgt/UNITY_BUILD.html