1. RPM构建 - 介绍
2. RPM构建 - SPEC文件参数解析
3. RPM构建 - 简单实例
4. RPM构建 – 源码编译

通常,供Linux使用的源代码包还提供一个名为 { 软件名称 }.spec 的文件,即spec文件。如果提供spec文件,则该源代码还可以直接编译成RPM包。

spec文件只是一个具有特殊语法的文本文件。

spec文件中包含了软件包的诸多信息,如软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作,以及软件包所要包含的文件列表等。

1     文件头

一般的spec文件头包含以下几个域:

1.1   Name

描述:

软件包的名称,后面可使用%{name}的方式引用

格式:

Name:          <software name>

1.2   Version

描述:

软件包的名称,后面可使用%{name}的方式引用软件包版本号,后面可使用%{version}引用

格式:

Version:          <software version>

1.3   Release

描述:

软件包的发行号,后面可使用%{release}引用

格式:

Release:          <software release>

1.4   Packager

描述:

打包的人(一般喜欢写个人邮箱)

格式:

Packager:          lewiyoung@126.com

1.5   License

描述:

软件授权方式,通常是GPL(自由软件)或GPLv2,BSD

格式:

License:          GPL

1.6   Summary

描述:

打包的人(一般喜欢写个人邮箱)

格式:

Packager:          lewiyon@126.com

1.7   Group

描述:

软件包所属类别

格式:

Group:       Applications/Multimedia

具体类别:

  • Amusements/Games(娱乐/游戏)
  • Amusements/Graphics(娱乐/图形)
  • Applications/Archiving(应用/文档)
  • Applications/Communications(应用/通讯)
  • Applications/Databases(应用/数据库)
  • Applications/Editors(应用/编辑器)
  • Applications/Emulators(应用/仿真器)
  • Applications/Engineering(应用/工程)
  • Applications/File(应用/文件)
  • Applications/Internet(应用/因特网)
  • Applications/Multimedia(应用/多媒体)
  • Applications/Productivity(应用/产品)
  • Applications/Publishing(应用/印刷)
  • Applications/System(应用/系统)
  • Applications/Text(应用/文本)
  • Development/Debuggers(开发/调试器)
  • Development/Languages(开发/语言)
  • Development/Libraries(开发/函数库)
  • Development/System(开发/系统)
  • Development/Tools(开发/工具)
  • Documentation (文档)
  • SystemEnvironment/Base(系统环境/基础)
  • SystemEnvironment/Daemons (系统环境/守护)
  • SystemEnvironment/Kernel (系统环境/内核)
  • SystemEnvironment/Libraries (系统环境/函数库)
  • SystemEnvironment/Shells (系统环境/接口)
  • UserInterface/Desktops(用户界面/桌面)
  • User Interface/X(用户界面/X窗口)
  • User Interface/XHardware Support (用户界面/X硬件支持)

1.8   Source0

描述:

源代码包的名字

格式:

Source0:       %{name}-%{version}.tar.gz

1.9   BuildRoot

描述:

编译的路径。是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:

该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作(即%files段)。

后面可使用$RPM_BUILD_ROOT 方式引用。

格式:

BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-buildroot

1.10     URL

描述:

软件的主页

格式:

URL: <web-site>

1.11     Vendor

描述:

发行商或打包组织的信息,例如RedFlagCo,Ltd

格式:

Vendor: <RedFlag Co,Ltd>

1.12     Provides

描述:

指明本软件一些特定的功能,以便其他rpm识别

格式:

Provides: <features>

 

 

2     依赖关系

依赖关系定义了一个包正常工作需要依赖的其他包,RPM在升级、安装和删除的时候会确保依赖关系得到满足。rpm支持4种依赖:

Ø  Requirements, 包依赖其他包所提供的功能

Ø  Provides, 这个包能提供的功能

Ø  Conflicts, 一个包和其他包冲突的功能

Ø  Obsoletes, 其他包提供的功能已经不推荐使用了,这通常是其他包的功能修改了,老版本不推荐使用了,可以在以后的版本中会被废弃。

2.1   定义依赖关系

定义依赖关系的语法是:

Requires: capability

Provides: capability

Obsoletes: capability

Conflicts: capability

大部分时候,capability应该是所依赖的包的名称。一行中也可以定义多个依赖,比如:

Requires: tbsys tbnet

2.2   指定依赖的版本号

在指定依赖关系的时候还可以指定版本号,比如:

Requires: tbsys >= 2.0

rpm支持的比较如下:

2.3   Requires

描述:

所依赖的软件包名称, 可以用>=或<=表示大于或小于某一特定版本。 “>=”号两边需用空格隔开,而不同软件名称也用空格分开。

格式:

Requires:       libpng-devel >= 1.0.20 zlib

其它写法例如:

Requires: bzip2 = %{version}, bzip2-libs =%{version}

Requires: perl(Carp)>=3.2       #需要perl模块Carp

还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定。

例如:

PreReq: capability>=version      #capability包必须先安装

Conflicts:bash>=2.0                 #该包和所有不小于2.0的bash包有冲突

