Как собрать RPM пакет с произвольным содержимым

Общение и разговоры
Закрыто
Аватара пользователя
Legun
Сообщения: 281
Зарегистрирован: 12 дек 2012, 22:39
Operating system: Rosa Marathon 2012LTS i586

Как собрать RPM пакет с произвольным содержимым

Сообщение Legun » 29 мар 2013, 12:42

Вопрос который меня мучает уже долгое время, никак не могу собрать пакет .

Имеем файлы и папки с бинарниками
ну пусть будет
/SETTLER2
/SETTLER2/DATA
/SETTLER2/s2.sh

подскажите как мне все это упаковать rpm пакет?

Аватара пользователя
Pulfer
Сообщения: 3358
Зарегистрирован: 15 фев 2012, 01:57
Operating system: ROSA Desktop Fresh 2016.1 i586
Откуда: Vladivostok, Russia

Re: Как собрать RPM пакет с произвольным содержимым

Сообщение Pulfer » 29 мар 2013, 13:45

Legun писал(а):Вопрос который меня мучает уже долгое время, никак не могу собрать пакет .

Имеем файлы и папки с бинарниками
ну пусть будет
/SETTLER2
/SETTLER2/DATA
/SETTLER2/s2.sh

подскажите как мне все это упаковать rpm пакет?
Пакеты собираются не из папок, а из тарболов, поэтому первым делом надо создать архив. Причём кроме имени нужна версия. Пусть будет settler-2.tar.xz, внуртри которого папака SETTLER2.

Теперь создадим файл settler.spec, из которого будем собирать пакет. Начнём с заголовка (несколько произвольного, т.к. для удобства будем считать, что это игра Settlers II, только называется settler):

Код: Выделить всё

Name: settler
Version: 2
Release: 1
Summary: Settler 2 is a game about economics of settlers
License: Commercial
Group: Games/Strategy
Url: http://settlers2.net/
Source: %{name}-%{version}.tar.xz

%description
The Settlers II: Veni, Vidi, Vici is a real-time strategy computer game,
released by Blue Byte Software in 1996. Its gameplay is very similar to
that of its predecessor, The Settlers, albeit with a Roman theme and
improved graphics. It is the second game in The Settlers series.
Тут Version - это версия программы в апстриме, а Release - это версия нашего пакета для текущей версии из апстрима. Строки в Summary и %description должны быть короче 80 символов, иначе после сборки пакет будет признан некачественным (не пройдёт контроль rpmlint). Значение %{name} берётся из поля Name, а %{version} - из поля Version. В дальнейшем эти значения будут активно использоваться, хотя можно писать каждый раз явно settler и 2, а не %{name} и %{version}.

Теперь перейдём к сборке.

Код: Выделить всё

%prep
%setup -q -n SETTLER2

%build
# nothing to build

%install
mkdir -p %{buildroot}%{_datadir}/%{name}%{version}
cp -r * %{buildroot}%{_datadir}/%{name}%{version}

mkdir -p %{buildroot}%{_bindir}
cat > %{buildroot}%{_bindir}/%{name}%{version} <<EOF
#!/bin/sh

cd %{_datadir}/%{name}%{version}
./s2.sh
EOF

chmod +x %{buildroot}%{_bindir}/%{name}%{version}
Итак, что мы тут делаем?

В секции %prep просто распаковываем тарбол (%setup -q) и заходим в распакованную папку для дальнейшей работы (-n SETTLER2). Когда папка соответствует шаблону %{name}-%{version}, то можно её явно не указывать, а ограничиться %setup -q. Параметр -q нужен для того, чтобы не выводить на экран ход распаковки тарбола.

Далее, т.к. компилировать никакой код нам не надо, то в секции %build нам делать нечего.

В секции %install мы описываем, куда копировать распакованные или скомпилированные файлы. Везде указываем префикс %{buildroot} - временная папка, на основе подпапок которой потом будет запакован RPM-пакет. Значение %{buildroot} генерируется автоматически, но можно и явно задавать через поле Buildroot: в заголовочной части (в очень старых спеках это можно встретить).

Стандартные каталоги принято указывать через макросы:
/usr/bin - %{_bindir}
/usr/share - %{_datadir}
/usr/lib (или /usr/lib64, в зависимости от текущей архитектуры) - %{_libdir}
и так далее. Это справочная информация, весь список приводить тут смысла нет.

Итак, первым делом мы создаём во временном каталоге сборки каталог /usr/share/settler2, куда копируем всё содержимое текущего каталога (а мы, напомню, распаковали тарбол и находимся в каталоге SETTER2).

Далее создаём файл /usr/bin/settler2, куда командой cat записываем небольшой скрипт для запуска игры. И делаем этот файл исполняемым.

Для завершения сборки нам остаётся только описать файлы в пакете.

Код: Выделить всё

%files
%{_bindir}/%{name}%{version}
%{_datadir}/%{name}%{version}
Здесь, думаю, всё очевидно:
/usr/bin/settler2
/usr/share/settler2

По-хорошему, можно добавить в пакет ещё иконку и .desktop-файл, чтобы для игры появился пункт в меню. С точки зрения сборки пакетов это просто копирование/создание двух файлов по тому же принципу, что было описано выше. Надо только знать, как устроены .desktop-файлы, а это отдельная тема.

