学习rpm打包的小结.docx
- 文档编号:9273013
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:10
- 大小:129.28KB
学习rpm打包的小结.docx
《学习rpm打包的小结.docx》由会员分享,可在线阅读,更多相关《学习rpm打包的小结.docx(10页珍藏版)》请在冰点文库上搜索。
学习rpm打包的小结
用Rpmbuild打包总结
最近自己试验了一下把自己的程序打包成rpm包!
呵呵!
折腾啦快两天,最后终于弄懂啦!
把自己的学习历程给记录一下,以后用的时候可以查查。
额,还是直接开始吧,前面那些个介绍网上多的是,呵呵,上面文件夹里也收集啦很有几份!
下面是我根据网上的相关的文档,然后自己改的spec文件,额!
当然是自己实验成功啦的!
这些都是对这些软件简单的介绍,一些基本的信息!
!
Name:
SipMonitor
Version:
1.0
Release:
1%{?
dist}
Summary:
forqtstudy
Group:
Development/Tools
License:
GPL
URL:
Source0:
%{name}-%{version}.tar.gz
BuildRoot:
%{_tmppath}/%{name}-%{version}-%{release}-root
%description
TheGNUwgetprogramdownloadsfilesfromtheInternetusingthecommand-line.
%prep//这个是编译之前预处理!
一般就是解压,然后进入到解压文件夹下。
下面有一段文字对%prep与%setup的一些参数讲解很详细的文章
%setup-q
%build
%install
%{__rm}-rf%{buildroot}
make
#%makeinstall
makeinstall
%{__install}-d%{buildroot}%{_datadir}/SipMonitor
cp-a./*%{buildroot}%{_datadir}/SipMonitor
%post
cp%{_datadir}/SipMonitor/sip_monitor%{_bindir}
ln-sf%{_datadir}/SipMonitor/sip_monitor/root/Desktop
%postun
%{__rm}-rf%{_bindir}/sip_monitor
%{__rm}-rf/root/Desktop/sip_monitor
%clean
rm-rf$RPM_BUILD_ROOT
%files
%{_datadir}/SipMonitor
%changelog
*WedSep102008Wangjun
-Makethespecfile,first
%prep:
此为预处理段,其内容为预处理脚本程序。
该程序完成以下任务:
*建立软件编译用目录;
*将源程序解压缩;
*通过打补丁,升级源程序;
*执行其它一些操作,使源程序随时可进行编译。
在此脚本程序中,可使用如下两个宏命令:
1.1.1%setup
这个宏利用系统中的gzip与tar等命令,来解压源程序包。
RPM会自动探测源程序包是否压缩,如果压缩,它会用gzip将其解压缩,否则直接用tar命令展开包中文件。
其使用格式为:
%setup[-nname][-c][-D][-T][-bN][-aN]
注:
[]所括为可选项。
(1)当没有任何选项时:
这个宏用来解压默认的源程序包(由文件头Source或Source0域指定)。
注意:
源程序包中的文件应用"软件名-版本号"作为其上层目录,这样%setup宏就可以正常工作。
如果不以"软件名-版本号"作为其上层目录,则%setup宏工作时有一个指令"cd软件名-版本号"(转目录)会因为系统中没有此目录而出错退出(除非在此宏上面加上建立此目录的命令)。
(2)-nname:
上面已经谈到,源程序包中的文件应采用"软件名-版本号"作为上层目录。
如果用了别的什么目录(如name),%setup宏无法正常工作,那该怎么办?
没关系,可以用-n选项,引用一下这个目录(name)就行了。
假如我的LZE源程序包中的文件是以lze为上层目录,那么我就可以用"%setup-nlze"宏命令来解压缩该包。
(3)-c:
此选项的作用是创建上层目录("软件名-版本号"目录)并转到这个目录。
对于LZE软件,其效果相当于在上例的第4行与第5行之间加上这么两行命令:
mkdir-plze-6.0
cdlze-6.0
它适用的情况是:
有的源程序包是在源程序所在目录下打的包,所以其中的文件都没有上层目录。
这样的话,要想正确解压,必须创建上层目录。
(4)-D:
本选项的作用是在解压源程序包之前不要删除软件的上层目录(软件名-版本号)。
在上例中,其效果是不执行第4行的命令(rm-rflze-6.0)。
(5)-T:
本选项的作用是不解压默认的源程序包(由文件头的Source或Source0域所定义)。
在上例中,其效果是不执行第5-9行的命令:
第5行是解压源程序包(用gzip-dc将包的内容解压缩到管道中,再由tar-xvvf-从管道中读取数据并展开),第6-9行是检查解压命令的返回值,非0时执行非正常退出。
(6)-bN:
本选项指示RPM在转到上层目录前解压第N个源程序包(由文件头SourceN域定义)。
这适用于含上层目录的源程序包。
注意:
如果使用此选项时不同时使用-T选项,则RPM解压的是两个源程序包,一个是默认的包(由Source或Source0域定义),一个是-b选项指定的包(由SourceN域定义)。
这样,当N等于0时,默认的源程序包将被解压两次。
所以,如果想仅解压指定源程序包,请同时使用-T选项,以禁止解压默认的源程序包。
下面的宏命令仅解压第1个源程序包,然后转到上层目录:
%setup-b1-T
(7)-aN:
本选项指示RPM在转到上层目录后再解压第N个源程序包(由文件头SourceN域定义)。
这适用于不含上层目录的源程序包。
使用本选项时,一般加上-c选项,以创建上层目录并转到此目录。
注意:
如果使用此选项时不同时使用-T选项,则RPM解压的是两个源程序包,一个是默认的包(由Source或Source0域定义),一个是-a选项指定的包(由SourceN域定义)。
这样,当N等于0时,默认的源程序包将被解压两次。
所以,如果想仅解压指定源程序包,请同时使用-T选项,以禁止解压默认的源程序包。
下面的宏命令让RPM先转到上层目录,再仅解压第2个源程序包:
%setup-T-a2
就我自己对rpm打包的理解谈谈对%install与%files的理解,刚开始的时候怎么也不理解这两个宏!
不解位置为如下:
1,在%install中,install命令通过-d参数创建的文件目录为啥都是
%{__install}-d%{buildroot}%{_datadir}/SipMonitor
其中%{buildroot}宏定义通过查询结果如下:
其实这就是在spec文件上面指定的BuildRoot:
BuildRoot:
%{_tmppath}/%{name}-%{version}-%{release}-root
我是觉得我是要安装在系统中的为啥要写到这个目录下!
!
!
不是要安装系统相应的目录下面么?
?
?
额,先把疑问放在这里,之后一起解答!
!
2,%files对于这个宏,我看啦文档有两个说法,有说是要保存的文件,
“本段是文件段,它定义的是软件包需要包含哪些文件。
本段通常放在描述文件尾部,以便于添加文件名,便于编辑”。
也有说最后软件就安装在这个目录下。
到底谁正确不知道,呵呵!
好的,这就是我在打包时遇到的两个问题!
现在根据我的理解来解答,额,其实这两个问题相关的。
首先要对
BuildRoot:
%{_tmppath}/%{name}-%{version}-%{release}-root
这个参数理解,根据这个BuildRoot的字面意思就是建立根,其实这是rpm的一个原理(可以说是原理吧!
呵呵),其实rpm安装软件的过程是在先这个临时的根目录
BuildRoot:
%{_tmppath}/%{name}-%{version}-%{release}-root
下建立相应的文件,比如我下面写的:
%{__install}-d%{buildroot}%{_datadir}/SipMonitor
其中%{_datadir}这个宏的意思是/share,这句话的意思是
也就是在这个%{buildroot},rpm提供的临时的根目录下面的usr/share下面建立一个SipMonitor目录,但是软件是怎么到实际的根目录(就是我们操作系统的根目录)下面的呢?
这下就是%files这个宏的作用啦,其实上面令我产生疑问的两个说话都对,
%files
%{_datadir}/SipMonitor
这是我上面spec文件中写的,这就是把我上面临时目录下面建立的文件夹给保存,可能你看到:
%{_datadir}/SipMonitor,这句话是在系统根目录下,其实这保存也就是最后我软件安装的位置,所以说上面两种说法都是正确的。
这里一定要注意的就是这里的保存文件或者文件夹一定要是你上面%{_datadir}下面所建立的目录或者你包含这个建立的临时目录。
其实你也可以这么写,
%files
%{_prefix}// #将安装目标目录里的所有东西都打进rpm包,
这个%{_prefix}宏是/usr,这么目录包含你上面建立的目录——/usr/share/SipMonitor.只是这样安装会有很多垃圾目录生成!
上面列出的所有文件在安装时不一定全部安装,就像Windows下程序的安装方式分为典型、完全、自定义一样,Linux也会让你选择安装方式,此时我们可以用下面这条命令查看软件包将会在系统里安装哪些部分,以方便我们的选择:
rpm-qpl*.rpm
但是按照上面的写法那个写法,这时候再查看文件列表信息就是这样的
通过上面的两个图比较,明显感觉到第一副图中装的文件夹多,所以在linux下也是可以跟windows下一样,对软件可以完全安装,也可以选择部分安装。
只是linux要通过命令行的形式实现!
!
总结:
上面说啦这么多,也不知道说的清不清楚,最后总结性的说一句!
rpm用一个临时目录做为根。
进行编译安装。
然后其他脚本之类的解决包依赖和前期处理的问题。
安装的时候就根据spec的文件。
进行处理,把虚拟/中的文件按照结构,复制到你真实的/中。
下面是copy的一些觉得讲的很好的资料:
这是是google项目管理里面的一些spec的文件,呵呵,别人牛人做的,很经典的!
http:
//www.savs.hcc.edu.tw/~chuavv/rpm/maximum-rpm/p5208.html
这个是网上rpm讲的很深的文档,呵呵,很全的,不过全英语,没有办法英语差啦!
只能自己慢慢意会!
!
可以通过命令rpm--showrc查看实现代码。
另外直接通过rpm--eval"%{macro}"来查看具体对应路径。
比如我们要查看%{_bindir}的路径,就可以使用命令rpm--eval"%{_bindir}"来查看。
另外,所有的宏都可以在/usr/lib/rpm/macros里找到。
常见宏定义(左侧是宏名,右侧是相应的定义):
%_prefix/usr
%_exec_prefix%{_prefix}#展开后是/usr
%_bindir%{_exec_prefix}/bin#展开后是/usr/bin
%_sbindir%{_exec_prefix}/sbin#展开后是/usr/sbin
%_libexecdir%{_exec_prefix}/libexec#展开后是/usr/libexec
%_datadir%{_prefix}/share#展开后是/usr/share
%_sysconfdir%{_prefix}/etc#展开后是/usr/etc但是在magiclinux里%_sysconfdir代表的是/etc,这是由另一个被发行版特殊定制的文件决定的!
%_sharedstatedir%{_prefix}/com#展开后是/usr/com
%_localstatedir%{_prefix}/var#展开后是/usr/var
%_libdir%{_exec_prefix}/lib#展开后是/usr/lib
%_includedir%{_prefix}/include#展开后是/usr/include
%_infodir%{_prefix}/info#展开后是/usr/info
%_mandir%{_prefix}/man#展开后是/usr/man在magiclinux里%_mandir代表的是/usr/share/man
RPM包里面都包含什么?
里面包含可执行的二进制程序,这个程序和Windows的软件包中的.exe文件类似是可执行的;RPM包中还包括程序运行时所需要的文件,这也和Windows的软件包类似,Windows的程序的运行,除了.exe文件以外,也有其它的文件;
一个RPM包中的应用程序,有时除了自身所带的附加文件保证其正常以外,还需要其它特定版本文件,这就是软件包的依赖关系;依赖关系并不是Linux特有的,Windows操作系统中也是同样存在的;比如我们在Windows系统中运行3D游戏,在安装的时候,他可能会提示,要安装Direct9;Linux和Windows原理是差不多的;
软件安装流程图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学习 rpm 打包 小结