cmake-cxxmodules(7)
Новое в версии 3.28.
C++ 20 ввел в язык концепцию «модулей». Конструкция требует от систем сборки упорядочивать компиляции друг относительно друга, чтобы надёжно удовлетворить import заявления. Реализация CMake запрашивает у компилятора сканирование исходных файлов на предмет зависимостей модулей во время сборки, собирает результаты сканирования, чтобы вывести ограничения по порядку, и сообщает инструменту сборки, как динамически обновлять граф сборки.
Управление сканированием
Сканируются ли исходные файлы на предмет использования C++ модулей, зависит от следующих запросов. Используется первый запрос, дающий ответ «да» или «нет».
- Если исходный файл принадлежит набору файлов типа
CXX_MODULES, он будет отсканирован. - Если целевой объект не использует по крайней мере C++ 20, он не будет отсканирован.
- Если исходный файл не является языком
CXX, он не будет отсканирован. - Если свойство исходного файла
CXX_SCAN_FOR_MODULESзадано, будет использовано его значение. - Если свойство целевого объекта
CXX_SCAN_FOR_MODULESзадано, будет использовано его значение. Установите переменнуюCMAKE_CXX_SCAN_FOR_MODULES, чтобы инициализировать это свойство для всех целевых объектов при их создании. - В противном случае исходный файл будет отсканирован, если компилятор и генератор поддерживают сканирование. См. политику
CMP0155.
Обратите внимание, что любой отсканированный исходный файл будет исключён из любой сборки unity (см. UNITY_BUILD), так как операторы, связанные с модулями, могут находиться только в одном месте внутри единицы перевода C++.
Поддержка компиляторов
Компиляторы, которые CMake изначально поддерживают сканирование зависимостей модулей, включают:
- Набор инструментов MSVC 14.34 и новее (предоставляется Visual Studio 17.4 и новее)
- LLVM/Clang 16.0 и новее
- GCC 14 (для развиваемой ветки, после 2023-09-20) и новее
Поддержка генераторов
Список генераторов, которые поддерживают сканирование исходных файлов на предмет C++ модулей, включает:
Ограничения
Существует ряд известных ограничений текущей поддержки C++ модулей в CMake. Здесь не документированы известные ограничения или ошибки компиляторов, так как они могут со временем меняться.
Для всех генераторов:
- Модули заголовков не поддерживаются.
- Нет встроенной поддержки
import std;или других модулей, предоставляемых компилятором.
Для генераторов Ninja:
- Требуется
ninja1.11 или новее.
Для генераторов Visual Studio:
- Только Visual Studio 2022 и наборы инструментов MSVC 14.34 (Visual Studio 17.4) и новее.
- Отсутствует поддержка экспорта или установки BMI или информации о модулях.
- Отсутствует поддержка компиляции BMI из
IMPORTEDцелевых объектов с C++ модулями. - Отсутствует диагностика использования модулей, предоставляемых
PRIVATEисходными файлами, изPUBLICмодульных исходных файлов.
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.28/manual/cmake-cxxmodules.7.html