Spec-Zone.ru › CMake 3.30

cmake-cxxmodules(7)

Новое в версии 3.28.

C++ 20 ввёл в язык концепцию «модулей». Для надёжной работы с такими модулями система сборки должна определять порядок компиляции. Реализация в CMake просит компилятор сканировать исходные файлы на наличие зависимостей от модулей во время сборки, собирает результаты сканирования, чтобы определить ограничения по порядку, и сообщает инструменту сборки, как динамически обновлять граф сборки.

Стратегия компиляции

С C++ модулями компиляция набора C++ исходных файлов уже не является тривиально параллельной задачей. Другими словами, для компиляции любого исходного файла может потребоваться предварительная компиляция другого исходного файла, чтобы получить «CMI» (интерфейс скомпилированного модуля) или «BMI» (бинарный интерфейс модуля), используемые C++ компиляторами для удовлетворения заявок в других исходных файлах. При использовании заголовочных файлов источники могли совместно использовать свои объявления, так что любой потребитель мог компилироваться независимо. С модулями объявления теперь генерируются в эти файлы BMI компилятором во время компиляции на основе содержимого исходного файла и его заявок.

Для обеспечения необходимого порядка компиляции требуется разрешение порядка во время сборки, потому что порядок контролируется содержимым исходных файлов. Это означает, что порядок должен быть извлечён из исходного кода во время сборки, чтобы избежать повторного построения графа сборки при помощи конфигурации и генерации для каждого изменения исходного кода, чтобы получить правильную сборку.

Общая стратегия заключается в использовании «сканера» для извлечения информации о зависимостях порядка и обновлении графа сборки с новыми связями между существующими связями, используя результаты сканирования по каждому исходному файлу (представленные файлами P1689R5) и «собирая» зависимости внутри целевого модуля и модулей, созданных видимыми целевыми модулями. Основной задачей является генерация файлов «модульной карты», чтобы передать каждому правилу компиляции пути к BMI, необходимым для удовлетворения заявок. Собиратель также выполняет задачи по использованию информации, полученной во время сборки, для заполнения информации, включая правила для модульных интерфейсных единиц, их BMI и свойства для любых экспортированных целей с C++ модулями.

Примечание

CMake делает упор на правильность сборки, прежде чем рассматривать улучшения производительности. В выбранной стратегии есть известные приёмы, которые могут повысить производительность сборки. Однако они отложены до тех пор, пока у нас не будет работающей модели для сравнения. Также важно отметить, что приём, полезный в одной ситуации (например, при чистой сборке), может быть неэффективным в другой ситуации (например, при инкрементальной сборке). Поиск баланса и предоставление средств для выбора приёмов — это задача на будущее.

Управление сканированием

Сканируются ли исходные файлы на использование C++ модулей, зависит от следующих запросов. Используется первый запрос, дающий ответ «да» или «нет».

  • Если исходный файл принадлежит набору файлов типа CXX_MODULES, он будет просканирован.
  • Если целевой модуль не использует хотя бы C++ 20, он не будет просканирован.
  • Если исходный файл не на языке CXX, он не будет просканирован.
  • Если свойство исходного файла CXX_SCAN_FOR_MODULES установлено, его значение будет использовано.
  • Если свойство целевого модуля CXX_SCAN_FOR_MODULES установлено, его значение будет использовано. Установите переменную CMAKE_CXX_SCAN_FOR_MODULES, чтобы инициализировать это свойство для всех целей по мере их создания.
  • В противном случае исходный файл будет просканирован, если компилятор и генератор поддерживают сканирование. См. политику CMP0155.

Обратите внимание, что любой просканированный источник будет исключён из любой сборки единства (см. UNITY_BUILD), поскольку заявления, связанные с модулями, могут выполняться только в одном месте внутри единицы перевода C++.

Поддержка компиляторов

Компиляторы, которые CMake поддерживает для сканирования зависимостей модулей, включают:

  • MSVC инструмент 14.34 и новее (предоставляется Visual Studio 17.4 и новее)
  • LLVM/Clang 16.0 и новее
  • GCC 14 (для разрабатываемой ветки, после 2023-09-20) и новее

Поддержка import std

Поддержка import std ограничена следующими комбинациями цепочки инструментов и стандартных библиотек:

  • Clang 18.1.2 и новее с -stdlib=libc++
  • MSVC инструмент 14.36 и новее (предоставляется Visual Studio 17.6 Preview 2 и новее)

Переменная CMAKE_CXX_COMPILER_IMPORT_STD может быть использована для определения поддержки определённого уровня стандарта с активной цепочкой инструментов C++.

Примечание

Эта поддержка предоставляется только при включении экспериментальной поддержки import std; через шлюз CMAKE_EXPERIMENTAL_CXX_IMPORT_STD.

Поддержка генераторов

Список генераторов, которые поддерживают сканирование исходных файлов на C++ модули, включает:

  • Ninja
  • Ninja Multi-Config
  • Visual Studio 17 2022

Ограничения

Существует ряд известных ограничений текущей поддержки C++ модулей в CMake. Здесь не описываются известные ограничения или ошибки в компиляторах, так как они могут со временем меняться.

Для всех генераторов:

  • Заголовочные единицы не поддерживаются.
  • Нет встроенной поддержки import std; или других модулей, предоставляемых компилятором.

Для генераторов Ninja:

  • Требуется ninja 1.11 или новее.

Для Visual Studio Генераторы:

  • Только Visual Studio 2022 и MSVC инструменты 14.34 (Visual Studio 17.4) и новее.
  • Нет поддержки экспорта или установки информации BMI или модулей.
  • Нет поддержки компиляции BMI из IMPORTED целей с C++ модулями (включая import std).
  • Нет диагностики использования модулей, предоставляемых PRIVATE источниками из PUBLIC модульных источников.

© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.30/manual/cmake-cxxmodules.7.html

Spec-Zone.ru

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