В этом разделе на простом примере будет продемонстрировано как добавить поддержку альтернатив в пакет. Одновременно будут даны разъяснения по миграции со старой схемы на новую.
Пакет colorifer занимается расцветкой вывода приложений изначально не приспособленных для этого. В частности, он может быть использован для расцвечивания ошибок компиляции gcc. Действует он следующим образом: пользователь запускает как обычно gcc, вместо него стартует colorifer, который запускает уже настоящий gcc и расцвечивает его вывод на экран. Не всем пользователям нравится “цветной” компилятор, поэтому надо создать альтернативу /usr/bin/gcc.
В старой версии альтернатив у каждого кандидата было три аттрибута: общее имя, имя альтернативы, имя кандидата. В данном случае это: /usr/bin/gcc, gcc и /usr/bin/colorifer соответственно.
В новой версии альтернатив у каждого кандидата только два аттрибута: общее имя и имя кандидата. Имя альтернативы признано избыточным и автоматически вычисляется для внутренних нужд. Если вы переходите со старой схемы на новую и желаете удалить служебные ссылки от старой версии не забудьте указать это имя.
Основные используемые макросы:
Каталог куда кладут свои файлы описания кандидатов пакеты, /etc/alternatives/packages.d/
Произвести регистрацию (сделать активными) файлы-описания name1 и name2, удалить старые служебные ссылки oldname1 и oldname2. Если нет необходимости в удалении старых ссылок, то формат сокращается до “%register_alternatives name”. Обновить состояние альтернатив. Помещается в скрипт %post.
Отменить регистрацию файла-описания name и обновить состояние альтернатив. Помещается в скрипт %preun.
Итак пусть старый spec-файл colorifer выглядел следующим образом [3]
PreReq: /usr/sbin/update-alternatives .... %post /usr/sbin/update-alternatives \ --install %_bindir/gcc gcc %_bindir/colorifer 50 \ --slave %_bindir/g++ g++ %_bindir/colorifer \ --slave %_bindir/g77 g77 %_bindir/colorifer \ --slave %_bindir/gcj gcj %_bindir/colorifer %preun [ $1 = 0 ] || exit 0 /usr/sbin/update-alternatives --remove gcc %_bindir/colorifer ....
Первым делом создадим файл описания альтернативы colorifer.xml со следующим содержанием:
<group name="candidate"> <option name="link">/usr/bin/gcc</option> <option name="real">/usr/bin/colorifer</option> <option name="weight" type="number">50</option> <group name="slave"> <option name="link">/usr/bin/g++</option> <option name="real">/usr/bin/colorifer</option> </group> <group name="slave"> <option name="link">/usr/bin/g77</option> <option name="real">/usr/bin/colorifer</option> </group> <group name="slave"> <option name="link">/usr/bin/gcj</option> <option name="real">/usr/bin/colorifer</option> </group> </group>
Добавим его в секцию %files, изменим %post и %preun скрипты, не забудем удалить cтарые ссылки (gcc,g++,g77,gcj). Поменяем зависимость пакета на пакет alternatives. После этого spec-файл примет следующий вид: [4]
.. Source100: colorifer.xml .. PreReq: alternatives >= 0.0.6 .. %install install -d $RPM_BUILD_ROOT%_altdir install %SOURCE100 $RPM_BUILD_ROOT%_altdir/%name.xml ... %post %register_alternative colorifer.xml -- gcc g++ g77 gcj %preun %unregister_alternative colorifer.xml ... %files %_altdir/colorifer.xml ...
Пакет готов.