• 实战RPM包制作


      在开发中经常会用到一些rpm包,但是一直没有自己手动制作过。今天在制作的时候意外地还解决了自己以前一直困惑的问题,就是怎么制作rpm debuginfo包,类似CentOS官网那样的debuginfo包。原来在制作rpm时如果没有特殊设置就会在RPMS目录下同时生成rpm包及对应的debuginfo包。
      下面总结一下制作rpm包的流程以及遇到的一些问题的解决。
      1、配置工作路径
      在制作rpm包之前,首先要配置工作路径,也就是制作rpm包所在的目录,当前的工作路径可以通过rpmbuild命令查看,如下所示:


      工作路径是由_topdir变量指定的,默认情况下是当前用户目录下的rpmbuild目录。如果你在制作rpm包之前不知道需要设置工作路径的话,只是单纯地照搬网上的一些文章,在后面制作的时候很有可能会报找不到源码包等类似的错误。如果你不想在用户目录下的rpmbuild目录制作rpm包,可以在当前用户目录下的.rpmmacros文件(如果没有,则创建)中修改,格式为:
    % _topdir 你的目录
    我这里设置的是/usr/src/redhat,后面的制作过程都是在这个目录下进行。
      默认情况下会生成debuginfo包,如果不需要debuginfo包,在.rpmmacros文件中添加"%debug_package %{nil}"。
    2、建立所需要的目录
    mkdir -pv /usr/src/redhat/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
     目录说明:


    3、编写spec文件

      spec文件是制作rpm包的关键,定义了rpmbuild命令生成时需要遵循的一些规则。下面的spec文件是以nginx为例来制作rpm包:

    # 这个区域定义的Name、Version这些字段对应的值可以在后面
    # 通过%{name},%{version}这样的方式来引用,类似于C语言中的宏
     
    # Name制定了软件的名称
    Name:       nginx
    # 软件版本
    Version:    1.5.2 
    # 释出号,也就是第几次制作rpm
    Release:    1%{?dist}
    # 软件的介绍,必须设置,最好不要超过50个字符
    Summary:    Nginx from WangYing
     
    # 软件的分组,可以通过/usr/share/doc/rpm-4.8.0/GROUPS文件中选择,也可以
    # 在相应的分类下,自己创建一个新的类型,例如这里的Server
    Group:      Application/Server
    # 许可证类型
    License:    GPL
    # 软件的源站
    URL:        http://nginx.org
    # 制作rpm包的人员信息
    Packager:   WangYing <justlinux2010@gmail.com>
    # 源码包的名称,在%_topdir/SOURCE下,如果有多个源码包的话,可以通过
    # Source1、Source2这样的字段来指定其他的源码包
    Source0:    %{name}-%{version}.tar.gz
    # BuildRoot指定了make install的测试安装目录,通过这个目录我们可以观察
    # 生成了哪些文件,方便些files区域。如果在files区域中写的一些文件报
    # 不存在的错误,可以查看%_topdir/BUILDROOT目录来检查有哪些文件。
    BuildRoot:  %_topdir/BUILDROOT
    # 指定安装的路径
    Prefix:     /usr/local/nginx-1.5.2
     
    # 制作过程需要的工具或软件包
    BuildRequires:  gcc,make
    # 安装时依赖的软件包
    Requires: pcre,pcre-devel,openssl
     
    # 软件的描述,这个可以尽情地写
    %description
    Nginx is a http server
     
    # %prep指定了在编译软件包之前的准备工作,这里的
    # setup宏的作用是静默模式解压并切换到源码目录中,
    # 当然你也可以使用tar命令来解压
    %prep
    %setup -q
     
    # 编译阶段,和直接编译源代码类似,具体的操作或指定的一些参数由configure文件决定。
    %build
    CFLAGS="-pipe -O2 -g -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror" ./configure --prefix=%{prefix}
    # make后面的意思是:如果是多处理器,则并行编译
    make %{?_smp_mflags}
     
    # 安装阶段
    %install
    # 先删除原来的测试安装的,只有在制作失败了%{buildroot}目录才会有内容,
    # 如果成功的话,目录下会被清除。
    # %{buildroot}指向的目录不是BuildRoot(%_topdir/BUILDROOT)指定的目录,
    # 而是该目录下名称与生成的rpm包名称相同的子目录。例如我的是
    # /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64
    rm -rf %{buildroot}
    # 指定安装目录,注意不是真实的安装目录,是在制作rpm包的时候指定的
    # 安装目录,如果不指定的话,默认就会安装到configure命令中指定的prefix路径,
    # 所以这里一定要指定DESTDIR
    make install DESTDIR=%{buildroot}
     
    # 安装前执行的脚本,语法和shell脚本的语法相同
    %pre
     
    # 安装后执行的脚本
    %post
     
    # 卸载前执行的脚本,我这里的做的事情是在卸载前将nginx服务器停掉
    %preun
        MSG=`ps aux | grep nginx | grep -v "grep"`
        if [ -z "$MSG" ];then
            killall nginx 1>/dev/null 2>/dev/null
        fi
     
    # 卸载完成后执行的脚本
    %postun
        rm -rf %{prefix}
     
    # 清理阶段,在制作完成后删除安装的内容
    %clean
    rm -rf %{buildroot}
     
    #指定要包含的文件
    %files
    #设置默认权限,如果没有指定,则继承默认的权限
    %defattr  (-,root,root,0755)
    %{prefix}

    如果在制作的过程中报类似下面的错误,检查你的files区域,看要包含的文件是否存在。

    + /usr/lib/rpm/check-buildroot
    + /usr/lib/rpm/redhat/brp-compress
    + /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
    + /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
    + /usr/lib/rpm/brp-python-bytecompile
    + /usr/lib/rpm/redhat/brp-python-hardlink
    + /usr/lib/rpm/redhat/brp-java-repack-jars
    Processing files: nginx-1.5.2-1.el6.x86_64
    error: File not found: /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64/usr/local/nginx
     
     
    RPM build errors:
        File not found: /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64/usr/local/nginx
    
    
  • 相关阅读:
    读《暗时间》
    文献笔记8
    文献笔记4
    文献笔记2
    文献笔记5
    文献笔记6
    文献笔记1
    文献笔记3
    读《暗时间》2
    文献笔记7
  • 原文地址:https://www.cnblogs.com/pangblog/p/3253529.html
Copyright © 2020-2023  润新知