Что мне нужно сделать минимум для создания RPM-файла?

Я просто хочу создать RPM-файл для распространения моего двоичного файла Linux «foobar» с парой зависимостей. Он имеет файл конфигурации /etc/foobar.conf и должен быть установлен в / usr / bin / foobar.

К сожалению, документация по RPM состоит из 27 глав, и у меня действительно нет день, чтобы сесть и прочитать это, потому что я также занят созданием установщиков .deb и EXE для других платформ.

Каков абсолютный минимум, который мне нужно сделать для создания RPM? Предположим, двоичный файл foobar и foobar.conf находятся в текущем рабочем каталоге.


person Steve Hanov    schedule 18.05.2009    source источник
comment
Как создать пакет RPM - хорошая статья о RPM (документы Fedora)   -  person webwesen    schedule 04.06.2009
comment
Назвать это "рецензией" - ничего не сказать.   -  person kernelK    schedule 29.01.2016


Ответы (9)


Я часто делаю двоичную rpm-версию для упаковки проприетарных приложений - также как и веб-сферу - в linux. Так что мой опыт может быть полезен и вам, кроме того, что лучше было бы сделать ИСТИННЫЙ RPM, если сможете. Но я отвлекся.

Итак, основной шаг для упаковки вашей (двоичной) программы следующий: я предполагаю, что программа - это toybinprog с версией 1.0, у нее есть conf, который нужно установить в /etc/toybinprog/toybinprog.conf, и есть bin, который нужно установить в / usr / bin называется tobinprog:

1. создайте env сборки rpm для RPM ‹4.6,4.7

mkdir -p ~/rpmbuild/{RPMS,SRPMS,BUILD,SOURCES,SPECS,tmp}

cat <<EOF >~/.rpmmacros
%_topdir   %(echo $HOME)/rpmbuild
%_tmppath  %{_topdir}/tmp
EOF

cd ~/rpmbuild

2. создайте архив вашего проекта

mkdir toybinprog-1.0
mkdir -p toybinprog-1.0/usr/bin
mkdir -p toybinprog-1.0/etc/toybinprog
install -m 755 toybinprog toybinprog-1.0/usr/bin
install -m 644 toybinprog.conf toybinprog-1.0/etc/toybinprog/

tar -zcvf toybinprog-1.0.tar.gz toybinprog-1.0/

3. Скопируйте в директорию с исходниками

cp toybinprog-1.0.tar.gz SOURCES/

cat <<EOF > SPECS/toybinprog.spec
# Don't try fancy stuff like debuginfo, which is useless on binary-only
# packages. Don't strip binary too
# Be sure buildpolicy set to do nothing
%define        __spec_install_post %{nil}
%define          debug_package %{nil}
%define        __os_install_post %{_dbpath}/brp-compress

Summary: A very simple toy bin rpm package
Name: toybinprog
Version: 1.0
Release: 1
License: GPL+
Group: Development/Tools
SOURCE0 : %{name}-%{version}.tar.gz
URL: http://toybinprog.company.com/

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

%description
%{summary}

%prep
%setup -q

%build
# Empty section.

%install
rm -rf %{buildroot}
mkdir -p  %{buildroot}

# in builddir
cp -a * %{buildroot}


%clean
rm -rf %{buildroot}


