RPM(Rpm Package Management)在ReadHat等发行版下被用作软件包管理程序,其将某个软件相关的文件置入一个.rpm包中,用rpm命令,我们可以方便地完成Linux下软件安装、文件查看等操作。在《rpm包管理》一文中我们学习了rpm安装、查看软件包的相关方法,下面介绍如何制作rpm包。

1.两种rpm包

用rpm打包,将会产生两种rpm包,一是源码包(xxx.src.rpm),一是binary包(xxx.rpm)。源码包可用于开源软件发布源码,一般包含xxx.spec文件和xxx.tar.gz文件;binary包用于直接软件安装,包含已完成编译的可执行文件以及相关配置文件等:

# rpm -qlp ../SRPMS/hello-.src.rpm 
hello-.spec
hello-.tar.gz

# rpm -qlp ../RPMS/x86_64/hello-.x86_64.rpm
/bin/hello
/usr/share/doc/packages/hello
/usr/share/doc/packages/hello/README

2.打包目录

从.tar.gz等格式的源码文件,到.rpm文件,需要经过编译过程,为此rpm提供了专门的目录进行打包:

  • SOURCES目录:存放.tar.gz源码文件
  • SPECS目录:存放.spec文件
  • SRPMS目录:存放生成的xxx.src.rpm文件
  • BUILD目录:存放解压后的源码文件或其他中间的临时文件
  • RPMS目录:存放生成的xxx.rpm文件

对于suse,以上目录在/usr/src/packages路径下,对于RedHat,以上目录在/usr/src/redhat路径下。

3.spec文件

rpm包制作过程中最主要一步就是编写spec文件,spec文件用于提供软件相关描述以及如何编译、安装等信息,以下是一个spec文件示例:

Summary: rpm hello world.
Name: hello
Version: 0.1
Source: $RPM_SOURCE_DIR/hello-.tar.gz
Release:
Vendor: lx
License: Share
Group: Application/test

%description
print hello

%prep

.tar.gz | tar xvf -

%build
cd $RPM_BUILD_DIR/hello
make

%install
cd $RPM_BUILD_DIR/hello
make install

%files
%doc $RPM_BUILD_DIR/hello/README
/bin/hello

以上开头一段用于描述软件包相关信息,除了Summary/Name/Version/Source/Release/Vonder/License/Group外还有其他可选域,以上所列除Source外其他为必选域,建议在spec中提供Source信息,生成.src.rpm时软件包由Source提供的路径获取,否则.src.rpm中不包含.tar.gz源码包。

后面%xx为spec文件的宏定义,在/usr/lib/rpm/macros文件找到相关定义,最重要的是以下几个部分:

  • %prep:编译前的准备部分,一般为删除之前的中间文件(BUILD目录),解压缩源码文件
  • %build:完成make编译部分,如果源码中提供了Makefile文件,就是一条make命令
  • %install:完成安装部分,如果源码中提供了Makefile文件,就是一条make install命令
  • %files:列出软件被安装后,目标机器上由该文件新建的文件,包括可执行文件、配置文件、man文件等

4.生成目标文件

.tar.gz文件放到SOURCES目录下,.spec文件编辑完成并放到SPECS目录下,这些完成后我们就可以打包生成.src.rpm文件和.rpm文件了:

# rpmbuild -ba hello-0.1-1.spec

以上rpmbuild命令用到 -ba 选项,表示既生成.src.rpm文件,又生成.rpm文件。以上命令执行后,我们来看各打包目录下生成的文件:

/usr/src/packages # ll *
BUILD:
drwxr-xr-x 2 root root 4096 04-13 20:49 hello

RPMS:
drwxrwxrwt 2 root root 4096 04-13 20:49 x86_64

SOURCES:
-rw-r--r-- 1 root root 346 04-13 00:42 hello-0.1-1.tar.gz

SPECS:
-rw-r--r-- 1 root root 411 04-13 22:46 hello-0.1-1.spec

SRPMS:
-rw-r--r-- 1 root root 2076 04-13 20:49 hello-0.1-1.src.rpm

RPMS的x86_64目录下:

/usr/src/packages # ll RPMS/x86_64/
-rw-r--r--  root root  - : hello-.x86_64.rpm

5.rpm解包

rpm2cpio xxx.rpm | cpio -div

Reference: Maximum RPM

RPM HOWTO

