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/latest/manual/cmake-cxxmodules.7.html