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

最新文章

  1. 【RabbitMQ】CentOS安装RabbitMQ,及简单的Java客户端连接
  2. mysql执行计划
  3. 放松跑、间歇跑、节奏跑和LSD
  4. python MethodType方法详解和使用
  5. Redis不同数据类型的的数据结构实现
  6. Zynga 开源其服务器性能监控分析工具 zPerfmon
  7. TCP连接(Time_Wait、Close_Wait)说明
  8. JavaEE&Docker 容器示例
  9. Tomcat部署问题,Tomcat集群部署问题。
  10. 我是面试官--"自我介绍"
  11. mpi冒泡排序并行化
  12. Ebean Demo
  13. Unity之2D Sprite Outline外轮廓效果
  14. JS之this
  15. [国嵌笔记][027][ARM协处理器访问指令]
  16. 修改 input中的placeholder的字体样式和颜色
  17. [随笔][胡思乱想][唠叨][web server]
  18. Scala--模式匹配和样例类
  19. Apache Ignite 学习笔记(四): Ignite缓存冗余备份策略
  20. hdu1542 Atlantis (线段树+扫描线+离散化)

热门文章

  1. HDU 1584:蜘蛛牌(DFS)
  2. 数据结构&算法的引言+时间复杂度
  3. c# bool类型和int类型的互转
  4. c++最大公约数
  5. 如何用ModelSim对Xilinx ISE产生的网表进行仿真
  6. C语言学习书籍推荐《C语言接口与实现:创建可重用软件的技术》下载
  7. Contiki源码分析--CPU为cc253x里的uart0.c
  8. 快速掌握mongoDB(二)——聚合管道和MapReduce
  9. Linux下程序下载
  10. 个人永久性免费-Excel催化剂功能第59波-快速调用Windows内部常用工具命令