制作 RPM 包

介绍

缩写

  • 前世:RPM为Red Hat Package Manager的缩写(Red Hat软件包管理),顾名思义是Red Hat贡献出来的软件包管理。
  • 今身:RPM为RPM Package Manager的缩写(GNU的既视感)。

特点

  • RPM包中除了包括程序运行时所需要的文件,也有其它的文件。
  • RPM包中的应用程序,有时除了自身所带的附加文件保证其正常以外,还需要其它特定版本文件,这就是软件包的依赖关系。
  • RPM可以让用户直接以binary方式安装软件包,并且可替用户查询是否已经安装了有关的库文件。
  • RPM删除程序时,它又会聪明地询问用户是否要删除有关的程序。
  • RPM升级软件时,RPM会保留原先的配置文件,这样用户就不用重新配置新的软件了。
  • RPM保留一个数据库,这个数据库中包含了所有的软件包的资料,通过这个数据库,用户可以进行软件包的查询。
  • RPM虽然是为Linux而设计的,但是它已经移值到SunOS、Solaris、AIX、Irix等其它UNIX系统上了。RPM遵循GPL版权协议,用户可以在符合GPL协议的条件下自由使用及传播RPM。

类型

  • 二进制类包,包括rpm安装包(一般分为i386和x86等几种)和调式信息包等。
  • 源码类包,源码包和开发包应该归位此类。

总结

RPM制作就是指改造软件源代码使之符合RPM打包要求的过程,这也可以等价为RPM源码包的制作过程,因为当你有了源码包就可以直接编译得到二进制安装包和其他任意包。

依赖:

yum install rpmdevtools

开始

创建目录结构

执行 rpmdev-setuptree 将在当前用户主目录下创建一个RPM构建根目录结构

注:如需改变默认位置,可以修改配置文件:~/.rpmmacros中变量_topdir对应的值。

.
├── BUILD (打包过程中的工作目录)
├── RPMS (存放生成的二进制包, 不同硬件平台存放在不同文件夹)
├── SOURCES (存放打包资源, 包括源码打包文件和补丁文件等)
├── SPECS (存放SPEC文档)
└── SRPMS (存放生成的源码包)

撰写SPEC文档

SPEC撰写是打包RPM的核心, 下面是一个简单的SPEC文档, 其中包括了一些说明信息, 假设我们需要创建一个软件项目devrpm。

创建 devrpm.spec 文档:

#软件包简要介绍
Summary: build develop environment。
#软件包的名字
Name: develop environment
#软件包的主版本号           
Version: 0.0.1         
#软件包的次版本号             
Release: 1   
#源代码包,默认将在上面提到的SOURCES目录中寻找
Source0: %{name}-%{version}.tar.gz   
#授权协议
License: GPL          
#定义临时构建目录,这个地址将作为临时安装目录在后面引用
BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root
#软件分类
Group: Development/Tools  
#软件包的内容介绍               
%description                         
build local develop environment.
#表示预操作字段,后面的命令将在源码代码BUILD前执行
%prep                     
#构建BUILD环境,将解压源码压缩包到BUILD目录 
%setup -q
#BUILD字段,将通过直接调用源码目录中自动构建工具完成源码编译操作
%build       
#调用源码目录中的configure命令            
./configure        
#在源码目录中执行自动构建命令make     
make            
#安装字段         
%install     
#调用源码中安装执行脚本             
make DESTDIR=$RPM_BUILD_ROOT install 
#文件说明字段,声明多余或者缺少都将可能出错
%files              
#设置文件权限属性       
%defattr(-,root,root)      
#声明/usr/local/bin/devrpm将出现在软件包中      
/usr/local/bin/devrpm      
#声明并设置文件属性   
%doc %attr(0444,root,root) /usr/local/man/man1/devrpm.1  
#同上,声明文档文件 
%doc README  

文档说明:

  • BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root上面BuildRoot变量表示的是源码的临时按照目录,rpmbuild就是通过此目录获得将要按照到系统中的所有文件,而在SPEC文档后面make install命令中的参数。
  • DESTDIR=$RPM_BUILD_ROOT 即是对该参数的引用,这个参数将传给Makefile文件一告诉自动构建工具应该安装文件那里。

实际上我再前文提到过的Makefile需要作一些改造以适应RPM的构建就包括此操作,你的Makefile文件中至少要知道在RPM构建过程中引用此参数的值去控制安装操作的目标。

放置源代码

把一个名为devrpm-0.0.1.tar.gz的源码压缩文件放到rpmbuild根目录下的SOURCES目录下(注,确保此归档文件解压后的目录为devrpm-0.0.1,否则会有问题)。

到此一个完整的rpm打包环境已经构建完成,下面我们就可以开始构建二进制和源代码RPM包。

构建RPM包

构建RPM包是有命令rpmbuild在SPEC的指导下完成。

开始构建操作,首先进入到当前用户的rpmbuild根目录(即上面提到的目录环境)。

#cd ~/rpmbuild/

执行如何命令,-ba表示build all,即生成包括二进制包和源代码包的所有RPM包,下来如果正常的话,rpmbuild将正常退出,同时在RPMS目录和SRPMS目录中将生成对应的RPM包。

#rpmbuild -ba SPECS/hellorpm.spec
    原文作者:丁靖
    原文地址: https://segmentfault.com/a/1190000002539129
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