rpm包制作

来源:互联网 发布:相对论知乎 编辑:程序博客网 时间:2024/05/27 03:29

RPM包制作简介

----00096871

1          简介

RPM 是 Red HatPackage Manager 的缩写,原意是Red Hat软件包管理。 先介绍一下rpm命令的一些基本用法:

 1)、对系统中已经安装的软件查询:rpm -q softwarename

 2)、查询系统中已安装的包:rpm -qa[softwarename] 

 3)、查询已安装软件包都安装到何处:rpm -qlsoftwarename 

4)、安装 rpm -ivh softwarename.rpm

5)、删除 rpm -e softwarename

 

 其余更多的用法参照man rpm                 

2          打包

使用rpmbuild打包,流程分为如下三步

1)、安装打包套件rpm-build

yuminstall rpm-build

2)、建立打包环境:

手动创建打包目录:

mkdir-p ~/{BUILD,RPMS,S{OURCE,PEC,RPM}S} 

或者通过rpm命令解src压源码包:

rpm –i*.src.rpm

通过命令解压源码包,在/root/rpmbuild/目录下生成SPEC  SOURCE两个文件夹

目录说明:

--BUILD #编译之前,如解压包后存放的路径,编译时所用的暂存目录

--BUILDROOT #编译后存放的路径

--RPMS #打包完成后生成的rpm包存放的路径

--SOURCES #源包所放置的路径,放置原始码及修补档等等

--SPECS #spec文档放置的路径

--SRPMS #生成的rpm源码包放置的路径

 

注:一般我们都把源码打包成tar.gz格式然后存放于SOURCES路径下,而在SPECS路径下编写spec文档,通过命令打包后,默认会把打包后的rpm包放在RPMS下,而生成的源码包会被放置在SRPMS下

 

3)执行打包脚本

输入如下命令运行 /root/rpmbuild/目录下的spec脚本,生成rpm包:

rpmbuild-ba filename.spec

执行打包脚本后生成的rpm包路径:

/root/rpmbuild/RPMS/

生成的源码包路径:

/root/rpmbuild/SRPMS/

3          SPEC文档

specs文件由如下几个部分组成:

%preample(定义常用的宏,如Summary软件说明、Name软件名称、Version版本等)、%prep (准备部分,比如创建目录,解压源码包等,可使用%setup内部函数)、   %setup、   %patch、%build (在BUILD目录编译,可使用%configure内部函数,或者其他编译工具,如cmake, perl等)、%install(安装到BUILDROOT虚拟目录)、%uninstall、%verify、%clean、%file list、%changelog等。

3.1    分段说明

1) preample 定义宏,以下为常用的宏:

Summary:说明

Name:版本包名称

Version:版本号

Release:发布次数

Copyright:

Group:

Source:

Patch:

URL:

Distribution:

Vendor:

Packager:

%description

 

其他宏:

icon:

dependency:

requires:

conflicts:

patch:

Serial:

AutoReqProv:[yes/no]

ExcludeArch:

ExclusiveArch:

ExcludeOs:

ExclusiveOs:

 

2) %prep 预处理脚本

这个阶段包含%setup语句,格式如下:

%setup -q -n %{name}-%{version}                

%setup将会执行如下命令:

rm-rf

tarzxf

mv/usr/src/linpus/BUILD

chown

umask

...

说明:

%setup 不加任何选项,仅将软件包打开。 
%setup -n newdir 将软件包解压在newdir目录。 
%setup -c 解压缩之前先产生目录。 
%setup -b num 将第num个source文件解压缩。 
%setup -T 不使用default的解压缩操作。 
%setup -T -b 0 将第0个源代码文件解压缩。 
%setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。 
%patch 最简单的补丁方式,自动指定patch level。 
%patch 0 使用第0个补丁文件,相当于%patch ?p 0。 
%patch -s 不显示打补丁时的信息。 
%patch -T 将所有打补丁时产生的输出文件删除。

3) %build

./configure

make

4 )%install 开始把软件安装到虚拟的根目录中

make install

5 )%clean

make clean

6 )%files

%doc 将文档导入$RPM_DOC_DIR

%dir 导入目录并文件

 

spec文件中用到的宏

用rpmbuild制作rpm包时用到很多宏变量。

rpm --showrc或rpmbuild --showrc可以显示所有rpmrc和macros定义的变量值。

大部分宏在/usr/lib/rpm/macros定义。不过在/usr/share/vim/vimfiles/template.spec有一个变量%{?dist}例外,单独包含在下面文件中/etc/rpm/macros.dist

3.2    名称不一致

用spec文件打包时,经常遇到源码的*.tar.gz包与预期生成的rpm名称不一致的情况,比如python-olso-messaging,它的源码包为oslo.messaging.tar.gz,与rpm包不一致,打包的名称冲突怎么解决呢?

Spec文件中

%setup字段中增加-n选项,比如

setup -n %{pypi_name}-%{upstream_version} -S git

如果不加-n,且源码的*.tar.gz包与预期生成的rpm包不一致,将打包失败提示找不到*包。

注意, -n 后面的字符串要填写tar.gz包的名称。

3.3    控制打包的文件

%files字段定义了哪些文件添加到rpm包,如果在打包的目录中有文件不希望被打包进去,该如何做到呢?这就用到%exclude啦,如下:

%files

%doc LICENSE

%{_bindir}/packstack

%{_datadir}/packstack

%{python_sitelib}/packstack

%{python_sitelib}/packstack-*.egg-info

%exclude%{python_sitelib}/packstack/mytest.py

不想将packstack目录下的mytest.py文件打包到rpm包中的,就可以这样使用%exclude,注意%exclude后面要有一个空格。

4          Python方式制作rpm包

在setup.py所在目录输入打包命令

 python setup.py bdist_rpm

在当前目录会生成一个dist目录,里面存放生成的rpm包

Python还可以生成spec文件,命令:

python setup.py bdist_rpm –spec_only

生成的spec文件同样存放在dist目录下。

 

 


0 0
原创粉丝点击