RPM:Redhat Package Manager,现在很多distribution都在用RPM作为系统的包管理器。 所用的平台:RHEL6 64bit
制作RPM包最主要的就是写SPEC文件,完成了SPEC文件,就会用到rpmbuild命令根据SPEC文件制作RPM包。友情链接Linux rpmbuild命令
首先不要用root账号来制作RPM包,因为在制作RPM包的过程中,将会把软件编译和安装到系统中,这样可能会破坏系统。
在制作RPM包的时候,有一些准备工作要做,首先要选择一个一般账号来制作RPM包,然后建立相应的工作目录,定义相应的宏
[rpmbuilder@rhel6164 ~]$ mkdir -p rpmbuild/{BUILD,SOURCES,SPECS,RPMS,SRPMS} #我这里选用rpmbuilder这个一般账号来制作RPM包,建立相应的工作目录
[rpmbuilder@rhel6164 ~]$ cat ~/.rpmmacros #在rpmbuilder账号的home下,新建.rpmmacros文件定义_topdir变量,将会覆盖/usr/lib/rpm/macros中对_topdir的定义
%_topdir /home/rpmbuilder/rpmbuild
现在有工具可以自动完成上面的步骤
[rpmbuilder@rhel6164 ~]$ rpm -qf `which rpmdev-setuptree` #首先需要安装rpmdevtools RPM包
rpmdevtools-7.5-1.el6.noarch
[rpmbuilder@rhel6164 ~]$ rpmdev-setuptree #直接执行rpmdev-setuptree就会新建工作目录和.rpmmacros文件
[rpmbuilder@rhel6164 ~]$ ls rpmbuild/
BUILD RPMS SOURCES SPECS SRPMS
[rpmbuilder@rhel6164 ~]$ cat .rpmmacros
%_topdir %(echo $HOME)/rpmbuild
%_smp_mflags -j3
%__arch_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
当我们在开始写SPEC文件的时候,我们可以直接用命令来创建一个SPEC文件模板,或者直接从相应的目录拷贝一个模板
[rpmbuilder@rhel6164 ~]$ rpmdev-newspec #前提也是要安装rpmdevtools RPM包
Skeleton specfile (minimal) has been created to "newpackage.spec". #一个新的spec文件已经建立
[rpmbuilder@rhel6164 ~]$ ls /etc/rpmdevtools #也可以从这个目录下copy相应的spec模板来修改
devscripts.conf spectemplate-dummy.spec spectemplate-ocaml.spec spectemplate-python.spec template.init
newspec.conf spectemplate-lib.spec spectemplate-perl.spec spectemplate-R.spec
rmdevelrpms.conf spectemplate-minimal.spec spectemplate-php-pear.spec spectemplate-ruby.spec
前期准备工作做完了,我们就来看看制作RPM包过程中最核心部分,写SPEC文件
SPEC文件里面的tag:不区分大小写,可以用%{tag_name}或者%tag_name来调用它,用下面的格式来对tag进行定义
tag_name:value
SPEC文件里面的macros:区分大小写,可用%{macros_name}或者%macros_name来调用它,用下面的格式来对macros进行定义
%define macros_name value
在SPEC文件里面关于RPM包描述最重要的就是NVR,即Name-Version-Release
Name:RPM包的名字
Version:RPM包的版本号
Release:RPM包的发布的序列号,通常情况下就是表明是第几次制作的RPM包
其他一些默认的tag:
Summary:RPM包的简单描述
Group:RPM包分组信息
License:RPM包的license
URL:软件主页
BuildRoot:安装所使用的”虚拟目录“,可以用$RPM_BUILD_ROOT变量来引用
Source:源码包,可以有多个源码包,Source1,Source2,可以使用FTP或者HTTP URLs来命名源码包,不会去下载源码包,仅仅方便以后查询用。
e.g.Source0:ftp://ftp.somesite.com/xxx/xxx.tar.gz
Patch:补丁源码
Requires:RPM包运行时的依赖
BuildRequires:RPM包制作时的依赖
%description:软件的详细说明,要用多行表示,不要用一行表示
SPEC文件主体分成几个部分
%prep:读取%_sourcedir目录中的源码包和patch,执行相应的解压命令,解压到%_builddir目录中
%build:读取%_builddir目录,执行相应的编译命令
%check:检查软件是否正常运行,操作目录都在%_builddir
%install:读取%_builddir目录的文件,安装到%_buildrootdir目录
SPEC文件中默认的宏和其用途:
宏代码 | 名称 | 默认位置 | 用途 |
---|---|---|---|
%_specdir | SPEC文件目录 | ~/rpmbuild/SPECS | RPM包配置的SPEC文件存放的目录 |
%_sourcedir | 源代码目录 | ~/rpmbuild/SOURCES | 存放源代码和patch的目录 |
%_builddir | 编译目录 | ~/rpmbuild/BUILD | 源代码被解压到该目录,在该目录被编译 |
%_buildrootdir | 最终安装目录 | ~/rpmbuild/BUILDROOT | %install阶段最终安装的目录 |
%_rpmdir | 标准RPM包目录 | ~/rpmbuild/RPMS | 二进制RPM包存放目录 |
%_srcrpmdir | 源代码RPM包目录 | ~/rpmbuild/SRPMS | 源代码PRM包存放目录 |