RPM打包步骤说明html
参考:http://blog.chinaunix.net/uid-21123336-id-1830527.htmlpython
1、 RPM简介
RPM最初是Red Hat Package Manager的缩写,本意是Red Hat软件包管理,顾名思义是Red Hat贡献出来的软件包管理;如今应为RPM Package Manager的缩写。在Fedora、Redhat、Mandriva、SuSE、YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用;RPM包中除了包括程序运行时所须要的文件,也有其它的文件;一个RPM包中的应用程序,有时除了自身所带的附加文件保证其正常之外,还须要其它特定版本文件,这就是软件包的依赖关系。
RPM是为解决源码包不易安装(须要编译)和软件包相互之间依赖(是RPM包管理器能够必定程度解决依赖问题)问题,它经过在探测源码包在build和install阶段的动做得到最终生成的须要安装的系统里的文件,并记录下一些必要的操做(好比安装完成后执行某项操做),而后把此组成为一个总体,当在用户安装此包时把前面得到的全部问题和记录的全部操做原本来本的做用的实际系统上。
RPM可让用户直接以binary方式安装软件包,而且可替用户查询是否已经安装了有关的库文件;在用RPM删除程序时,它又会询问用户是否要删除有关的程序。若是使用RPM来升级软件,RPM会保留原先的配置文件,这样用户就不用从新配置新的软件了。RPM保留一个数据库,这个数据库中包含了全部的软件包的资料,经过这个数据库,用户能够进行软件包的查询。RPM虽然是为Linux而设计的,可是它已经移值到SunOS、Solaris、AIX、Irix等其它UNIX系统上了。RPM遵循GPL版权协议,用户能够在符合GPL协议的条件下自由使用及传播RPM。
2、 RPM打包环境配置
Linux系统中使用rpmbuild软件来完成rpm打包。首先安装rpmbuild:
#yum –y install rpmbuild
rpmbuild的工做目录以下,
~/rpmbuild #放置打包过程当中解压后的文件夹
~/rpmbuild/SOURCES #放置打包资源,包括源码打包文件和补丁文件等
~/rpmbuild/SPECS #放置SPEC文档(打包配置文件)
~/rpmbuild/BUILD #打包过程当中的工做目录
~/rpmbuild/RPMS #存放生成的二进制包,RPM包根据硬件平台不一样分类,分为x_86.4和i386(.rpm)
~/rpmbuild/SRPMS #存放生成的源码包(.src.rpm)
若是你的用户目录主目录下没有相似目录结构,你能够经过一个工具软件来自动配置和生成,以下。
#yum install rpmdevtools
安装完成后,运行自动配置命令自动生成如上目录。
#rpmdev-setuptree
rpmdev-setuptree命令默认将再当前用户主目录下建立一个RPM构建根目录结构,若是须要改变此默认位置,能够修改配置文件:~/.rpmmacros中变量_topdir对应的值便可。
#pwd
/root
# cat .rpmmacros
%_topdir %(echo $HOME)/rpmbuild
%_smp_mflags -j3
%__arch_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
3、 RPM打包spec文件配置
SPEC撰写是打包RPM的核心,也算是最难的一步,好在建立一个spec文件会自动生成一个简单的模板,能够在此模板的基础上再一步一步的扩充文档内容,直至彻底达到要求。下面是一个简单的SPEC文档,其中包括了一些说明信息(注:#后面的内容为说明信息),该SPEC文档是对setuptools软件写的,setuptools的源码包是从上下载的.zip包。此处的安装步骤根据手动按装步骤来写便可。
setuptools.spec文档的内容以下:
=================================================================
Summary: this is a test program。#软件包简要介绍
Name: setuptools #软件包的名字
Version: 1.0.0 #软件包的主版本号
Release: 1 #软件包的次版本号
Source0: %{name}-%{version}.zip #源代码包,默认将在上面提到的SOURCES目录中寻找
License: GPL #受权协议
#定义临时构建目录,这个地址将做为临时安装目录在后面引用
BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root
Requires:pysvn = 1.6.2-3.el5 #依赖的软件及版本
Group: Development/Tools #软件分类
%description #软件包的内容介绍
The program is a test.
%prep #表示预操做字段,后面的命令将在源码代码BUILD前执行
%setup -q #构建BUILD环境,将解压源码压缩包到BUILD目录
%install #安装字段
python setup.py install #调用源码中安装执行脚本
%files #文件说明字段,声明多余或者缺乏都将可能出错
%defattr(-,root,root,-) #声明并设置文件属性
%doc README.txt #声明解压后目录中的README.txt 文件将出如今rpm软件包中
4、 构建RPM包
1.完成spec文件的编写,将源码包setuptools.1.0.0.zip(根据spec文件缩写,此处为.zip源码包)放置到~/rpmbuild/SOURCES目录下。
接下来咱们就执行构建rpm包命令:
#cd ~/rpmbuild/SPECS #spec文件所在目录
#rpmbuild –ba setuptools.spec #-ba表示build all
配置spec文件没错的话,这个步骤很顺利就完成,而后可在~/rpmbuild/RPMS目录下看到咱们打出的rpm包。
执行安装此rpm包:
#rpm -ivh setuptools-8.0.4-1.el6.x86_64.rpm
error: Failed dependencies:
pysvn = 1.6.2-3.el5 is needed by setuptools-8.0.4-1.el6.x86_64
这个说明是有依赖的软件,须要先安装所依赖软件。
5、 遇到的问题
1.配置了依赖的软件和版本,而且已经放置被依赖软件正确版本到yum库,可是一直都是找不到对应的依赖版本软件,报错以下:
--> Running transaction check
---> Package setuptools.x86_64 0:8.0.4-1.el6 will be installed
--> Processing Dependency: pysvn=1.7.6-1 for package: setuptools-8.0.4-1.el6.x86_64
--> Finished Dependency Resolution
Error: Package: setuptools-8.0.4-1.el6.x86_64 (base)
Requires: pysvn=1.7.6-1
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles –nodigest
经查看并验证,此处问题出如今spec文件的:Requires:pysvn=1.7.6-1
此处‘=’两边必须有空格,不然识别为一个软件的名称,非软件名称及版本。
软件的版本要写全面而且是和yum库里的软件版本一直,不然就报找不到该依赖的版本。
Resolving Dependencies
--> Running transaction check
---> Package setuptools.x86_64 0:8.0.4-1.el6 will be installed
--> Processing Dependency: pysvn = 1.7 for package: setuptools-8.0.4-1.el6.x86_64
--> Finished Dependency Resolution
Error: Package: setuptools-8.0.4-1.el6.x86_64 (base)
Requires: pysvn = 1.7
Available: pysvn-1.6.2-3.el5.x86_64 (base)
pysvn = 1.6.2-3.el5
Available: pysvn-1.7.6-1.el6.x86_64 (base)
pysvn = 1.7.6-1.el6
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
2.打包完成以后经过rpm –qlp XXXX.rpm查看软件中的文件结果以下:
#rpm -qlp hellorpm-1.0.0-1.el6.x86_64.rpm
(contains no files)
一直觉得是本身打包失败呢,这个如果在spec文件中%files下没有指定要放在包中的文件,就不会显示文件。如上setuptools.spec中声明了README.txt,结果以下:
#rpm -qlp setuptools-8.0.4-1.el6.x86_64.rpm
usr/share/doc/setuptools-8.0.4
/usr/share/doc/setuptools-8.0.4/README.txt
web
6、 spec文件字段详解
Group:
软件分组,建议使用标准分组,软件包所属类别,具体类别有:
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 (文档)
System Environment/Base(系统环境/基础)
System Environment/Daemons (系统环境/守护)
System Environment/Kernel (系统环境/内核)
System Environment/Libraries (系统环境/函数库)
System Environment/Shells (系统环境/接口)
User Interface/Desktops(用户界面/桌面)
User Interface/X (用户界面/X窗口)
User Interface/X Hardware Support (用户界面/X硬件支持)
License:
软件受权方式,一般就是GPL
Source:
源代码包,能够带多个用Source一、Source2等源,后面也能够用%{source1}、%{source2}引用。
NoSource:0 #第一个源码不包含在包中
Patch:
补丁源码,可以使用Patch一、Patch2等标识多个补丁,使用%patch0或%{patch0}引用,
补丁 ID 规则
Prefix: %{_prefix} 这个主要是为了解决从此安装rpm包时,并不必定把软件安装到rpm中打包的目录的状况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时从新指定位置的功能
Prefix: %{_sysconfdir} 这个缘由和上面的同样,但因为%{_prefix}指/usr,而对于其余的文件,例如/etc下的配置文件,则须要用%{_sysconfdir}标识
Build Arch: 指编译的目标处理器架构,noarch标识不指定,但一般都是以/usr/lib/rpm/marcros中的内容为默认值
Requires: 该rpm包所依赖的软件包名称,能够用>=或<=表示大于或小于某一特定版本,例如:
libpng-devel >= 1.0.20 zlib
※“>=”号两边需用空格隔开,而不一样软件名称也用空格分开
还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不一样阶段的依赖指定。
※注意区分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
$RPM_BUILD_ROOT是指开头定义的BuildRoot,而$RPM_BUILD_DIR一般就是指/usr/src/asianux/BUILD,其中,前面的才是%file须要的。
%pre rpm安装前执行的脚本
%post rpm安装后执行的脚本
%preun rpm卸载前执行的脚本
%postun rpm卸载后执行的脚本
%files 定义那些文件或目录会放入rpm中
这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径。 若是描述为目录,表示目录中除%exclude外的全部文件。
%defattr (-,root,root) 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755
%exclude 列出不想打包到rpm中的文件
※当心,若是%exclude指定的文件不存在,也会出错的。
%changelog 变动日志数据库