Параметры генерации транспортного кода на языке C
Через параметр NK_FLAGS CMake-команд nk_build_*dl_files () можно задать параметры генерации транспортного кода на языке C.
Настройка, необходимая при использовании интерфейсных методов с error-параметрами
Если IDL-файл включает хотя бы одну сигнатуру интерфейсного метода с хотя бы одним error-параметром, необходимо указать один из следующих параметров:
--extended-errorsЭтот параметр дает возможность использовать интерфейсные методы с одним или несколькими error-параметрами произвольных IDL-типов. Клиент работает с error-параметрами как с выходными параметрами.
--deprecated-no-extended-errorsЭтот параметр дает возможность использовать интерфейсные методы только с одним error-параметром
statusIDL-типаUInt16, значение которого клиент получает через код возврата интерфейсного метода.Способ передачи error-параметров, соответствующий параметру
--deprecated-no-extended-errors, является устаревшим и перестанет поддерживаться в будущем, поэтому рекомендуется указывать параметр--extended-errors.
Выборочная генерация транспортного кода
Чтобы уменьшить объем генерируемого транспортного кода, можно использовать флаги выборочной генерации транспортного кода. Например, для программ, предоставляющих службы, можно использовать флаг --server, а для программ, использующих службы, можно использовать флаг --client.
Флаги выборочной генерации транспортного кода для IDL-файла:
--typesТранспортный код включает типы, соответствующие IDL-типам из заданного IDL-файла, а также импортируемым в этот файл IDL-типам, которые используются в IDL-типах заданного IDL-файла. При этом типы, соответствующие импортируемым IDL-константам и псевдонимам импортируемых IDL-типов, не включаются в файл
*.idl.h. Чтобы использовать типы, соответствующие импортируемым IDL-константам и псевдонимам импортируемых IDL-типов, нужно отдельно сгенерировать транспортный код для IDL-файлов, из которых осуществляется импорт.--interfaceТранспортный код соответствует флагу
--types, а также включает типы структур фиксированной части IPC-запросов и IPC-ответов для интерфейсных методов, сигнатуры которых указаны в заданном IDL-файле. Кроме того, транспортный код содержит константы с размерами арен IPC-сообщений.--clientТранспортный код соответствует флагу
--interface, а также включает тип прокси-объекта, метод инициализации прокси-объекта и интерфейсные методы, указанные в заданном IDL-файле.--server(установлен по умолчанию)Транспортный код соответствует флагу
--interface, а также включает типы и диспетчер (dispatch-метод), используемые для обработки IPC-запросов, соответствующих интерфейсным методам, указанным в заданном IDL-файле.
Флаги выборочной генерации транспортного кода для CDL-файла или EDL-файла:
--typesТранспортный код включает типы, соответствующие IDL-типам, которые используются в параметрах методов служб, предоставляемых компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла).
--endpointsТранспортный код соответствует флагу
--types, а также включает типы структур фиксированной части IPC-запросов и IPC-ответов для методов служб, предоставляемых компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла). Кроме того, транспортный код содержит константы с размерами арен IPC-сообщений.--clientТранспортный код соответствует флагу
--endpoints, а также включает типы прокси-объектов, методы инициализации прокси-объектов и методы служб, предоставляемых компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла).--server(установлен по умолчанию)Транспортный код соответствует флагу
--endpoints, а также включает типы и диспетчеры (dispatch-методы), используемые для обработки IPC-запросов, соответствующих службам, предоставляемым компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла). Кроме того, транспортный код включает типы стабов и методы инициализации стабов.
Вывод диагностических данных об отправке и приеме IPC-сообщений
Транспортный код может формировать диагностические данные об отправке и приеме IPC-сообщений и выводить эти данные через стандартный вывод ошибок. Чтобы генерировать транспортный код с такими возможностями, нужно использовать следующие параметры:
--trace-client-ipc{headers|dump}Код вывода диагностических данных исполняется непосредственно перед выполнением системного вызова
Call()и сразу после его выполнения. Если указано значениеheaders, диагностические данные включают идентификатор метода службы (MID), идентификатор службы (RIID), размер фиксированной части IPC-сообщения в байтах, содержимое дескриптора арены IPC-сообщения, размер арены IPC-сообщения в байтах и размер использованной части арены IPC-сообщения в байтах. Если указано значениеdump, диагностические данные дополнительно включают содержимое фиксированной части и арены IPC-сообщения в шестнадцатеричном представлении.При использовании этого параметра нужно указать флаг выборочной генерации транспортного кода
--clientлибо не указывать флаги выборочной генерации транспортного кода.--trace-server-ipc{headers|dump}Код вывода диагностических данных исполняется непосредственно перед вызовом функции, реализующей интерфейсный метод, и сразу после выполнения этой функции, то есть при вызове диспетчера (dispatch-метода) в промежутке между выполнением системных вызовов
Recv()иReply(). Если указано значениеheaders, диагностические данные включают идентификатор метода службы (MID), идентификатор службы (RIID), размер фиксированной части IPC-сообщения в байтах, содержимое дескриптора арены IPC-сообщения, размер арены IPC-сообщения в байтах и размер использованной части арены IPC-сообщения в байтах. Если указано значениеdump, диагностические данные дополнительно включают содержимое фиксированной части и арены IPC-сообщения в шестнадцатеричном представлении.При использовании этого параметра нужно указать флаг выборочной генерации транспортного кода
--serverлибо не указывать флаги выборочной генерации транспортного кода.--ipc-trace-method-filter<METHOD 1>[,<METHOD 2>]...Вывод диагностических данных выполняется, если только вызваны заданные интерфейсные методы. В качестве значения
METHODможно использовать имя интерфейсного метода либо конструкцию <имя пакета>:<имя интерфейсного метода>. Имя пакета и имя интерфейсного метода указаны в IDL-файле.Если этот параметр не указан, вывод диагностических данных выполняется при вызове любого интерфейсного метода.
Параметр можно указать многократно. Например, можно указать все требуемые интерфейсные методы в одном параметре или каждый требуемый интерфейсные метод в отдельном параметре.
Управление предупреждениями и ошибками
Можно отключить вывод некоторых предупреждений генератора транспортного кода либо, наоборот, назначить эти предупреждения ошибками. Чтобы отключить вывод предупреждения, нужно использовать параметр -Wno-<WARN_CODE>. Чтобы назначить предупреждение ошибкой, нужно использовать параметр -Werror=<WARN_CODE>. WARN_CODE может принимать следующие значения:
xdl.component-named-as-task-classИмя класса процессов в EDL-файле совпадает с именем компонента в декларации
componentCDL-файла, который не связан с этим EDL-файлом. То есть в заданных директориях поиска генератор транспортного кода обнаружил CDL-файл, в котором декларацияcomponentсодержит имя компонента, совпадающее с именем класса процессов в EDL-файле. При этом декларацияcomponentsEDL-файла не содержит имя компонента, соответствующее найденному CDL-файлу, либо EDL-файл вообще не содержит декларациюcomponents.xdl.deprecated-syntaxВ EDL-файле используется устаревшая декларация
entity.xdl.multiple-filesГенератор транспортного кода обнаружил несколько IDL-файлов, соответствующих имени интерфейса или пакета, либо несколько CDL-файлов, соответствующих имени компонента. Например, в заданных директориях поиска генератор транспортного кода обнаружил несколько CDL-файлов, которые соответствуют одному имени компонента, указанному в декларации
componentsEDL-файла, или несколько IDL-файлов, которые соответствуют одному имени интерфейса, указанному в декларацииendpointsCDL- файла. (Для генерации транспортного кода используется первый найденный из нескольких подходящих IDL-, CDL-файлов.)