nk-gen-c
Компилятор NK (nk-gen-c) генерирует транспортный код на основе IDL-, CDL-, EDL-описаний.
Компилятор nk-gen-c принимает IDL-, CDL- или EDL-файл и создает следующие файлы:
- Файл
*.*dl.h, содержащий транспортный код. - Файл
*.*dl.nk.d, в котором перечислены зависимости созданного файла*.*dl.hот IDL- и CDL-файлов. Файл*.*dl.nk.dсоздается для системы сборки.
Синтаксис shell-команды для запуска компилятора nk-gen-c:
nk-gen-c -I <SYSROOT_INCLUDE_PATH> [-I <PATH>]... [-o <PATH>] [--types]
[--interface] [--endpoints] [--client] [--server] [--extended-errors]
[(--deprecated-no-extended-errors)] [--trace-client-ipc {headers|dump}]
[--trace-server-ipc {headers|dump}] [--ipc-trace-method-filter <METHOD 1>[,<METHOD 2>]...]
[-h|--help] [--version] <FILE>
Базовые параметры:
FILEПуть к IDL-, CDL- или EDL-файлу, для которого необходимо сгенерировать транспортный код.
-I<SYSROOT_INCLUDE_PATH>Путь к директории
sysroot-*-kos/includeиз состава KasperskyOS SDK.-I<PATH>Эти параметры нужно использовать, чтобы задать пути к директориям, содержащим IDL-, CDL-файлы, на которые ссылается файл, заданный через параметр
FILE.-o<PATH>Путь к существующей директории, в которую будут помещены созданные файлы. Если этот параметр не указан, созданные файлы будут помещены в текущую директорию.
-h|--helpВыводит текст справки.
--versionВыводит версию компилятора
nk-gen-c.--extended-errorsЭто параметр дает возможность использовать интерфейсные методы с одним или несколькими error-параметрами произвольных IDL-типов. (Клиент работает с error-параметрами как с выходными параметрами.)
Если не указывать параметр
--extended-errors, можно использовать интерфейсные методы только с одним error-параметромstatusIDL-типаUInt16, значение которого клиент получает через код возврата интерфейсного метода. Такой способ передачи error-параметров является устаревшим и перестанет поддерживаться в будущем, поэтому рекомендуется всегда указывать параметр--extended-errors.--deprecated-no-extended-errorsЭтот параметр является параметром по умолчанию и дает возможность использовать интерфейсные методы только с одним error-параметром
statusIDL-типаUInt16, значение которого клиент получает через код возврата интерфейсного метода. Если параметр--deprecated-no-extended-errorsне указан, и при этом не указан параметр--extended-errors, то также можно использовать этот способ передачи error-параметров, но будет выведено предупреждение о необходимости указать параметр--extended-errorsлибо параметр--deprecated-no-extended-errors. (Указать один из этих параметров нужно потому, что в будущем параметр--deprecated-no-extended-errorsперестанет быть параметром по умолчанию, и без явного задания способа передачи error-параметров работа компилятораnk-gen-cбудет завершаться с ошибкой.)
Выборочная генерация транспортного кода
Чтобы уменьшить объем генерируемого транспортного кода, можно использовать флаги выборочной генерации транспортного кода. Например, для программ, реализующих службы, можно использовать флаг --server, а для программ, использующих службы, можно использовать флаг --client.
Если ни один из флагов выборочной генерации транспортного кода не указан, компилятор nk-gen-c генерирует для заданного IDL-, CDL- или EDL-файла транспортный код со всеми возможными методами и типами.
Флаги выборочной генерации транспортного кода для 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Транспортный код соответствует флагу
--types, а также включает типы структур фиксированной части IPC-запросов и IPC-ответов для методов служб, предоставляемых компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла). Кроме того, транспортный код содержит константы с размерами арен IPC-сообщений, а также типы прокси-объектов, методы инициализации прокси-объектов и методы служб, предоставляемых компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла).--serverТранспортный код соответствует флагу
--types, а также включает типы и диспетчеры (dispatch-методы), используемые для обработки IPC-запросов, соответствующих службам, предоставляемым компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла). Кроме того, транспортный код содержит константы с размерами арен IPC-сообщений, а также типы стабов, методы инициализации стабов и типы структур фиксированной части IPC-запросов и 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-файле.Если этот параметр не указан, вывод диагностических данных выполняется при вызове любого интерфейсного метода.
Параметр можно указать многократно. Например, можно указать все требуемые интерфейсные методы в одном параметре или каждый требуемый интерфейсные метод в отдельном параметре.