How to Build a RPM package for Redhat/Fedora Linux (二)
------------------
How to Build a RPM package for Redhat/Fedora Linux
下边开始制作RPM包
1. 首先从官方站(一般是.org站)下载Source Code的压缩包,他们的扩展名通常是.tar.gz的。最好check一下MD5保证是正确的。把下载的包放到下边的目录。
/usr/src/redhat/SOURCE
一个或者多个源代码包可以同时放在这个目录里。
2. 下载Patch。通常开源软件都需要打一些安全补丁,即Patch,即使是最新版也如此。我们同样需要下载这些patch。无论有多少patch,也都放到下边的目录。
/usr/src/redhat/SOURCE
3. 准备配置文档。在安装前,我们可以先把配置文档修改好了,然后和编译好的源码一起做成RPM。安装时候,这些配置文档就会自动放到相应位置,替代原有的默认配置文档。比如Apache的httpd.conf,我们将他改好之后,复制到下边的位置。
/usr/src/redhat/SOURCE/httpd.conf-dist
4. 接下来要做SPEC文件了,整个过程中最重要的部分。
我们把编写好的SPEC文件放在这里:/usr/src/redhat/SPECS。
SPEC文件通常分为如下几个部分:
文件头
description
prepare
build
install
files
文件头部分如下:
Summary: The most widely used web server on the Internet.
Name: apache
Version: 1.3.31
Release: 2
Group: System Environment/Daemons
Source: apache_1.3.31.tar.gz
Source1: mm-1.3.0.tar.gz
Source2: openssl-0.97d.tar.gz
Source2: mod_ssl-2.8.19-1.3.31.tar.gz
Source3: httpd.conf-dist
Patch0: apache_1.3.31_CAN-2004-0492.patch
License: Apache Group License
Provides: webserver
Conflicts: apache, httpd
BuildRoot: /tmp/apache
BuildRequires: openssl-devel
Requires: openssl, mm, redhat-release >= 9
在Source字段中,要要把/usr/src/redhat/SOURCE目录下的源码包的文件全名写清。如果有多个文件,就用Source0、Source1这种格式写上。然后在patch中写上相关patch的名字,如果有多个patch,则格式和Source一样,可以写多个。其余字段都是必须,不可缺少。
mm是apache以DSO(动态模块)方式工作必须的库,openssl则是mod_ssl必须的库。httpd.conf-dist是实现修改好了的配置文档,在安装完成后要覆盖默认配置文档的。
Description部分如下:
%description
Apache is a powerful, full-featured, efficient and freely-available web server. Apache is also the most popular web server on the Internet.
Description部分是对当前软件的描述。
Prepare部分如下:
%setup -q -n apache_1.3.31
%patch0 -p0 -b .CAN-2004-0492
%setup -q -T -D -b 1 -n mm-1.3.0
%setup -q -T -D -b 2 -n openssl-0.97d
%setup -q -T -D -b 3 -n mod_ssl-2.8.19-1.3.31
Prepare这一部分中,将把N个源码包都解压缩到/usr/src/redhat/BUILD目录下,并且将patch应用于apache。
-q表示不输出结果,-n表示指定文件解压缩后的目录名,-b 1表示第一个source,-b 2表示第二个source。其他参数可以查找前文所说的MAX-RPM文档。
Build部分如下:
%build
# Build for Source1: mm-1.3.0
cd ../mm-1.3.0
./configure --disable-shared
make# Build for Source2: openssl-0.97d
cd ../openssl-0.97d
sh config -fPIC
make# Build for Source3: mod-ssl-2.8.19-1.3.31
cd ../mod_ssl-2.8.19-1.3.31
./configure --with-apache=../apache_1.3.31# Build for Source: apache_1.3.31
EAPI_MM=../mm-1.3.0 \
SSL_BASE=../openssl-0.97d \
./configure --prefix=/usr/local/apache \
--enable-shared=max \
--enable-module=most
make
make certificate TYPE=dummy
build部分就完成了。这个过程中,分别进入了3个源码的目录,进行了配置(configre)和编译(make),但是不要安装(make install),安装是在下一个部分完成的。
编译apache的时候,需要提供mm和openssl的路径。而make certificate TYPE=dummy这个操作则是生成ssl所需要的证书。
2004-08-07更新:在freebsd 4.10系统下,编译apache时候无需设置EAPI_MM和SSL的位置。
下边是安装过程。
%install
make install root=$RPM_BUILD_ROOT# Install for httpd.conf-dist
install -m 600 $RPM_SOURCE_DIR/httpd.conf-dist $RPM_BUILD_ROOT/usr/local/apache/conf/httpd.conf
安装过程中的$RPM_BUILD_ROOT就是在头文件中BuildRoot字段指定的目录,我们这个例子是/tmp/apache,这样这些编译好的文件不会被安装到硬盘上的真实目录(/uer/local/apache)中,而是放在一个临时目录中。RPM包生成结束后,这个目录会被自动删除。
变量$RPM_SOURCE_DIR不需要指定,系统会自动认为是/usr/src/redhat/SOURCE目录。
同时我们将刚才的httpd.conf-dist安装到/usr/local/apache/conf/httpd.conf,省去安装好后手动修改配置文件中大量内容的烦恼。
最后一个部分是把安装在临时目录里的所有文件打包。
%files
/usr/local/apache
%files部分参数是最丰富的,可以新建空目录,包含所有文件整个目录打包。还可以决定安装时候如果遇到重名文件,是覆盖还是改名。本例中最简单的方法就是整个目录做成一个包。
还有一些附加工作:
%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT%changelog
* Fri Oct 23 2004 Pcman <pcman@mail.biti.edu.cn>
- patch for apache_1.3.31-CAN-2004-0492
Clean部分就是清场了,changelog则是历史记录。
SPEC文件编辑好之后,来生成rpm包。
5.生成rpm包。
rpmbuild -ba /usr/src/redhat/SPESC/apache.spec
然后就是漫长等待了,openssl的编译很慢,P4 1.8G的机器几分钟的说……
完成之后,将生成2个文件:
/usr/src/redhat/PRM/i386/apache-1.3.31-2.rpm
/usr/src/redhat/SRPM/apache-1.3.31-2.src.rpm
PRM目录中的apache-1.3.31-2.rpm就是我们的最终RPM包,可以cp出来使用了。SRPM目录中的src.rpm则是源码包,它包含了编译这个包所需要的所有source code和SPEC文件。
redhat linux在提供RPM包的同时,还提供了这些包的SRPM。我们可以参考SRPM中的SPEC文件的制作过程,对学习RPM将是很有帮助的。
[ The END ]