zoukankan      html  css  js  c++  java
  • rpmbuild用法

    利用rpmbuild打包,需要两类文件:1、源码,源码以tar归档进行压缩的源码包,以及一些.patch文件,存放于目录./SOURCES下;2、.spec文件,定义了打包的动作,以及依赖,是打包的最主要类容。

    首先介绍SPEC文件:

    SPEC文件的一些语法: 

    .spec中的条件判断语句有两种:
    1、if结构
    引用
    %if %{str}
    %else
           动作
    %endif
    其中%{str}是条件,0为假,非0为真。
    2、?:结构
    引用
    %{?变量:动作1}动作2
    其中{}用于控制范围,而“?”号和“:”号是分割符,如果要判断条件是非的情况,可以在“?”号前加“!”号。
    此条件与前面的%if有点不同,其只判断变量是否定义,定义了就为真,否则就为假,即使变量定义为0,也为真,并运行后面的语句。

    spec文件的一些定义:  

    Name:  #软件包的名称

    Version:  #软件包的版本号

    Release:  #发布的序列

    Epoch:  #发布的序列

    Summary:  #摘要

    Group:  #组描述

    License:  发行许可证

    Sources[0-n]:  #打包的源码包

    Patch0:  *.patch      #补丁文件

    BuildRequires:  #打包时依赖的软件

    Requires:  #安装此rpm包时依赖的软件包

    BuildRoot:  #安装此软件的虚拟根目录

    以上是描述性的元素,其中Epoch:Version:Release表示了rpm包的新旧,优先级依次降低,打出的rpm包也是以${package}-${Version}-${Release}命名。

    spec文件主体内容:

    spec文件中引用的一些宏变量主要定义在/usr/lib/rpm/macros中

    主要有三个阶段:

    %pre

    #预处理阶段,解压缩软件包

    %setup 

    %setup 不加任何选项,仅将软件包打开。 
    %setup -n newdir 将软件包解压在newdir目录。 
    %setup -c 解压缩之前先产生目录。 
    %setup -b num 将第num个source文件解压缩。 
    %setup -T 不使用default的解压缩操作。 
    %setup -T -b 0 将第0个源代码文件解压缩。 
    %setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。 
    %patch 最简单的补丁方式,自动指定patch level。
    %patch0 -p0 打第1个补丁,利用当前相对路径名称
    %pacth1 -p2 打第2个补丁,忽略补丁文件第一层目录
    %patch 0 使用第0个补丁文件,相当于%patch ?p 0。
    %patch -s 不显示打补丁时的信息。 
    %patch -T 将所有打补丁时产生的输出文件删除。
    

      

    %build 编译阶段

    ./configure  --prefix=$RPM_BUILD_ROOT/usr
    make    
    or
    %configure            #可以用rpm –eval '%configure'命令查看该宏
    make

    在openstack项目中直接是:python setup.py build

    %install 将软件安装到虚拟根目录

    常用命令:

    make DESTDIR=$RPM_BUILD_ROOT install

    install [options] src ${RPM_BUILD_ROOT}/${dst} #安装配置文件至指定目录,相当于cp

    建立连接关系等。

    在openstack 项目中:

    %{_python2} setup.py install -01 --skip-build --root %{buildroot}

    %clean

    清理一些临时文件,或是生产中不需要的文件

    %files [name]

    文件和目录的归档,rpm包真正包含的内容,$name 与package name对应,一个package生成一个rpm包,名字${name}-¥{version}-${release}.rpm。若没有name,则即是spec Name项。

    files是相对路径,应用宏或变量表示相对路径

    如果描述为目录,表示目录中除%exclude外的所有文件。
    %defattr (-,root,root) 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755

    %changelog 变更日志

    一般会把git log记录输入,openstack文件中记录的日志:

    git rev-parse --abbrev-ref HEAD >> *.spec

    git log --pretty=oneline --abbrev-commit | head -n +1 >> *.spec

     #生成patch的命令

    diff -Naur path/to/A_Project  path/to/B_Project > Project.patch (A是原始项目)

    或者利用 git命令:

    #new 是有更改的分支,old是没有更改的分支
    git checkout new
    git format-patch -M old
    
    生成:000-*.patch
    

    git打patch的命令:

    git am 000-*.patch

    #解析rpm包

    rpm -qpl *.rpm #列出rpm包包含的内容

    rpm2cpio *.rpm | cpio -div  #解压缩出rpm包

    yum-duilddep *.spec 安装spec文件中的所有编译依赖软件,BuidRequires。

    rpmbuild --define "_topdir ${dir:-/home/rpmbuild}" -bb *.spec

    _topdir指定打包的目录,rpmbuild/{SURCES,BUILD,BUILDROOT,SPECS,RPMS,SRPMS}。

    也可以向spec文件传入参数,也是利用--define

  • 相关阅读:
    zombie处理
    exec
    fork
    udp program
    PS中进程状态
    关闭socket连接最好的方法
    setsockopt
    【Python】Webpy 源码学习
    web.py 安装
    WSGI、flup、fastcgi、web.py的关系
  • 原文地址:https://www.cnblogs.com/zhang-wen/p/6070626.html
Copyright © 2011-2022 走看看