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. javascript中bind绑定接收者与函数柯里化

    如果我要遍历一个数组, 我只要给forEach传一个匿名函数即可,很简单: let arr = ['a', 'b', 'c']; arr.forEach((item, index) => { c ...

  2. MYSQL5.7---ONLY_FULL_GROUP_BY 异常处理

    异常介绍: ONLY_FULL_GROUP_BY 指的是你查询的语句使用到了group by 例如  select name,age from person group by sex; 此时你grou ...

  3. 2019 Java 全栈工程师进阶路线图,一定要收藏

    技术更新日新月异,对于初入职场的同学来说,经常会困惑该往那个方向发展,这一点松哥是深有体会的. 我刚开始学习 Java 那会,最大的问题就是不知道该学什么,以及学习的顺序,我相信这也是很多初学者经常面 ...

  4. Spring Cloud Alibaba | Nacos配置管理

    目录 Spring Cloud Alibaba | Nacos配置管理 1. pom.xml 项目依赖 2. 在 bootstrap.properties 中配置 Nacos server 的地址和应 ...

  5. 数据结构-循环队列(Python实现)

    今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法. 但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删 ...

  6. Bzoj 3813 奇数国 题解 数论+线段树+状压

    3813: 奇数国 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 748  Solved: 425[Submit][Status][Discuss] ...

  7. free()函数释放一段分配的内存之陷阱

    朋友们对malloc函数应该是比较熟悉了,此函数功能是分配一段内存地址,并且将内存地址给一个指针变量,最后记得再调用free函数释放这段内存地址就可以了,标准的流程对吧,好像没什么问题.但是按照此标准 ...

  8. centos7 linux下增加swap虚拟内存分区大小

    此方法不限于centos,linux均适用 最近在服务器上部署了一个java项目,java进程经常性莫名被自动Kill,首先java程序是没有报错的,那么我想可能是内存不足的原因,因为4G内存的服务上 ...

  9. vs项目依赖项黄色感叹号解决方案

    右键项目解决方案,生成解决方案或重新生成解决方案,黄色感叹号消失,依赖项生效,亲测有效

  10. deque双端队列笔记

    clear()clear()clear():清空队列 pushpushpush_back()back()back():从尾部插入一个元素. pushpushpush_front()front()fro ...