RPM下的spec文件

2018/12/21 Linux

rpm包的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 编译阶段
    %{__python2} setup.py build
    
  • %install 将软件安装到虚拟根目录 ``` %{__python2} setup.py install -O1 –skip-build –root=$RPM_BUILD_ROOT mkdir -p %{buildroot}%{_sysconfdir}/%{name}/ mkdir -p %{buildroot}%{_bindir}/ mkdir -p %{buildroot}/var/lib/autoinstall mkdir -p %{buildroot}/var/log/autoinstall mv %{name}/initconfig.yaml %{buildroot}%{_sysconfdir}/%{name}/ touch %{buildroot}/var/log/autoinstall/auto_install.log touch %{buildroot}%{_sysconfdir}/%{name}/exec.txt

install -p -D -m 755 %{_builddir}/%{name}-%{version}/bin/* %{buildroot}%{_bindir}/

常用命令:

make DESTDIR=$RPM_BUILD_ROOT install install [options] src ${RPM_BUILD_ROOT}/${dst} #安装配置文件至指定目录,相当于cp建立连接关系等。-

* %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是原始项目)

<span data-type="color" style="color:rgb(0, 0, 255)">或者利用 git命令:</span>

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

git打patch的命令:

git am 000-*.patch ```

Search

    欢迎关注我的微信公众号

    Yannis的程序人生

    Table of Contents