2.4   BuildRequires

描述:

编译时的包依赖

格式:

BuildRequires: zlib-devel

依赖包格式: 

 

3     说明%description

软件包详细说明,可写在多个行上。

%description

Consul feature - Service Discovery, HealthChecking, KV, Multi Datacenter

4     预处理%prep

预处理通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令。功能上类似于./configure。

作用:

用来准备要编译的软件。通常,这一段落将归档中的源代码解压,并应用补丁。这些可以用标准的 shell 命令完成,但是更多地使用预定义的宏。

检查标签语法是否正确,删除旧的软件源程序,对包含源程序的tar文件进行解码。如果包含补丁(patch)文件,将补丁文件应用到解开的源码中。它一般包含%setup与%patch两个命令。%setup用于将软件包打开,执行%patch可将补丁文件加入解开的源程序中。

4.1   宏%setup

这个宏解压源代码,将当前目录改为源代码解压之后产生的目录。这个宏还有一些选项可以用。例如,在解压后,%setup 宏假设产生的目录是%{name}-%{version}

如果 tar 打包中的目录不是这样命名的,可以用 -n 选项来指定要切换到的目录。例如:

%setup -n%{name}-April2003Rel

%setup-q---------将 tar 命令的繁复输出关闭。

%setup -nnewdir---------将压缩的软件源程序在newdir目录下解开。

%setup -c---------------在解开源程序之前先创建目录。

%setup -bnum------------在包含多个源程序时,将第num个源程序解压缩。

%setup -T----------------不使用缺省的解压缩操作。

例如:

%setup -T -b 0

//解开第一个源程序文件。

%setup -c -nnewdir

//创建目录newdir,并在此目录之下解开源程序。

4.2   宏%patch

这个宏将头部定义的补丁应用于源代码。如果定义了多个补丁,它可以用一个数字的参数来指示应用哪个补丁文件。它也接受 -b extension 参数,指示 RPM 在打补丁之前,将文件备份为扩展名是 extension 的文件。

%patchN----------这里N是数字,表示使用第N个补丁文件,等价于%patch-P N

-p0--------------指定使用第一个补丁文件,-p1指定使用第二个补丁文件。

-s---------------在使用补丁时,不显示任何信息。

-bname----------在加入补丁文件之前,将源文件名上加入name。若为指定此参数,则缺省源文件加入.orig。

-T---------------将所有打补丁时产生的输出文件删除

5     编译%build

定义编译软件包所要执行的命令, 这一节一般由多个make命令组成。

作用:

在这个段落中,包含用来配置和编译已配置的软件的命令。与 Prep 段落一样,这些命令可以是 shell 命令,也可以是宏。

如果要编译的宏使用了 autoconf,那么应当用 %configure 宏来配置软件。这个宏自动为 autoconf 指定了安装软件的正确选项,编译优化的软件。

如果软件不是用 autoconf 配置的,那么使用合适的 shell 命令来配置它。

软件配置之后,必须编译它。由于各个应用程序的编译方法都各自不同,没有用来编译的宏。只要写出要用来编译的 shell 命令就可以了。

环境变量 $RPM_OPT_FLAGS 在编译软件时很常用。这个 shell 变量包含针对 gcc 编译器套件的正确的优化选项,使用这样的语法:

makeCC="gcc $RPM_OPT_FLAGS"

或者

makeCFLAGS="$RPM_OPT_FLAGS"

就可以保证总是使用合适的优化选项。也可以使用其他编译器标志和选项。默认的 $RPM_OPT_FLAGS 是:

-O2 -g-march=i386 -mcpu=i686

6     安装%install

定义在安装软件包时将执行命令,类似于make install命令。有些spec文件还有%post-install段,用于定义在软件安装完成后的所需执行的配置工作。

作用:

这个段落用于将已编译的软件安装到虚拟的目录结构中,从而可以打包成一个 RPM。

在 Header 段落,可以定义 Buildroot,它定义了虚拟目录树的位置,软件将安装到那里。通常,它是这样的:

Buildroot:%{_tmppath}/%{name}-buildroot

使用 RPM 内建的宏来指定 /var/tmp 目录中一个私用的目录。

在 spec 文件的其余部分可以用 shell 变量 $RPM_BUILD_ROOT 获取 Buildroot 的值。

mkdir -p$RPM_BUILD_ROOT/usr/share/icons/

cp %{SOURCE3}$RPM_BUILD_ROOT/usr/share/icons/

Install 段落通常列出要将已编译的软件安装到 Buildroot 中的命令

宏 %makeinstall 可以用于安装支持 autoconf 的软件。这个软件自动地将软件安装到 $RPM_BUILD_ROOT 下的正确的子目录中。

有时,软件包必须被构建多次,由于打包错误或其他原因。每次构建时,Install 段落将复制文件到 Buildroot 中。要防止由于 Buildroot 中的旧文件而导致错误的打包,必须在安装新文件之前将 Buildroot 中任何现有的文件删除。为此,可以使用一个 clean 脚本。这个脚本通常以 %clean 标记表示,通常仅仅包含这样一句:

