Цель не только научиться, есть практическая задача. Есть значит дистрибутив CentOS 7, нужно чтобы в системе работал netflow-сенсор ipt-netflow, для этого нужно собрать модуль ядра ipt-netflow и обновить iptables, в репозитории есть iptables версии 1.4.21, нужна последняя версия 1.6.0.
Лезу в гугл, и нахожу основной HOWTO по сборке rpm, а также материал с доп. инфой по макросам:
http://rpm.org/documentation.html
https://fedoraproject.org/wiki/How_to_create_an_RPM_package
https://fedoraproject.org/wiki/Packaging:RPMMacros
Лезу ещё и нахожу статьи по теме нарусском:
http://wiki.russianfedora.pro/index.php?ti...здать_пакет_RPM
https://www.opennet.ru/base/sys/rpm_create.txt.html
https://habrahabr.ru/post/246177
Итак, если я правильно понимаю тему, мне для этого нужны исходники и все зависимости, а также spec-файл, в нём есть все описания пакета, коды пред и постинсталяционных скриптов, и, самое главное , секции: %prep, %build, %install и %clean, в которых описываются вехи процесса сбохки пакета, обрабатываются эти секции как код обычных bash-скриптов, с включёнными в него макросами и переменными, начинающихся с символа "%". В домашнем каталоге пользователя (так проще при пересборке src.rpm) создаётся каталог rpmbuild, в нём подтаталоги: SOURCES, SPECS, BUILD, RPMS, SRPMS, SPEC-файлы помещаются в SPECS, архивы исходников в SOURCES.
Сейчас я пытаюсь написать spec-файл для iptables версии 1.6.0, в качестве образца беря spec-файл для версии 1.4.21. Сразу скажу, я не программист, поэтому возможно что-то понимаю не так. Что-то в образцовом spec-файле мне непонятно, из-за чего у меня появляется желание упростить код, выкинув из него то, что мне кажется лишним.
Секция %prep: я решил заменить макрос %setup на то, что он делает, что сделать код понятным для себя. Также я выкидываю из кода всё, что касается патчей, потому что в образцовом spec-файле это были патчи для версии 1.4.21, а я собираю 1.6.0. Итак, у меня получается:
Код: Выделить всё
%prep
cd %{_builddir}
rm -Rf %{name}-%{version}
tar --extract --file=%{_sourcedir}/%{name}-%{version}.tar.bz2
if [ $? -ne 0 ]; then
exit $?
fi
cd %{name}-%{version}
chown -R root:root .
chmod -R u=rwX,g=rX,o=rX .
Собирать пакет буду из-под пользователя, но тут в сценарии я вижу одну команду, выполнение которой возможно только из-под рута, это "chown -R root:root .", я так понимаю что утилита rpmbuild, которая вызывает процесс сборки, будет вызывать fakeroot, иначе ведь ничего не получится.
Секции %build и %install: программа, которую я собираю, собирается при помощи стандартной трёхкомандной комбинации: «./configure», «make», «make install», собственно это и должно выполняться в этих секциях. Но я вижу в образцовом spec-файле много другого кода, например что делают эти две строки?
Код: Выделить всё
sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
Или вот, зачем перед вызовом make удалять types.h?
Код: Выделить всё
rm -f include/linux/types.h
И что за переменная %{?_smp_mflags} такая?
Код: Выделить всё
make %{?_smp_mflags}
Вообще, в вышеописанных материалах макросы и переменные описаны не полностью.
Дальнейшие секции пока не разбирал.
А как делать, если нужно опакетить программу, собирающуюся не методом трёхкомандной комбинации, а через инсталлятор, например проприетарный драйвер nvidia, я вообще без понятия.