Потом запускаем rpmbuild -ba settler.spec, чтобы из спека собрался пакет.

P.S. Надеюсь, ничего не забыл и обошлось без опечаток, но мало ли :)
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586

Аватара пользователя
Legun
Сообщения: 281
Зарегистрирован: 12 дек 2012, 22:39
Operating system: Rosa Marathon 2012LTS i586

Re: Как собрать RPM пакет с произвольным содержимым

Сообщение Legun » 29 мар 2013, 18:20

Большое спасибо, вроде все начало получаться. 1 пакет с дикими ошибками, башенными плясками с бубном, но собрался, повторная операция со слегка измененным нутром (просто привел все в надлежащий вид /usr/share/games) выдает ошибку

Код: Выделить всё

+ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
/var/tmp/rpm-tmp.66984: line 45: /usr/lib/rpm/check-rpaths: No such file or directory
:unknown:

Аватара пользователя
Pulfer
Сообщения: 3358
Зарегистрирован: 15 фев 2012, 01:57
Operating system: ROSA Desktop Fresh 2016.1 i586
Откуда: Vladivostok, Russia

Re: Как собрать RPM пакет с произвольным содержимым

Сообщение Pulfer » 29 мар 2013, 19:19

Legun писал(а):Большое спасибо, вроде все начало получаться. 1 пакет с дикими ошибками, башенными плясками с бубном, но собрался, повторная операция со слегка измененным нутром (просто привел все в надлежащий вид /usr/share/games) выдает ошибку

Код: Выделить всё

+ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
/var/tmp/rpm-tmp.66984: line 45: /usr/lib/rpm/check-rpaths: No such file or directory
:unknown:
Хмм, ну это какая-то экзотика. Возможно, в ходе предыдущих попыток сборки пакетов создавались какие-нибудь левые файлы? Например, Гугл первым делом находит аналогичную ошибку в багзилле Red Hat и там оказывается, что у человека был файл .rpmmacros с левым макросом %__arch_install_post
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586

Аватара пользователя
Legun
Сообщения: 281
Зарегистрирован: 12 дек 2012, 22:39
Operating system: Rosa Marathon 2012LTS i586

Re: Как собрать RPM пакет с произвольным содержимым

Сообщение Legun » 04 апр 2013, 11:11

Ладно, с багом, черт с ним, есть другой вопрос, а как же мне указать свой путь установки, если например надо установить архив не в /usr/share/ а куда нибудь в /opt или /home/_username/ ?

Аватара пользователя
Pulfer
Сообщения: 3358
Зарегистрирован: 15 фев 2012, 01:57
Operating system: ROSA Desktop Fresh 2016.1 i586
Откуда: Vladivostok, Russia

Re: Как собрать RPM пакет с произвольным содержимым

Сообщение Pulfer » 04 апр 2013, 11:25

Legun писал(а):Ладно, с багом, черт с ним, есть другой вопрос, а как же мне указать свой путь установки, если например надо установить архив не в /usr/share/ а куда нибудь в /opt или /home/_username/ ?
Ну, там же просто набор стандартных команд, так что вместо

mkdir -p %{buildroot}%{_datadir}/%{name}%{version}
cp -r * %{buildroot}%{_datadir}/%{name}%{version}

можно

mkdir -p %{buildroot}/opt/%{name}%{version}
cp -r * %{buildroot}/opt/%{name}%{version}

С путями на /home/_username/ пакет лучше не собирать, это идеологически неправильно. :oops:
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586

Аватара пользователя
Legun
Сообщения: 281
Зарегистрирован: 12 дек 2012, 22:39
Operating system: Rosa Marathon 2012LTS i586

Re: Как собрать RPM пакет с произвольным содержимым

Сообщение Legun » 04 апр 2013, 11:50

спасибо, я случайно %{_bindir} затер, подправил, все собралось

Аватара пользователя
Legun
Сообщения: 281
Зарегистрирован: 12 дек 2012, 22:39
Operating system: Rosa Marathon 2012LTS i586

Re: Как собрать RPM пакет с произвольным содержимым

Сообщение Legun » 04 апр 2013, 16:29

ну вот и с первым собранным пакетом меня :)

Аватара пользователя
Pulfer
Сообщения: 3358
Зарегистрирован: 15 фев 2012, 01:57
Operating system: ROSA Desktop Fresh 2016.1 i586
Откуда: Vladivostok, Russia

Re: Как собрать RPM пакет с произвольным содержимым

Сообщение Pulfer » 04 апр 2013, 19:42

Legun писал(а):ну вот и с первым собранным пакетом меня :)
Поздравляю. :) Тут главное начать, а потом сама сборка быстро начнёт казаться простой и понятной. Проблемы будут не с написанием спеков, а в основном с компиляцией кода :)
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586

Аватара пользователя
Legun
Сообщения: 281
Зарегистрирован: 12 дек 2012, 22:39
Operating system: Rosa Marathon 2012LTS i586

Re: Как собрать RPM пакет с произвольным содержимым

Сообщение Legun » 04 апр 2013, 20:56

да, я так когда то и начал изучать Linux. Никакого интернета, только пара справочников, коробка ASPLinux 10 и Mandrake 10 Powerpack, ну и диски от журнала ХАКЕР.

Закрыто

Вернуться в «Курилка»