Пример spec-файла

В этом разделе на простом примере будет продемонстрировано как добавить поддержку альтернатив в пакет. Одновременно будут даны разъяснения по миграции со старой схемы на новую.

Пакет colorifer занимается расцветкой вывода приложений изначально не приспособленных для этого. В частности, он может быть использован для расцвечивания ошибок компиляции gcc. Действует он следующим образом: пользователь запускает как обычно gcc, вместо него стартует colorifer, который запускает уже настоящий gcc и расцвечивает его вывод на экран. Не всем пользователям нравится “цветной” компилятор, поэтому надо создать альтернативу /usr/bin/gcc.

В старой версии альтернатив у каждого кандидата было три аттрибута: общее имя, имя альтернативы, имя кандидата. В данном случае это: /usr/bin/gcc, gcc и /usr/bin/colorifer соответственно.

В новой версии альтернатив у каждого кандидата только два аттрибута: общее имя и имя кандидата. Имя альтернативы признано избыточным и автоматически вычисляется для внутренних нужд. Если вы переходите со старой схемы на новую и желаете удалить служебные ссылки от старой версии не забудьте указать это имя.

Основные используемые макросы:

%_altdir

Каталог куда кладут свои файлы описания кандидатов пакеты, /etc/alternatives/packages.d/

%register_alternatives name1 name2 -- oldname1 oldname2

Произвести регистрацию (сделать активными) файлы-описания name1 и name2, удалить старые служебные ссылки oldname1 и oldname2. Если нет необходимости в удалении старых ссылок, то формат сокращается до “%register_alternatives name”. Обновить состояние альтернатив. Помещается в скрипт %post.

%unregister_alternatives name

Отменить регистрацию файла-описания 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
...
    

Пакет готов.



[3] Для удобства несущественные строчки пропущены

[4] В зависимости указывается >= 0.0.6, так как до этой версии использовался несколько другой формат конфигурационных файлов