3.23.1 Модульный маппер
Модульный маппер предоставляет сервер или файл, к которому компилятор обращается для определения соответствия между именами модулей и файлами CMI. Он также используется для построения CMI по запросу. Функциональность маппера находится на ранней стадии разработки и предназначена для экспериментов с взаимодействием систем сборки.
Вы можете указать маппер с помощью опции -fmodule-mapper=val или переменной окружения CXX_MODULE_MAPPER. Значение может иметь один из следующих форматов:
[hostname]:port[?ident]-
Необязательное имя хоста и числовой номер порта для подключения. Если имя хоста опущено, используется адрес петли обратной связи. Если имя хоста соответствует нескольким IPV6 адресам, они будут перепробованы по очереди, пока не будет достигнут успех. Если у вашего хоста отсутствует IPv6, этот формат не будет работать. Если вам необходимо использовать IPv4, используйте -fmodule-mapper='|ncat ipv4host port'.
=socket[?ident]-
Локальный сокет домена. Если у вашего хоста отсутствуют локальные сокеты домена, этот формат не будет работать.
|program[?ident] [args...]-
Программа для запуска и взаимодействия с ней через потоки stdin/stdout. Ваша переменная окружения PATH будет проверена на наличие программы. Аргументы разделены пробелами (невозможно, чтобы один из аргументов, переданных программе, содержал пробел). Исключением является случай, когда program начинается с @. В этом случае program (без @) будет искаться в внутренней двоичной директории компилятора. Таким образом, демонстрационный сервер маппера может быть указан с помощью
@g++-mapper-server. <>[?ident]<>inout[?ident]<in>out[?ident]-
Имена именованных каналов или дескрипторы файлов для связи. Первый формат, <>, осуществляет связь через stdin и stdout. Другие форматы позволяют указать дескриптор файла или имя канала. Числовое значение интерпретируется как дескриптор файла, в противном случае открывается именованный канал. Второй формат определяет двунаправленный канал, а последний формат позволяет указать два независимых канала. Использование дескрипторов файлов непосредственно таким образом, как правило, хрупко, так как может потребовать сотрудничества промежуточных процессов. В частности, использование stdin и stdout чревато опасностью, так как другие опции компилятора могут также привести к чтению компилятором stdin или записи в stdout, и это может привести к нежелательным взаимодействиям с передачей сигналов из терминала.
file[?ident]-
Файл сопоставления, содержащий разделенные пробелами пары «имя модуля—имя файла», по одной на строку. Необходимо предоставить только сопоставления для прямых импортов и любых имён экспорта модулей. Если будут предоставлены другие сопоставления, они переопределят те, которые хранятся в любых импортированных файлах CMI. Корень репозитория может быть указан в файле сопоставления с использованием «$root» в качестве имени модуля в первой активной строке. Использование этой опции отключит любое стандартное сопоставление имя модуля—имя CMI.
Как показано, необязательный ident может быть добавлен к первому слову опции с помощью префикса ‘?’. Это значение используется при первоначальном обмене данными с сервером модулей или для указания префикса в строках файла сопоставления. В случае сервера, используется имя основного исходного файла, если ident не указан. В случае файла, все непустые строки важны, если не указано значение, в этом случае важны только строки, начинающиеся с ident. ident должен быть отделен пробелами от имени модуля. Имейте в виду, что символы ‘<’, ‘>’, ‘?’ и ‘|’ часто важны для оболочки, и поэтому могут потребовать экранирования.
Маппер подключается или загружается лениво, когда требуется первое сопоставление модулей. Сетевые протоколы поддерживаются только на хостах, обеспечивающих сетевые функции. Если маппер не указан, используется по умолчанию.
Предполагается, что маппер, специфичный для проекта, будет предоставлен системой сборки, вызывающей компилятор. Не ожидается, что сервер общего назначения будет предоставлен для всех компиляций. Таким образом, сервер будет знать конфигурацию сборки, компилятор, который его вызвал, и среду (например, рабочую директорию), в которой он работает. Поскольку он может выполнять сборку параллельно, к одному сокету могут подключиться несколько компиляций.
Маппер по умолчанию генерирует файлы CMI в директории «gcm.cache». Файлы CMI имеют суффикс «.gcm». Имя модуля-единицы используется непосредственно для формирования имени файла. Единицы заголовков строят относительный путь, используя имя базового файла заголовка. Если путь уже относительный, префикс «,» добавляется. Внутренние компоненты «..» переводятся в «,,». Не предпринимаются попытки канонизировать эти имена файлов сверх того, что выполняет алгоритм поиска включений препроцессора, так как, как правило, это неоднозначно при наличии символических ссылок.
Протокол маппера был опубликован как «A Module Mapper» https://wg21.link/p1184. Реализация предоставляется libcody, https://github.com/urnathan/libcody, которая определяет каноническое определение протокола. Реализация сервера-прототипа, встроенного в make, была описана в «Make Me A Module» https://wg21.link/p1602.
Далее: Предварительная обработка модулей C++, Вернуться к: Модули C++ [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/C_002b_002b-Module-Mapper.html