rpm是redhat(系列)系统软件安装,管理的工具。相对于针对仓库而言的yum,rpm是针对单个软件包的。通常情况下Linux发布软件是通过源代码方式,一般情况下就是对源码./configure, make,make install。除了这种方式外,比较常用的就是rpm包,它则可提供完整的已经编译好的二进制程序或者其它东西(帮助文件,源码等)。这里不说.deb。
rpm的使用不说,直接看帮助,常用的就是-qa, -e,-ivh等几个选项。
下面说说rpm包的制作(在制作过程中发现并不是那么顺利,还不如用源代码方式发布),制作是用rmpbuild这个命令完成的。这里仅说下简单的制作以供以后参考。
rpm包的结构一般为: name-version-release.architecture.rpm
name-version-release | 命名版本号之类的,如MySQL-server-5.0.i386.rpm |
architecture | 适用的结构,如i386, i686, x86_64, noarch |
RPM系统要求有以下几个文件夹(如果是安装系统的时候安装了rmpbuild, 则在redhat系列是在/usr/src/redhat, 如果自行安装的话,可能在你的主目录的rpbbuild的目录下面)。
BUILD | rpmbuild在此目录构建软件 |
RPMS | rmpbuild存储生成的二进制rpm文件目录 |
SOURCES | 所要构建软件的源码 |
SPECS | SPECS文件所在的目录 |
SRPMS | rmpbuild存储生成的src rpm包的目录 |
rpmbuild最重要的是书写SPECS文件,写好的specs文件丢到SPECS目录(也可以不用)。SPECS比较烦琐,下面列出一些常用的,但不完全(#开头表示注释)。
Summary | 软件包简要的描述 |
Name | 软件包名称 |
Version | 软件包定义的版本 |
Release | 软件包发布版本 |
License | 软件包许可 |
Group | 软件包分类(在GNOME应用程序可看到)如Applications/Media |
Source | 软件包源码下载地址 |
URL | 源码相关网站 |
Distribution | 发行版系列 |
Packager | 打包人的信息 |
Requires | 如 mysql >= 3.30 或者 mysql |
sources | 源码tar包,可以这样设置为通用的:%{name}-%{version}.tar.gz |
Buildroot | rmpbuild的暂存区,可以设置为通用的:%{_tmppath}/%{name}-%{version}-root |
%description | 软件详细描述,可多行 |
%prep | 软件编译之前的处理,如解压 |
%setup | 不知道什么用,不过通常在%prep下面%setup -q |
%build | 开始编译软件,如make |
%install | 开始安装软件,如make install |
%makeinstall | 调用Makefiel的make install |
%clean | rmpbuild的clean命令 |
%post | rmpbuild构建完成的命令 |
%files | 要打包的文件 |
如果用VIM新建.spec文件,在新建的时候会弹出相应的模板给你填,这个不错。
rmpbuild的编译选项大致有下面几种类型:
-ba | 构建所有的东西,包含二进制和源码的RPM |
-bb | 构建二进制的RPM |
-bc | 构建(编译)程序,但不生成RPM |
-bp | 准备构建RPM |
-bi | 构建二进制的RPM并安装之 |
-bl | 检查RPM文件列表 |
-bs | 构建源码的RPM |
一人简单的例子:
Name: jmm
Version: 1.0
Release: 1
Summary: Process pool server
Group: Applications/Internet
License: LGPL 2.0
URL: www.google.com
Source0: jmm-1.0.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
#BuildRequires:
#Requires: libevent >= 2.0
%description
Process pool server base on libevent
%prep
%setup -q
%build
make
%install
mkdir -p %{buildroot}/usr/local/bin
#make install DESTDIR=%{buildroot}
install -m755 jmm %{buildroot}/usr/local/bin/jmm
%clean
rm -rf %{buildroot}
%files
/usr/local/bin/jmm
#%defattr(-,root,root,-)
#%doc
我的机子是x86_64的,在我机子上运行rmpbuil –ba jmm.spec将在RPMS目录生成x86_64/jmm-1.0-1.x86_68.rpm,在SRPMS目录生成jmm-1.0-1.src.rpm。
要注意一点的就是%files下面的文件是要写buildroot下面的文件。
查看刚才编译的文件信息(PS这个东西是要libevent2的所以,如果安装的话,是会失败的):
[heidong@CLOUD x86_64]$ rpm -qpi jmm-1.0-1.x86_64.rpm
Name : jmm Relocations: (not relocatable)
Version : 1.0 Vendor: (none)
Release : 1 Build Date: Thu Sep 13 07:07:07 2012
Install Date: (not installed) Build Host: CLOUD.NODE.0
Group : Applications/Internet Source RPM: jmm-1.0-1.src.rpm
Size : 45357 License: LGPL 2.0
Signature : (none)
URL : www.google.com
Summary : Process pool server
Description :
Process pool server base on libevent
[heidong@CLOUD x86_64]$ rpm -qpl jmm-1.0-1.x86_64.rpm
/usr/local/bin/jmm
[heidong@CLOUD x86_64]$
查看源RPM的信息:
[heidong@CLOUD SRPMS]$ rpm -qpi jmm-1.0-1.src.rpm
Name : jmm Relocations: (not relocatable)
Version : 1.0 Vendor: (none)
Release : 1 Build Date: Thu Sep 13 07:07:07 2012
Install Date: (not installed) Build Host: CLOUD.NODE.0
Group : Applications/Internet Source RPM: (none)
Size : 17198 License: LGPL 2.0
Signature : (none)
URL : www.google.com
Summary : Process pool server
Description :
Process pool server base on libevent
[heidong@CLOUD SRPMS]$ rpm -qpl jmm-1.0-1.src.rpm
jmm-1.0.tar.gz
jmm.spec
[heidong@CLOUD SRPMS]$
关于源RPM的安装,与编译好的二进制文件不一样,源RPM是要编译的。一般是包含压缩包和SPEC文件。安装后,源码文件是在SOURCE目录,SPEC文件是在SPEC目录。要进得编译方可得到二进制RPM包。
相关文件下载:jmm-1.0-1.src.rpm.zip,由于不支持rpm后辍文件的上传,因此加个ZIP,使用时去掉。