您的位置:首页 > 产品设计 > 产品经理

RPM包制作

2015-10-27 14:46 369 查看
以httplight1.4.32为例

下载源码包http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.32.tar.gz

安装依赖

sudo yum install -y pcre-devel bzip2-devel


创建rpm目录

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


编写httplight.spec文件

%define _topdir /home/media/Public/rpmbuild
Name:   lighttpd
Version:    1.4.32
Release:    1%{?dist}
Summary:    A light http server

Group:      Development/Tools
License:    BSD
URL:        http://www.lighttpd.net/ Source0:    %{name}-%{version}.tar.gz

Prefix: /usr/local
BuildRoot:  %{_topdir}/BUILDROOT/%{name}-%{version}-%{release}%{?dist}.%{_arch}
BuildRequires:  pcre-devel>=8
Requires:   pcre>=8

%description
Lighttpd is a secure,fast,compliant and very flexible
web-server that has been optimized for high-performance environments.

%prep
%setup -q

%build
./configure --prefix=%{prefix} --libdir=%{prefix}/lib64
make %{?_smp_mflags}

%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT

%files
%defattr(-,root,root,-)
%{prefix}/sbin/lighttpd
%{prefix}/sbin/lighttpd-angel
%{prefix}/lib64/*.so
%{prefix}/lib64/*.la
%{prefix}/share/man/man8/lighttpd.8


执行命令

cd ~/Public/rpmbuild/
rpmbuild -ba SPECS/lighttpd.spec


一个spec文件有多个”段”: 定义段,描述段,预处理段,构建段,安装段,打包段。

定义段

在#号后面接一个空格的是注释

定义一个变量 “_topdir”, 后面出现”%{_topdir}” 就是对变量的引用。_topdir变量由rpm内部提供,不定义也有默认值。

“标签: 值”,就是一个rpm的基本信息,

例子中”%{name}”来引用”Name”标签的值,标签名不区分大小写 , 但是应用它的变量有些必须全部是小写字母,而有些必须全部是大写字母。比如”Source”标签的引用是”%{SOURCE}”。

标签名不能乱写,必须是rpm中定义的才行。

比较重要的是”Source”和”BuildRoot”标签。 Source标签规定源代码的名称或来源, BuildRoot标签规定rpm在什么地方找到编译好的二进制文件或者其他需要安装的文件,并打包到rpm文件中。

“BuildRequires”标签用于描述打包阶段依赖的软件包,在本例中是pcre-deve, “Requires”标签用于描述在安装rpm包的时候依赖的软件包,本例中是pcre。如果需要依赖多个软件包,也可以在这两个标签后面直接书写,用空格隔开即可。很多时候为了代码的可读性,可以书写多个标签。

比较特殊的是”%{?dist}” 这个变量的引用。在处理不知道是否定义过的变量时,尤其是rpm内置的变量,使用问号”?” 这时候引用变量定义过就引用, 没有定义过就得到空值。

描述段

“%description”下面的内容是对rpm包的描述信息。 使用”rpm -qi”命令查询到的信息就是定义段和描述段中的一些内容。

预处理段

“%prep”代表预处理段的开始。这个段的作用是整理代码,比如解压缩源代码包,给源代码打patch等。rpm不要求源代码一定要放在SOURCES子目录下,可以通过网络下载。

例子中标签是”Source0”。rpm允许将多份源代码制作成一个包。如果有多份源代码,可以在Source后面添加数字,比如”Source1”, “Source2”等。实际使用中”Source0”和”Source”等价。

“%setup -q”是预处理的一个宏。它会根据”Source”标签的值决定自己是什么。在本例中执行结果如下:

Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.S13c05
+ umask 022
+ cd /home/media/Public/rpmbuild/BUILD
+ cd /home/media/Public/rpmbuild/BUILD
+ rm -rf lighttpd-1.4.32
+ /usr/bin/gzip -dc /home/media/Public/rpmbuild/SOURCES/lighttpd-1.4.32.tar.gz
+ /usr/bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd lighttpd-1.4.32
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0


从这些命令的基本含义上看,就是解压缩lighthttpd-1.4.32.tar.gz这个文件,并进入到解压缩后所产生的目录中。至于”-q”这个参数,它就是让”%setup”所产生的命令能够以静默的方式解压,不输出任何内容。

如果多份源代码,可以使用”-b” 或 “-a”选项,选项参数就是”Source”标签后面的数字,比如”%setup -b 1”就是解压”Source1”的。

构建段

“%build”代表了构建段,也就是编译源代码。它下面就是”configure”和”make”的过程。

在构建段中应该传递给configure足够用的参数。我们想如何安装,就给定什么样的参数,具体都应该设置那些参数,可以参考软件所附带的README文档。

在本例中,构建段的make %{?_smp_mflags} 这样的变量引用,它代表了make的并行编译选项,在我机器中,变量值是”-j4”。

安装段

“%install”是安装段,它与我们正常安装软件的方式不同,要求将软件安装到rpm指定的目录中,在本例中使用”DESTDIR=$RPM_BUILD_ROOT”这个参数的原因。

在这里”$RPM_BUILD_ROOT”的这个变量。它实际上是”BuildRoot”标签的值。

打包段

“%files%”是打包段,它实际上就是一个要打包的文件列表。 “%defattr”宏描述了各文件的默认权限。

编写文件列表的时候,使用的路径是相对于BuildRoot的。如果去掉BuildRoot,就是实际要安装的路径了。rpm也是这么做的。它从相对于BuildRoot的路径来读取文件进行打包,而安装的时候会去掉BuildRoot。

结论

每个rpm包都有一个spec文件与之对应。

预处理段,构建段和安装段的内容可以包含一些宏和Shell命令,而宏最终会去执行一些Shell命令。其他段不能包含Shell命令。

rpm打包过程中最重要的是BuildRoot这个标签所描述的路径。它是打包过程中,rpm所有要打包的文件的跟路径。而相对于它的那些路径,实际上是安装安装时的路径组织的。rpm在安装软件的时候,去掉BuildRoot就可以了。

软件编译过程和使用源代码安装软件的编译过程是一样的。只是安装的时候有一些差别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: