参考:
http://rpm-guide.readthedocs.io/en/latest/rpm-guide.html
http://laoguang.blog.51cto.com/6013350/1103628
http://blog.csdn.net/u013639526/article/details/52355081
rpm制作简介:
rpm包的制作时由rpmbuild这个软件包来实现的,rpmbuild的工作流程大概是这样的:
1.找到源码包,加压并拷贝到编译工作车间(官方文档的翻译,其实就是一个专门用来编译的目录)
2.在编译工作车间中编译程序,并把编译结果拷贝到临时的目录中
3.对编译后的程序进行打包,把rpm包和srpm包分别拷贝到对应目录
上面的流程都是在一个以.spec结尾的文件指导下完成的,所以说.spec是整个过程的灵魂人物,它决定了解压前后的操作,源码的编译参数等等。可以说rpmbuild是一个框架,而.spec就是具体实现,rpmbuild在.spec的指导下对编码进行编译打包最后生成rpm包。
通过上面的流程,我们也不难知道为什么rpmbuild需要以下几个目录:
SPECS:存放spec文件
SOURCES:存放源码包和补丁等,rpmbuild会在这里寻找源码
BUILD:工作车间,也是源码编译的路径,在这个目录下进行编译
RPMS:存放编译好后的rpm包
SRPMS:存放编译好后的srpm包
BUILDROOT:临时存放编译完的结果(这个不是官网说的必备的目录,因为只是临时存放,打包完成后会被删除,必备目录是上面5个,我个人觉得有必要拿出来说下,方便理解工作流程)
安装rpmbuild包的时候,默认在家目录会生成以上5个目录
(注意:在使用rpmbuild的时候,要使用非管理员账户进行制作,这是为了避免spec中使用了不安全的指令导致意外)
rpmbuild --showrc可以查看所有的rpmbuild的环境变量,比如builddir表示工作车间的目录位置等等,这些变量我们都可以修改以下文件修改(内容来自rpmbuild的man文档):
/usr/lib/rpm/macros
/usr/lib/rpm/redhat/macros
/etc/rpm/macros
~/.rpmmacros
rpmbuild从/usr/lib/rpm/macro开始往下到~/.rpmmacros依次读取配置,如果配置一样,则后面的配置会覆盖前面的配置,也就是说,如果我们想修改rpmbuild的环境变量,我们最好在当前用户的家目录底下建个.rpmmacros文件,它的语法也很简单:
%VARIABLE_NAME VALUE
例如:
%_topdir %(echo $HOME)/rpmbuild
值可以引用变量,#开头表示注释
httpd 2.4的打包:
系统:centos 6.5 64位
1.安装rpm编译环境
yum install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils -y
2.把源码包放进SOURCES中
cd /usr/local/src
wget http://mirror.bit.edu.cn/apache//httpd/httpd-2.4.27.tar.bz2
wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.6.2.tar.gz
wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.0.tar.gz
tar xf httpd-2.4.27.tar.bz2
tar xf apr-1.6.2.tar.gz
mv apr-1.6.2 httpd-2.4.27/srclib/apr
tar xf apr-util-1.6.0.tar.gz
mv apr-util-1.6.0 httpd-2.4.27/srclib/apr-util
tar -jcvf httpd-2.4.27.tar.bz2 httpd-2.4.27 #这里之所以解压并重新归档压缩,是因为httpd依赖于apr,在.spec中指定这个过程比较麻烦,所以我就直接这么做了
mv httpd-2.4.27.tar.bz2 ~/rpmbuild/SOURCES
mv httpd-2.4.27/build/rpm/httpd.init ~/rpmbuild/SOURCES #这个是为了给rpm包提供个启动脚本
[root@cqhdtest]#vi ~/rpmbuild/SOURCES/httpd
HTTPD=/usr/local/apache2.4/bin/httpd
PIDFILE=/usr/local/apache2.4/logs/httpd.pid
#这个是为了提供给启动脚本httpd的配置,请根据自己实际情况来,这里我因为要把httpd安装在/usr/loacl/apache2.4/中所以这么做
3.编写spec文件(内容的解释参考http://laoguang.blog.51cto.com/6013350/1103628,懒得再写)
[root@cqhdtest SPECS]# vi httpd2.4.spec
Name: httpd Version: 2.4.27 Release: 1%{?dist} Summary: a rpm package made by linzb 2017.7.6 License: GPL URL: httpd-2.4.27.tar.bz2 Source0: httpd-2.4.27.tar.bz2 Source1: httpd Source2: httpd.init BuildRequires: gcc BuildRequires: make %description a web server %prep %setup -q %build rm -rf %{buildroot} ./configure --prefix=/usr/local/apache2.4 --sysconfdir=/etc/httpd/conf --with-included-apr --with-included-apr-util --enable-mpms-shared=all make %{?_smp_mflags} %install %make_install %{__install} -p -D %{SOURCE1} %{buildroot}/etc/sysconfig/httpd %{__install} -p -D %{SOURCE2} %{buildroot}/etc/rc.d/init.d/httpd %post if [ $1 == 1 ];then /sbin/chkconfig --add httpd fi %files /etc /usr %changelog * Tue May 31 2016 linzb <[email protected]> - 1.0-1 - First httpd 2.4 package
4.执行打包并测试安装
cd ~/rpmbuild/SPECS
rpmbuild -bb httpd2.4.spec
#如果没出错的话会在~/rpmbuild/RPMS下的对应架构目录下生成两个rpm包,一个是我们要的,一个是debug信息包,比如这里我生成了:
[root@cqhdtest SPECS]#ls ../RPMS/x86_64/
httpd-2.4.27-1.el6.x86_64.rpm
httpd-debuginfo-2.4.27-1.el6.x86_64.rpm
最后把包拷贝到对应平台安装测试即可
debug:
1.编译过程中提示: 'check-rpaths' detected a broken RPATH and will cause 'rpmbuild'
* to fail. To ignore these errors, you can set the '$QA_RPATHS'
解决方法:
[root@cqhdtest SPECS]# vi ~/.rpmmacros
%_topdir %(echo $HOME)/rpmbuild
%_smp_mflags -j3
#%__arch_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot #注销掉这行即可
2.编译完成的包,提示/etc/init.d conflict with chkconfig字样
解决:启动脚本install的时候,安装到/etc/rc.d/init.d下
3. %file段的目录问题
file段的目录都是相对于buildroot这个变量指定的路径的,也就是类似于chroot命令效果,如果你写/etc相当于真实路径为%{buildroot}/etc
编译好的包我放在51cto下载中心了,欢迎排错