创建RPM文件的最低要求是什么?

154
我只想创建一个RPM文件来分发我的Linux二进制文件 "foobar",只有几个依赖项。它有一个配置文件,/etc/foobar.conf,并应安装在/usr/bin/foobar中。
不幸的是,RPM的文档长达27章,我真的没有时间坐下来阅读它,因为我还忙于为其他平台制作.deb和EXE安装程序。
我必须做的绝对最少是什么才能创建一个RPM?假设foobar二进制文件和foobar.conf位于当前工作目录中。

1
"如何创建RPM软件包"是有关RPM的良好文档(Fedora文档)。 - webwesen
7
称之为“写作”是轻描淡写的。 - kernelK
9个回答

183
我经常在Linux上打包专有应用程序,如websphere等二进制rpm。因此,我的经验对您也可能有用,除非您能够真正的使用RPM。但是我偏离了主题。
因此,打包(二进制)程序的基本步骤如下 - 假设程序为toybinprog,版本为1.0,需要在/etc/toybinprog/toybinprog.conf中安装配置,并在/usr/bin中安装一个名为tobinprog的bin文件:

1. 为RPM < 4.6,4.7创建rpm构建环境

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

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

cd ~/rpmbuild

2. 创建项目的tarball压缩包

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 <devzero2000@rpm5.org> 1.0-1
- First Build

EOF

4. 构建源代码和二进制rpm包

rpmbuild -ba SPECS/toybinprog.spec

希望你能够理解。

希望这有所帮助。


6
如果你遇到了 "rpmbuild: command not found" 的情况,可以查看 http://wiki.centos.org/HowTos/SetupRpmBuildEnvironment。但对我来说,这个指南是学习 rpm 内部工作的好起点。 - icasimpan
4
在您的示例中,是什么设置了_bindir?我正在尝试按照您的解决方案操作,但我想将我的二进制文件放到/opt目录中。我已经根据此创建了targz文件。但是rpmbuild在buildroot/usr/bin中出现“找不到文件”的错误。 - Kiss Viktoria
sudo dnf install rpm-build -- Fedora 23安装rpmbuild v4.13+的命令 - Ray Foss
1
@devzero2000 你所说的TRUE RPM是什么意思? - RubenLaguna
@devzero2000 rpmbuild文件夹应该在/根目录下,还是我可以将其放在其他地方? - Diogo Calazans
显然不再适用于rpm 4.14版本(Fedora 29):/home/me/rpmbuild/tmp/rpm-tmp.EOYOmf: line 39: $'\r': command not found - villapx

22
作为应用程序分发者,fpm非常适合您的需求。 这里有一个示例展示了如何从源代码打包应用程序。 FPM可以生成deb文件和RPM文件。

我们在工作中经常使用这个工具。迄今为止,最实用的工具来满足需求。 - djhaskin987
2
FPM在软件方面拥有最好的基本原则:如果它没有帮助,那就是一个bug。这是我珍视的承诺。 - ribamar

17

想要快速构建RPM?试试Togo:

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

这个项目有一个快速入门指南,并且我能够在不到3分钟的时间内创建一个基本的RPM。

使用原始问题中提供的数据的示例:

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目录中。

将示例更新以匹配原始问题中提供的情景。 - dadealeus

16

类似地,我需要创建一个包含少量文件的rpm。由于这些文件受到源代码控制,而且因为这样做似乎很愚蠢,我不想将它们打成tar包再让rpm解压缩。因此,我想出了以下方法:

  1. 配置环境:

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

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

  2. 创建名为foobar.spec的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. 构建您的rpm包: rpmbuild -bb foobar.spec

这里有一个小技巧,将“source”指定为当前目录,但它似乎比备选方案更优雅,我的备选方案是编写一个单独的脚本来创建tar包等等。

注意:在我的特定情况下,我的文件被按照需要放置的位置排列在文件夹中,如下所示:

./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,rpm版本为4.4.2.3,因此你的情况可能会有所不同。


