cmake-cxxmodules(7)
Добавлен в версии 3.28.
C++ 20 ввёл в язык концепцию «модулей». Для надёжной работы с конструкцией требуются системы сборки, которые обеспечивают порядок компиляций, удовлетворяющий import утверждениям. Реализация CMake просит компилятор сканировать исходные файлы на наличие зависимостей модулей во время сборки, собирает результаты сканирования, чтобы вывести ограничения по порядку, и указывает инструменту сборки, как динамически обновлять граф сборки.
Стратегия компиляции
С C++ модулями компиляция набора C++ источников уже не является тривиально параллельной. То есть, для любого заданного источника может потребоваться предварительная компиляция другого исходного файла, чтобы предоставить «CMI» (интерфейс скомпилированного модуля) или «BMI» (бинарный интерфейс модуля), которые C++ компиляторы используют для удовлетворения import утверждений в других источниках. С заголовками источники могли делиться своими объявлениями, так что любые потребители могли компилироваться независимо. С модулями объявления теперь генерируются в эти файлы BMI компилятором во время компиляции на основе содержимого исходного файла и его export утверждений.
Для необходимой последовательности компиляции требуется разрешение порядка во время сборки, поскольку порядок контролируется содержимым источников. Это означает, что порядок необходимо извлечь из источника во время сборки, чтобы избежать повторного построения графа сборки через фазу конфигурации и генерации для каждого изменения источника, чтобы получить правильную сборку.
Общая стратегия заключается в использовании «сканера» для извлечения информации о зависимостях порядка и обновлении графа сборки новыми связями между существующими связями, взяв результаты сканирования по каждому источнику (представленные файлами P1689R5) и «сводя» зависимости внутри целевого объекта и модулей, производимых видимыми целевыми объектами. Основная задача — сгенерировать файлы «модульной карты», чтобы передать каждой команде компиляции пути к BMI, необходимые для удовлетворения import утверждений. Коллектор также выполняет задачи использования информации времени сборки для заполнения информации, включая install правила для модульных интерфейсных единиц, их 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++ модулей, включает:
Ограничения
Существует ряд известных ограничений текущей поддержки C++ модулей в CMake. В данном документе не описаны известные ограничения или ошибки в компиляторах, так как они могут со временем меняться.
Для всех генераторов:
- Единицы заголовков не поддерживаются.
- Нет встроенной поддержки
import std;или других модулей, предоставляемых компилятором.
Для генераторов Ninja:
- Необходима версия
ninja1.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.31/manual/cmake-cxxmodules.7.html