参考:

        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下载中心了,欢迎排错