Spec-Zone.ru › CMake

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API