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 поддерживаются для следующих языков:
-
C -
Добавлено в версии 3.16.
-
CXX -
Добавлено в версии 3.16.
-
CUDA -
Добавлено в версии 3.31.
-
OBJC -
Добавлено в версии 3.29.
-
OBJCXX -
Добавлено в версии 3.29.
Для целей, включающих исходные файлы более чем на одном языке, CMake разделяет языки, поэтому каждый созданный файл unity-сборки содержит исходные файлы только на одном языке.
Значение этого свойства инициализируется значением переменной CMAKE_UNITY_BUILD при создании цели.
Примечание
Проектам не следует напрямую задавать свойству UNITY_BUILD или связанной с ним переменной CMAKE_UNITY_BUILD значение true. В зависимости от возможностей сборочной машины и используемого компилятора включение сборок Unity может быть целесообразным или нет. Поэтому управление этой возможностью должно оставаться за разработчиком. Обычно разработчик может выбрать, задавать ли переменной CMAKE_UNITY_BUILD значение true в командной строке cmake(1) или использовать другой эквивалентный способ. Однако РЕКОМЕНДУЕТСЯ задать свойству цели UNITY_BUILD значение false, если известно, что включение сборок Unity для этой цели может привести к проблемам.
Ошибки ODR (правила одного определения)
При включении нескольких исходных файлов в один файл, как это происходит при сборках Unity, могут возникнуть ошибки ODR. CMake предоставляет ряд средств, помогающих решить такие проблемы:
- Любой исходный файл с непустым свойством исходного файла
COMPILE_OPTIONS,COMPILE_DEFINITIONS,COMPILE_FLAGSилиINCLUDE_DIRECTORIESне будет включён в файл unity-сборки. -
Добавлено в версии 4.4: Любой набор файлов с непустым свойством набора файлов
COMPILE_OPTIONS,COMPILE_DEFINITIONSилиINCLUDE_DIRECTORIESне будет включён в файл unity-сборки. - Любой исходный файл, который проверяется на наличие исходных файлов модулей C++ с помощью
CXX_SCAN_FOR_MODULES,CXX_SCAN_FOR_MODULESили вследствие включения в набор файловCXX_MODULES, не будет включён в файл unity-сборки. Подробности см. в разделеcmake-cxxmodules(7). - Проекты могут исключить отдельный исходный файл из файла unity-сборки, задав для его свойства исходного файла
SKIP_UNITY_BUILD_INCLUSIONзначение true. Это может быть эффективнее для предотвращения проблем с отдельными файлами, чем отключение сборок Unity для всей цели. -
Добавлено в версии 4.4: Проекты могут исключить все исходные файлы набора файлов из файла unity-сборки, задав для свойства набора файлов
SKIP_UNITY_BUILD_INCLUSIONзначение true. Это может быть эффективнее для предотвращения проблем с отдельными файлами, чем отключение сборок Unity для всей цели. - Проекты могут задать свойство
UNITY_BUILD_UNIQUE_ID, чтобы для каждого файла в сборке Unity генерировался уникальный допустимый идентификатор C. Это можно использовать для устранения проблем, связанных с анонимными пространствами имён в сборках 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–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/prop_tgt/UNITY_BUILD.html