%files
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf
%{_bindir}/*

%changelog
* Thu Apr 24 2009  Elia Pinto <[email protected]> 1.0-1
- First Build

EOF

4. Соберите исходный код и двоичный файл rpm

rpmbuild -ba SPECS/toybinprog.spec

И это все.

Надеюсь на эту помощь

person devzero2000    schedule 22.07.2009
comment
На случай, если вы обнаружите, что команда rpmbuild: не найдена, см. wiki.centos.org/HowTos/SetupRpmBuildEnvironment. Но это руководство - хорошее начало для меня в изучении внутренней работы rpm. - person icasimpan; 10.03.2014
comment
В вашем примере что устанавливает _bindir? Я пытаюсь следовать вашему решению, но хочу поместить свои двоичные файлы в / opt. В соответствии с этим я создал файл targz. И rpmbuild не работает с файлом, не найденным в buildroot / usr / bin. - person Kiss Viktoria; 27.11.2014
comment
sudo dnf install rpm-build - Команда Fedora 23 для установки rpmbuild v4.13 + - person Ray Foss; 20.04.2016
comment
@ devzero2000 Что вы имеете в виду под ИСТИННЫМ оборотом в минуту? - person RubenLaguna; 30.05.2017
comment
@ devzero2000 папка rpmbuild должна находиться в корневом каталоге, или я мог бы разместить ее в другом месте? - person Diogo Calazans; 10.04.2018
comment
По-видимому, больше не работает, начиная с rpm версии 4.14 (Fedora 29): /home/me/rpmbuild/tmp/rpm-tmp.EOYOmf: line 39: $'\r': command not found - person villapx; 07.01.2019

Как распространитель приложений, fpm идеально подходит для ваших нужд. Здесь есть пример, показывающий, как упаковать приложение из источника. FPM может создавать как файлы deb, так и файлы RPM.

person timmow    schedule 26.06.2012
comment
Мы постоянно пользуемся этим инструментом на работе. Безусловно, наиболее практичный инструмент, отвечающий вашим потребностям. - person djhaskin987; 27.09.2013
comment
FPM использует лучший фундаментальный принцип, который только можно найти в программном обеспечении: если это не помогает, значит, есть ошибка. Я очень дорожу этим обязательством. - person ribamar; 16.08.2016

Если вы хотите быстро построить RPM, посмотрите Того:

https://github.com/genereese/togo-rpm

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

Пример использования данных, представленных в исходном вопросе:

1) Создайте каталог проекта с помощью скрипта:

$ togo project create foobar; cd foobar

2) Создайте желаемую структуру каталогов в ./root и скопируйте в нее свои файлы:

$ mkdir -p root/etc; cp /path/to/foobar.conf root/etc/
$ mkdir -p root/usr/bin; cp /path/to/foobar root/usr/bin/

3) Исключите системные каталоги из собственности вашего RPM:

$ togo file exclude root/etc root/usr/bin

4) (НЕОБЯЗАТЕЛЬНО) Измените сгенерированную спецификацию, чтобы изменить описание / зависимости / версию / что угодно вашего пакета и т. Д .:

$ vi spec/header

5) Создайте RPM:

$ togo build package

-и ваш RPM выплевывается в каталог ./rpms.

person dadealeus    schedule 17.09.2013
comment
Обновлен пример, чтобы он соответствовал сценарию, приведенному в исходном вопросе. - person dadealeus; 28.01.2014

Точно так же мне нужно было создать rpm всего с несколькими файлами. Поскольку эти файлы контролировались исходным кодом и потому что это казалось глупым, я не хотел их тарировать только для того, чтобы rpm распаковал их. Я придумал следующее:

  1. Настройте свою среду:

    mkdir -p ~/rpm/{BUILD,RPMS}

    echo '%_topdir %(echo "$HOME")/rpm' > ~/.rpmmacros

  2. Создайте свой файл спецификации, foobar.spec, со следующим содержимым:

    Summary: Foo to the Bar
    Name: foobar
    Version: 0.1
    Release: 1
    Group: Foo/Bar
    License: FooBarPL
    Source: %{expand:%%(pwd)}
    BuildRoot: %{_topdir}/BUILD/%{name}-%{version}-%{release}
    
    %description
    %{summary}
    
    %prep
    rm -rf $RPM_BUILD_ROOT
    mkdir -p $RPM_BUILD_ROOT/usr/bin
    mkdir -p $RPM_BUILD_ROOT/etc
    cd $RPM_BUILD_ROOT
    cp %{SOURCEURL0}/foobar ./usr/bin/
    cp %{SOURCEURL0}/foobar.conf ./etc/
    
    %clean
    rm -r -f "$RPM_BUILD_ROOT"
    
    %files
    %defattr(644,root,root)
    %config(noreplace) %{_sysconfdir}/foobar.conf
    %defattr(755,root,root)
    %{_bindir}/foobar
    
  3. Увеличьте обороты: rpmbuild -bb foobar.spec

Там есть небольшая хитрость, указывающая `` источник '' в качестве вашего текущего каталога, но это выглядело гораздо более элегантно, чем альтернатива, которая в моем случае заключалась в написании отдельного скрипта для создания tarball и т. Д. И т. Д.

Примечание: в моей конкретной ситуации мои файлы были упорядочены по папкам в соответствии с тем, куда они должны были попасть, например:

./etc/foobar.conf
./usr/bin/foobar

и так раздел подготовки стал:

%prep
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT
cd $RPM_BUILD_ROOT
tar -cC %{SOURCEURL0} --exclude 'foobar.spec' -f - ./ | tar xf -

Что немного чище.

Кроме того, я использую RHEL5.6 с версией 4.4.2.3 об / мин, поэтому ваш пробег может отличаться.

person glickbot    schedule 03.03.2011
comment
Мне пришлось повернуть все $RPM_BUILD_ROOT на %{buildroot}, чтобы заставить его работать на моем Red Hat Enterprise Linux Server версии 6.9. Кроме того, два установленных файла должны были находиться в текущем каталоге, когда я запускал rpmbuild. Я установил его на другой компьютер с помощью: sudo rpm -Uvh --nodeps foobar-0.1a-1.x86_64.rpm - person user1683793; 12.09.2018

Простой способ собрать пакет rpm из двоичного файла (эти шаги были протестированы с Fedora 18):

1) Сначала вам нужно установить rpmdevtools, поэтому запустите эти команды (внимание: запускайте как обычный пользователь)

$ sudo yum install rpmdevtools rpmlint
$ rpmdev-setuptree

2) В папке ~ / rpmbuild / SPECS создайте новый файл: имя_пакета.spec

3) Откройте его в редакторе (например, gedit) и напишите следующее:

Name:           package_name
Version:        1.0
Release:        1
Summary:        Short description (first char has to be uppercase)

License:        GPL
URL:            www. your_website/

BuildRequires:  package_required >= (or ==, or <=) 1.0.3 (for example)

%description
Description with almost 79 characters (first char has to be uppercase)

#This is a comment (just as example)

%files
/usr/bin/binary_file.bin
/usr/share/applications/package_name.desktop
/usr/share/pixmaps/package_name.png

%changelog
* date Packager's Name <packager's_email> version-revision
- Summary of changes

#For more details see: docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/Packagers_Guide/sect-Packagers_Guide-Creating_a_Basic_Spec_File.html

4) Создайте ~ / rpmbuild / BUILDROOT / package_name-version-release.i386 и воспроизведите пути, по которым будут размещены файлы. В этом случае, например, создайте:

  • ~ / rpmbuild / BUILDROOT / имя_пакета-версия-release.i386 / usr / bin /
  • ~ / rpmbuild / BUILDROOT / имя_пакета-версия-release.i386 / usr / share / applications /
  • ~ / rpmbuild / BUILDROOT / имя_пакета-версия-release.i386 / usr / share / pixmaps /

5) Поместите в эти папки файлы, которые хотите вставить в пакет:

  • ~ / rpmbuild / BUILDROOT / имя_пакета-версия-release.i386 / usr / bin / binary_file.bin
  • ~ / rpmbuild / BUILDROOT / имя_пакета-версия-релиз.i386 / usr / share / applications / имя_пакета.desktop
  • ~ / rpmbuild / BUILDROOT / имя_пакета-версия-релиз.i386 / usr / share / pixmaps / имя_пакета.png

usr / share / pixmaps / package_name.png - это значок двоичного файла usr / share / applications / package_name. desktop - это правила для вставки программы в записи меню

6) имя_пакета.desktop должно быть таким:

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=example
GenericName=Short description
Comment=Comment of the application
Exec=package_name
Icon=package_name
Terminal=false
Categories=System;

Категории следующие: standard.freedesktop.org/menu-spec/latest/apa.html

7) Запускаем $ rpmbuild -bb ~/rpmbuild/SPECS/package_name.spec

8) Ваш пакет был встроен в папку ~ / rpmbuild / RPMS

если вы установите этот пакет, он установит:

  • /usr/bin/binary_file.bin
  • /usr/share/applications/имя_пакета.desktop
  • /usr/share/pixmaps/имя_пакета.png

Спасибо: losurs.org/docs/tips/redhat/binary-rpms

Для получения дополнительных сведений о создании rpm перейдите по этой ссылке.

Программное обеспечение Java с графическим интерфейсом пользователя для создания rpm: https://sourceforge.net/projects/javarpmbuilder/

person RobotMan    schedule 08.09.2013

Если make config работает для вашей программы или у вас есть сценарий оболочки, который копирует ваши два файла в соответствующее место, вы можете использовать проверить установку. Просто перейдите в каталог, в котором находится ваш make-файл, и вызовите его с параметром -R (для RPM) и, возможно, с установочным скриптом.

person js.    schedule 15.02.2011

Если вы знакомы с Maven, там также rpm-maven-plugin, который упрощает создание RPM: вам нужно написать только pom.xml, который затем будет использоваться для создания RPM. Среда сборки RPM создается плагином неявно.

person scrutari    schedule 31.03.2015

Процесс создания RPM из исходного файла:

  1. скачать исходный файл с расширением.gz.
  2. установите rpm-build и rpmdevtools из yum install. (будет создана папка rpmbuild ... SPECS, SOURCES, RPMS .. папки должны быть созданы внутри папки rpmbuild).
  3. скопируйте исходный код.gz в папку SOURCES. (rpmbuild / SOURCES)
  4. Разверните шарик смолы с помощью следующей команды. перейдите в папку SOURCES: rpmbuild / SOURCES, где находится tar-файл. команда: например, tar -xvzf httpd-2.22.tar.gz папка httpd-2.22 будет создана по тому же пути.
  5. перейдите в извлеченную папку и введите команду ниже: ./configure --prefix = / usr / local / apache2 --with-included-apr --enable-proxy --enable-proxy-balancer --with-mpm = worker - -enable-mods-static = all (.configure может отличаться в зависимости от источника, для которого должен быть собран RPM - я сделал для apache HTTPD, которому нужен пакет зависимостей apr и apr-util).
  6. после успешной настройки выполните команду ниже: make
  7. после успешного выполнения команды make выполните: checkinstall в той же папке. (если у вас нет программы checkinstall, загрузите последнюю версию с сайта) Также в программе checkinstall есть ошибка, которую можно решить следующим образом: ::::: найдите checkinstallrc и затем замените TRANSLATE = 1 на TRANSLATE = 0 с помощью команды vim. Также проверьте исключить пакет: EXCLUDE = "/ selinux"
  8. checkinstall запросит опцию (введите R, если вы хотите, чтобы tp build rpm для исходного файла)
  9. Готовый файл .rpm будет построен в папке RPMS внутри файла rpmbuild / RPMS ... ВСЕ САМОЕ ЛУЧШЕЕ ....
person user3248738    schedule 21.03.2016

RPM обычно создаются из исходников, а не из двоичных файлов.

Вам необходимо написать файл спецификации, описывающий, как сконфигурировать и скомпилировать ваше приложение; также, какие файлы включить в ваш RPM.

Беглый взгляд на руководство показывает, что большая часть того, что вам нужно, описано в главе 8; кроме того, поскольку для большинства дистрибутивов на основе RPM доступны исходные коды, существует буквально миллион примеров различных подходов, на которые вы можете взглянуть.

person andri    schedule 18.05.2009