Значительная часть конструкции системы RPM лежит в области системно-зависимых конфигураций. К системно-зависимым параметрам относится, например, информация о платформе, о совместимых платформах, о расположении различных файлов. Файлы настройки RPM - rc и macros поддерживают сотни опций, настраивающих RPM на определенную систему, и многие настройки не могут быть оставлены в значениях по умолчанию.
RPM программы на C нуждаются в доступе к системным настройкам RPM для проверки правильности установок, адекватных системной архитектуре и текущей инсталляции. Для запуска программы, системные установки должны быть считаны (возможно, из всех конфигурационных файлов). Для выполнения этой операции вызывается rpmReadConfigFiles :
int rpmReadConfigFiles(const char *files, const char *target); |
Параметр files содержит разделенный двоеточиями список файлов, которые отвечают за системную конфигурацию. Параметр target содержит целевую платформу. Для использования установок по умолчанию достаточно, чтобы оба параметра имели значение NULL .
Функция rpmReadConfigFiles возвращает 0 в случае успеха и -1 в случае ошибки.
Единожды считав конфигурационные файлы, мы можем получить доступ к значениям переменных конфигурации, или, например, распечатать их.
15.1.5.1. Вывод конфигурации
Для вывода конфигурации используется rpmShowRC :
int rpmShowRC(FILE* output); |
Чтобы задать выходной файл, устанавливается значение единственного параметра, например, для стандартного вывода:
rpmShowRC( stdout ); |
Функция rpmShowRC всегда возвращает 0.
Для контролирования вывода rpmShowRC и других библиотечных функций используют установку уровня многословности вывода с помощью функции rpmSetVerbosity :
rpmSetVerbosity(RPMMESS_NORMAL); |
Возможные варианты многословности вывода:
Уровень |
Что означает |
RPMMESS_FATALERROR |
Сообщения о критических ошибках и все не менее значимое |
RPMMESS_ERROR |
Сообщения об ошибках вообще и все не менее значимое |
RPMMESS_WARNING |
Все предупреждения и все не менее значимое |
RPMMESS_QUIET |
То же, что и RPMMESS_WARNING |
RPMMESS_NORMAL |
Только существенные сообщения |
RPMMESS_VERBOSE |
Все информационные сообщения |
RPMMESS_DEBUG |
Вся отладочная информация и все не менее значимое |
Пример программы, использующей вышеописанные функции:
/* Show the rpmrc settings. */ |
Скомпилируйте программу с помощью команды:
$ cc -I/usr/include/rpm -o rpm1 rpm1.c -lrpm -lrpmdb -lrpmio lpopt |
После запуска программы мы должны увидеть содержимое файлов конфигурации, выводимое на консоль.
15.1.5.2. Разворачивание значений макросов
В совокупности rc-файлы и файлы макросов содержат множество определений, которые можно использовать для обращения к значениям установок. Термин макроопределение или макрос используются потому, что значение может быть не просто строкой. Может быть макрос, ссылающийся на другие макросы, возможны и другие сложноподчиненные случаи. Базовый синтаксис макросов:
%name_of_macro |
Например:
%_target |
Множество макросов начинаются с нижнего подчеркивания.
Всегда можно раскрыть макрос с помощью команды rpm --eval :
$ rpm --eval %_target |
Обратиться к значению макроса можно так:
%{_target} |
Такой синтаксис облегчает задачу включения макросов в комбинации с обычным текстом и другими макросами.
15.1.5.2. Разворачивание макросов внутри кода
Для получения значения макроса в C-программе используют rpmExpand. Функция rpmExpand может развернуть один или несколько макросов, возвращая развернутое значение. Функции можно передать различное число параметров. Список должен быть инициализирован значением NULL .
char* rpmExpand (const char *arg,...); |
Для очистки после возврата данных из rpmExpand следует использовать free .
Программа в примере ниже забирает из командной строки первый параметр и пытается его развернуть как макрос:
/* Show some macro settings. */ |
Скомпилируйте программу как показано выше. При запуске после имени исполняемого файла введите имя макроса для разворачивания. Например:
$ ./rpmexpand %_target |
Можно задать несколько имен макросов в связке:
$ ./rpmexpand %_builddir/%_target |
Для проверки работы программы можно использовать rpm --eval :
$ rpm --eval %_builddir/%_target |
Далее - Мощь popt
Назад - Компиляция и линковка RPM программ
Содержание