我不得不将所有的 $RPM_BUILD_ROOT 替换成 %{buildroot} 才能在我的 "Red Hat Enterprise Linux Server release 6.9" 上使其工作。此外,当我运行 rpmbuild 时,这两个已安装文件必须在当前目录中。我使用以下命令在另一台机器上安装它:sudo rpm -Uvh --nodeps foobar-0.1a-1.x86_64.rpm - user1683793

5

以下是一种简单的方法,可以从二进制文件构建rpm包(这些步骤已在Fedora 18上进行测试):

1) 首先你需要安装rpmdevtools,因此请运行以下命令(注意:以普通用户身份运行)

$ sudo yum install rpmdevtools rpmlint
$ rpmdev-setuptree

2) 在~/rpmbuild/SPECS文件夹中创建一个新文件:package_name.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/package_name-version-release.i386/usr/bin/
  • ~/rpmbuild/BUILDROOT/package_name-version-release.i386/usr/share/applications/
  • ~/rpmbuild/BUILDROOT/package_name-version-release.i386/usr/share/pixmaps/

5)将要插入包中的文件放入这些文件夹中:

  • ~/rpmbuild/BUILDROOT/package_name-version-release.i386/usr/bin/binary_file.bin
  • ~/rpmbuild/BUILDROOT/package_name-version-release.i386/usr/share/applications/package_name.desktop
  • ~/rpmbuild/BUILDROOT/package_name-version-release.i386/usr/share/pixmaps/package_name.png

usr/share/pixmaps/package_name.png是二进制图标 usr/share/applications/package_name.desktop是将程序插入菜单项的规则

6)package_name.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;

这是类别: standards.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/package_name.desktop
  • /usr/share/pixmaps/package_name.png

感谢: losurs.org/docs/tips/redhat/binary-rpms

如需了解更多构建rpm的详细信息,请查看此链接:link.

用于构建rpm的GUI java软件:https://sourceforge.net/projects/javarpmbuilder/


4
如果make config适用于您的程序,或者您有一个Shell脚本可以将两个文件复制到适当的位置,则可以使用checkinstall。只需进入包含Makefile的目录,并使用参数-R(表示RPM)调用它,可选择性地使用安装脚本。

-1
如果您熟悉Maven,那么还有一个名为rpm-maven-plugin的插件可以简化制作RPM的过程:您只需要编写一个pom.xml文件,然后使用该文件来构建RPM。插件会隐式地创建RPM构建环境。

-3
生成RPM的过程从源文件开始:
下载带有.gz扩展名的源文件。 从yum install中安装rpm-build和rpmdevtools。(rpmbuild文件夹将会被生成...SPECS、SOURCES、RPMS..文件夹应该会在rpmbuild文件夹内生成)。 将源代码.gz复制到SOURCES文件夹中。(rpmbuild/SOURCES) 使用以下命令解压tar球。前往包含tar文件的SOURCES文件夹:rpmbuild/SOURCES。命令:例如,tar -xvzf httpd-2.22.tar.gz。httpd-2.22文件夹将在相同路径下生成。 前往提取的文件夹,然后键入以下命令:./configure --prefix=/usr/local/apache2 --with-included-apr --enable-proxy --enable-proxy-balancer --with-mpm=worker --enable-mods-static=all(.configure可能因要构建RPM的源而异——我已经为需要apr和apr-util依赖软件包的apache HTTPD做了配置)。 成功配置后运行以下命令:make 执行make命令成功后,在相同的文件夹中运行checkinstall。(如果您没有checkinstall软件,请从网站下载最新版本)。同时,checkinstall软件存在错误,可以按照以下方式解决:locate checkinstallrc,然后使用vim命令将TRANSLATE = 1替换为TRANSLATE=0。还要检查排除软件包:EXCLUDE="/selinux" checkinstall将要求您选择选项(如果要为源文件构建rpm,请输入R) 完成。.rpm文件将在rpmbuild/RPMS文件夹中构建... 祝您好运....

-5

RPM通常是从源代码构建而来,而不是二进制文件。

您需要编写规范文件,涵盖如何配置和编译您的应用程序;还要确定哪些文件包含在您的RPM中。

快速浏览手册可以看到,大部分所需内容都在第8章中介绍--此外,由于大多数基于RPM的发行版都有可用的源代码,因此有成千上万种不同方法的示例供您参考。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接