RPM包制作

来源:互联网 发布:xin域名什么意思 编辑:程序博客网 时间:2024/05/23 01:31

以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/rpmbuildName:   lighttpd    Version:    1.4.32Release:    1%{?dist}Summary:    A light http serverGroup:      Development/ToolsLicense:    BSDURL:        http://www.lighttpd.net/Source0:    %{name}-%{version}.tar.gzPrefix: /usr/localBuildRoot:  %{_topdir}/BUILDROOT/%{name}-%{version}-%{release}%{?dist}.%{_arch}BuildRequires:  pcre-devel>=8Requires:   pcre>=8%descriptionLighttpd is a secure,fast,compliant and very flexibleweb-server that has been optimized for high-performance environments.%prep%setup -q%build./configure --prefix=%{prefix} --libdir=%{prefix}/lib64make %{?_smp_mflags}%installrm -rf $RPM_BUILD_ROOTmake 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就可以了。
软件编译过程和使用源代码安装软件的编译过程是一样的。只是安装的时候有一些差别。

0 0
原创粉丝点击