rpm包制作介绍的更多相关文章

  1. RPM包制作教程

    一.RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理:现在应为RPM Package M ...

  2. RPM包制作方法

    一.RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理:现在应为RPM Package M ...

  3. php-7.1.0 rpm包制作

    nginx-1.8.0 rpm包制作见上篇文章:http://www.cnblogs.com/xiaoming279/p/6251149.html spec文件 Name: php Version: ...

  4. rpm包制作(待实验)

    作者:firefoxbug 时间:July 18, 2014 rpm包命名规范 对于rpm包的命名符合如下规范. %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm N ...

  5. 简单介绍RPM包制作方法

    RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,是一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中.它生成具有.RPM扩展名的文件.使用r ...

  6. 实战RPM包制作

    在开发中经常会用到一些rpm包,但是一直没有自己手动制作过.今天在制作的时候意外地还解决了自己以前一直困惑的问题,就是怎么制作rpm debuginfo包,类似CentOS官网那样的debuginfo ...

  7. RPM包制作过程(一)

    本机环境:centos7,64位 1. 首先安装工具,rpmbuild可能在rpmdevtools里已经包含 #yum install rpm-devel.x86_64 #yum install rp ...

  8. nginx-1.8.0 rpm包制作

    1.安装rpm-build # yum install rpm-build 2.创建制作RPM包目录 # cat /root/.rpmmacros %_topdir /root/rpmbuild %_ ...

  9. gtibase rpm包制作

    gitbase 是一个很不错的代码分析工具,我们可以直接使用sql来分析团队的代码,以下是rpm 包的制作 简单说明 rpm 包的制作使用了fpm 一个简单,方便可以跨平台的软件包制作工具 gitba ...

随机推荐

  1. 20152016-acmicpc-neerc-northern-subregional-contest J:Journey to the "The World's Start"(单调队列+DP+二分)

    http://codeforces.com/gym/100801/attachments 题意:给出n-1张不同的票,票价分别为 pi,每张票每次最多可以坐 r 个站(1<=r<n),并且 ...

  2. Django随机生成验证码图片

    PIL简介 什么是PIL PIL:是Python Image Library的缩写,图像处理的模块.主要的类包括Image,ImageFont,ImageDraw,ImageFilter PIL的导入 ...

  3. Python3 列表的基本操作

    列表索引和切片 和字符串一样,也有索引和切片,只不过切出来的内容是列表. 索引的下标从0开始. lst= ["海上钢琴师", "奥特曼", "舌尖3& ...

  4. 关于String重写的hashcode的代码分析

    public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = valu ...

  5. 9.18考试 第二题Dinner题解

    当时初步感觉是一个类似动归或者贪心的神题,然而由于本题已经给出顺序,贪心貌似并没有什么道理,所以放弃贪心.然后又由于这是一个环的问题,我想到了“合并石子”那种环转链的思路,然后就是一个O(n^2*m) ...

  6. 小心使用strcpy函数时越界

    strcpy()函数应该是我们用的比较常用的一个函数,基本功能是将一个字符串拷贝到我指定的内存空间.但是要复制的字符串长度超过这段内存空间的话,结果可能是未知的. 比如以下的程序: #include ...

  7. Spring MVC源码(四) ----- 统一异常处理原理解析

    SpringMVC除了对请求URL的路由处理特别方便外,还支持对异常的统一处理机制,可以对业务操作时抛出的异常,unchecked异常以及状态码的异常进行统一处理.SpringMVC既提供简单的配置类 ...

  8. WinForm控件之【ComboBox】

    基本介绍 下拉文本框应用较为广泛,在winfrom控件当中使用设置也是相对的简单,主要用于存在多种选择的单选操作场景. 常设置属性.事件 DataSource:绑定加载项的数据源,设置属性Displa ...

  9. 个人永久性免费-Excel催化剂功能第20波-Excel与Sqlserver零门槛交互-数据上传篇

    Excel作为众多数据存储的交换介质,在不同的系统内的数据很少可以很连贯地进行整合分析,一般的业务系统都会提供导出Excel作为标配功能供用户使用系统内生成的数据. 此时最大的问题是,Excel很维去 ...

  10. Java学习笔记之---Servlet

    Java学习笔记之---Servlet (一)如何实现Servlet 1.实现javax.servlet.Servlet接口: 2.继承javax.servlet.GenericServlet类: 3 ...