关闭

实战RPM包制作

标签: 制作rpm包
225人阅读 评论(0) 收藏 举报
分类:
  在开发中经常会用到一些rpm包,但是一直没有自己手动制作过。今天在制作的时候意外地还解决了自己以前一直困惑的问题,就是怎么制作rpm debuginfo包,类似CentOS官网那样的debuginfo包。原来在制作rpm时如果没有特殊设置就会在RPMS目录下同时生成rpm包及对应的debuginfo包。
  下面总结一下制作rpm包的流程以及遇到的一些问题的解决。
  1、配置工作路径
  在制作rpm包之前,首先要配置工作路径,也就是制作rpm包所在的目录,当前的工作路径可以通过rpmbuild命令查看,如下所示:

  工作路径是由_topdir变量指定的,默认情况下是当前用户目录下的rpmbuild目录。如果你在制作rpm包之前不知道需要设置工作路径的话,只是单纯地照搬网上的一些文章,在后面制作的时候很有可能会报找不到源码包等类似的错误。如果你不想在用户目录下的rpmbuild目录制作rpm包,可以在当前用户目录下的.rpmmacros文件(如果没有,则创建)中修改,格式为:
% _topdir 你的目录
我这里设置的是/usr/src/redhat,后面的制作过程都是在这个目录下进行。
  默认情况下会生成debuginfo包,如果不需要debuginfo包,在.rpmmacros文件中添加"%debug_package %{nil}"。
2、建立所需要的目录
mkdir -pv /usr/src/redhat/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
 目录说明:

3、编写spec文件

  spec文件是制作rpm包的关键,定义了rpmbuild命令生成时需要遵循的一些规则。下面的spec文件是以nginx为例来制作rpm包:

[plain] view plaincopy
  1. # 这个区域定义的Name、Version这些字段对应的值可以在后面  
  2. # 通过%{name},%{version}这样的方式来引用,类似于C语言中的宏  
  3.    
  4. # Name制定了软件的名称  
  5. Name:       nginx  
  6. # 软件版本  
  7. Version:    1.5.2   
  8. # 释出号,也就是第几次制作rpm  
  9. Release:    1%{?dist}  
  10. # 软件的介绍,必须设置,最好不要超过50个字符  
  11. Summary:    Nginx from WangYing  
  12.    
  13. # 软件的分组,可以通过/usr/share/doc/rpm-4.8.0/GROUPS文件中选择,也可以  
  14. # 在相应的分类下,自己创建一个新的类型,例如这里的Server  
  15. Group:      Application/Server  
  16. # 许可证类型  
  17. License:    GPL  
  18. # 软件的源站  
  19. URL:        http://nginx.org  
  20. # 制作rpm包的人员信息  
  21. Packager:   WangYing <justlinux2010@gmail.com>  
  22. # 源码包的名称,在%_topdir/SOURCE下,如果有多个源码包的话,可以通过  
  23. # Source1、Source2这样的字段来指定其他的源码包  
  24. Source0:    %{name}-%{version}.tar.gz  
  25. # BuildRoot指定了make install的测试安装目录,通过这个目录我们可以观察  
  26. # 生成了哪些文件,方便些files区域。如果在files区域中写的一些文件报  
  27. # 不存在的错误,可以查看%_topdir/BUILDROOT目录来检查有哪些文件。  
  28. BuildRoot:  %_topdir/BUILDROOT  
  29. # 指定安装的路径  
  30. Prefix:     /usr/local/nginx-1.5.2  
  31.    
  32. # 制作过程需要的工具或软件包  
  33. BuildRequires:  gcc,make  
  34. # 安装时依赖的软件包  
  35. Requires: pcre,pcre-devel,openssl  
  36.    
  37. # 软件的描述,这个可以尽情地写  
  38. %description  
  39. Nginx is a http server  
  40.    
  41. # %prep指定了在编译软件包之前的准备工作,这里的  
  42. # setup宏的作用是静默模式解压并切换到源码目录中,  
  43. # 当然你也可以使用tar命令来解压  
  44. %prep  
  45. %setup -q  
  46.    
  47. # 编译阶段,和直接编译源代码类似,具体的操作或指定的一些参数由configure文件决定。  
  48. %build  
  49. CFLAGS="-pipe -O2 -g -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror" ./configure --prefix=%{prefix}  
  50. # make后面的意思是:如果是多处理器,则并行编译  
  51. make %{?_smp_mflags}  
  52.    
  53. # 安装阶段  
  54. %install  
  55. # 先删除原来的测试安装的,只有在制作失败了%{buildroot}目录才会有内容,  
  56. # 如果成功的话,目录下会被清除。  
  57. # %{buildroot}指向的目录不是BuildRoot(%_topdir/BUILDROOT)指定的目录,  
  58. # 而是该目录下名称与生成的rpm包名称相同的子目录。例如我的是  
  59. # /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64  
  60. rm -rf %{buildroot}  
  61. # 指定安装目录,注意不是真实的安装目录,是在制作rpm包的时候指定的  
  62. # 安装目录,如果不指定的话,默认就会安装到configure命令中指定的prefix路径,  
  63. # 所以这里一定要指定DESTDIR  
  64. make install DESTDIR=%{buildroot}  
  65.    
  66. # 安装前执行的脚本,语法和shell脚本的语法相同  
  67. %pre  
  68.    
  69. # 安装后执行的脚本  
  70. %post  
  71.    
  72. # 卸载前执行的脚本,我这里的做的事情是在卸载前将nginx服务器停掉  
  73. %preun  
  74.     MSG=`ps aux | grep nginx | grep -v "grep"`  
  75.     if [ -z "$MSG" ];then  
  76.         killall nginx 1>/dev/null 2>/dev/null  
  77.     fi  
  78.    
  79. # 卸载完成后执行的脚本  
  80. %postun  
  81.     rm -rf %{prefix}  
  82.    
  83. # 清理阶段,在制作完成后删除安装的内容  
  84. %clean  
  85. rm -rf %{buildroot}  
  86.    
  87. #指定要包含的文件  
  88. %files  
  89. #设置默认权限,如果没有指定,则继承默认的权限  
  90. %defattr  (-,root,root,0755)  
  91. %{prefix}  
如果在制作的过程中报类似下面的错误,检查你的files区域,看要包含的文件是否存在。

[plain] view plaincopy
  1. + /usr/lib/rpm/check-buildroot  
  2. + /usr/lib/rpm/redhat/brp-compress  
  3. + /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip  
  4. + /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump  
  5. + /usr/lib/rpm/brp-python-bytecompile  
  6. + /usr/lib/rpm/redhat/brp-python-hardlink  
  7. + /usr/lib/rpm/redhat/brp-java-repack-jars  
  8. Processing files: nginx-1.5.2-1.el6.x86_64  
  9. error: File not found: /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64/usr/local/nginx  
  10.    
  11.    
  12. RPM build errors:  
  13.     File not found: /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64/usr/local/nginx  
[plain] view plaincopy
  1.   

来源:http://blog.csdn.net/justlinux2010/article/details/9905425

参考:http://www.ibm.com/developerworks/cn/linux/l-rpm/

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:177630次
    • 积分:2470
    • 等级:
    • 排名:第15533名
    • 原创:17篇
    • 转载:325篇
    • 译文:4篇
    • 评论:3条
    最新评论