rm -rf$RPM_BUILD_ROOT

如果有的话,在制作了在 Install 段落中安装的文件的打包之后,将运行 %clean,保证下次构建之前 Buildroot 被清空。

7     清理%clean

%clean

rm-rf $RPM_BUILD_ROOT

8     文件%files

定义软件包所包含的文件,分为三类:说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。

这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径。 如果描述为目录,表示目录中除%exclude外的所有文件。
%defattr (-,root,root) 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755

9     更新日志%changelog

每次软件的更新内容可以记录在此到这里,保存到发布的软件包中,以便查询之用。

RPM构建 - SPEC文件参数解析相关推荐

  1. linux中systemctl命令理解以及.service文件参数解析

    linux中systemctl命令理解以及.service文件参数解析 一.systemctl介绍 二.利用.service文件管理程序的步骤 三..service配置文件参数详解 1. Unit 2 ...

  2. linux安装spec编译器,RPM包制作之Spec文件参数详解

    看这篇文章的人基本都有一个想法,就是:"劳资不想用YUM的安装!不是版本太低就是文件分布太野路子",此时我们需要自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包 ...

  3. SPEC文件参数查阅

    %define _prefix /usr/local/nginx //预定义的prefix目录 %define _logpath /var/log/weblog //预定义日志目录 Name: ngi ...

  4. 定制zabbix的rpm包---spec文件的书写

    定制zabbix的rpm包 # %define zabbix_group zabbix %define zabbix_user zabbix Name:           zabbix Versio ...

  5. rpm升级时spec文件执行的流程

    转自:https://www.cnblogs.com/zafu/p/7423758.html %pre 和 %post 脚本片段分别在软件包安装前和安装后执行.%preun 和 %postun 脚本片 ...

  6. .xfp文件参数解析(持续更新)

    [Connection] Host=远程地址 Protocol=协议类型     1:SFTP   0:FTP Port=端口号 UserName=登录账号 Password=登录密码(密文) Aut ...

  7. linux spec文档解析

    编译目录组成介绍 rpm-build 包和  /usr/src/redhat ,这些 rpm build 的程序是要靠 spec 文件的控制.它是配置指定安装到另外的机器上的,用来指示转换的源码补丁编 ...

  8. 安装rpm包命令_编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出...

    不常用R的朋友,可能并不能意识到好的编辑模板带来的长期效率提高和代码重用性,非计算机专业科研人员且需要使用R语言,此文会对您有帮助. 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与 ...

  9. RPM包rpmbuild SPEC文件深度说明

    关键字 spec脚本包括很多关键字,主要有: 引用 Name: 软件包的名称,后面可使用%{name}的方式引用 Summary: 软件包的内容概要 Version: 软件的实际版本号,例如:1.0. ...

  10. rpm打包sh调用shell_RPM包rpmbuild SPEC文件深度说明 【装载】

    转载地址[请查看作者原文] http://hlee.iteye.com/blog/343499 http://laoguang.blog.51cto.com/6013350/1103628 关键字 s ...

最新文章

  1. Go 分布式学习利器(15) -- Go 实现 深搜和广搜
  2. BMP文件的读取与显示
  3. 想客户之所想 华为全栈云加速行业云化创新
  4. IDEA代码生成插件CodeMaker
  5. bzoj 1024 [ SCOI 2009 ] 生日快乐 —— 递归
  6. 一起Polyfill系列:Function.prototype.bind的四个阶段
  7. python自动化工具哪个好用_微软最强 Python 自动化工具开源了!不用写一行代码!...
  8. Luogu 3066 [USACO12DEC]逃跑的BarnRunning Away From…
  9. Java中输出流重定向小例子
  10. 建模步骤_带你十个步骤学建模(二)
  11. 百度统计挂了,分布式数据库异常引起,数据显示为空!
  12. 数学建模(5.5)相关系数_斯皮尔曼相关系数
  13. 单点登录的CAS实践
  14. 金蝶K3系统与防火墙集成部署方案
  15. 九宫格拼图 | 8Puzzle | C/C++实现
  16. asp文件解密 加密
  17. [分享]从许三多精神看企业管理
  18. 中国大学慕课python答案第七章_中国大学MOOC慕课用Python玩转数据章节测试答案...
  19. 2020我也当了面试官-java面试题之四
  20. Google推荐的15条HTML 5代码军规

热门文章

  1. 再见,深圳!再见,腾讯!
  2. 2022年煤气考试试题及答案
  3. rrweb学习案例(网页录制,回放)-demo
  4. 10年时间,打工妹把一个团队从“一盘散沙”到精英战队,成功实现空手“造”大房···
  5. git生成/添加SSH公钥
  6. PS2无线遥控手柄的通讯协议以及c语言代码分析
  7. shopify独立站用户行为分析工具推荐-趣迹
  8. Awesome Crowd Counting
  9. php面试时的自我称呼,PHP程序员面试自我介绍
  10. 如何理解移动端设计稿的计算问题(移动端屏幕适配和px转rem)