免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 117318 | 回复: 41
打印 上一主题 下一主题

Linux平台软件管理系统设计与规划-进阶篇(2)-rpm生成:rpmbuild 和 spec文件剖析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-16 18:19 |只看该作者 |正序浏览
本帖最后由 duanjigang 于 2012-12-22 22:47 编辑

转载请保留作者信息和来自CU的原站
在第一篇文章中,我们介绍了 rpm 文件的基本概念,协议格式等基础知识。最近几周一直在断断续续的谋划第二篇的内容,终于定下来:以 RPM 文件的制作为使用情景,
主要介绍 rpm 生成工具 rpmbuild 和 rpm 定义文件 spec 文件。

其中 rpmbuild 部分针对rpmbuild 的使用方法,如何使用该命令来制作rpm文件,step by step.
另外,大多数内容以 spec 文件的语法为主,只有彻底掌握spec 中的各种玄机,才能对 rpm 的生成掌握牢固。
废话不多,让我们开始!

论坛徽章:
10
数据库技术版块每日发帖之星
日期:2015-06-14 22:20:00数据库技术版块每日发帖之星
日期:2016-03-10 06:20:00数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00IT运维版块每日发帖之星
日期:2015-11-09 06:20:00IT运维版块每日发帖之星
日期:2015-11-02 06:20:00IT运维版块每日发帖之星
日期:2015-07-13 22:59:28IT运维版块每日发帖之星
日期:2015-06-23 22:20:00程序设计版块每日发帖之星
日期:2015-06-21 22:20:00每日论坛发贴之星
日期:2015-06-14 22:20:00IT运维版块每日发帖之星
日期:2016-08-02 06:20:00
42 [报告]
发表于 2015-08-12 08:54 |只看该作者
学习学习。

论坛徽章:
0
41 [报告]
发表于 2014-04-22 20:08 |只看该作者
mark 一下,回头有空再看

论坛徽章:
9
CU大牛徽章
日期:2013-04-17 11:06:23CU大牛徽章
日期:2013-04-17 11:08:52CU大牛徽章
日期:2013-04-17 11:09:10CU大牛徽章
日期:2013-04-17 11:09:40CU大牛徽章
日期:2013-04-17 11:09:57CU大牛徽章
日期:2013-04-17 11:10:17CU大牛徽章
日期:2013-05-20 10:43:41CU大牛徽章
日期:2013-05-20 10:44:06CU大牛徽章
日期:2013-05-20 10:44:16
40 [报告]
发表于 2013-03-28 16:18 |只看该作者
先mark再看。。。

论坛徽章:
0
39 [报告]
发表于 2013-03-22 12:35 |只看该作者
谢谢分享!!!!:wink:

论坛徽章:
0
38 [报告]
发表于 2012-12-25 21:55 |只看该作者
你说的第一点正是我要表达的。
第二个现象我再检查下我的spec文件。

回复 36# libinbluewolf


   

论坛徽章:
0
37 [报告]
发表于 2012-12-25 17:14 |只看该作者
本帖最后由 libinbluewolf 于 2012-12-26 21:21 编辑

我还有其他的一些疑问,发到这里讨论一下:

  1. - What is `%{with xxx}`

  2.         %if %{with openssl}
  3.         BuildRequires:  openssl-devel
  4.         %endif

  5.         `%{with xxx}` is shorthand for `%{defined with_xxx}`.

  6. - What is `0%{?xxx:1}`

  7.         %if 0%{?_with_stunnel:1}
  8.         # used by the testsuite
  9.         BuildRequires:  stunnel
  10.         %endif

  11.         `{?_with_stunnel:1}`是一个Macro,如果定义了`_with_stunnel` tag,则这个Macro被扩展成`1`,否则就是nothing。`%if 0%{?with_stunnel:1}等同于`%if %{with stuneel}`.
  12.         还有另外一种相反的语法`%{!?SOME:1}`,如果没定义`SOME` tag,则该Macro被扩展为`1`,否则就是nothing。
  13.         因此,下面这句就完成了常用的一种逻辑:使用变量CUSTOM_RELEASE的值,如果没定义,则使用1
  14.         %define rel     %{?CUSTOM_RELEASE} %{!?CUSTOM_RELEASE:1}

  15. - What is `Obsoletes`

  16.         # bug437293
  17.         %ifarch ppc64
  18.         Obsoletes:      curl-64bit
  19.         %endif

  20.         声明这个rpm package安装后,`curl-64bit`这个package就可以废弃了。Refer to http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch-dependencies.html#RPM_Guide-Dependencies-obsoletes

  21. - What is `%defattr(-,root,root)` in %files list

  22.         What's the difference with `attr` directive?

  23.         Ans. `%defattr` is default attribution. 格式是`%defattr(file_mode, owner, group, dir_mod)`. Refer to http://www.rpm.org/max-rpm-snapshot/s1-rpm-inside-files-list-directives.html

  24. - What is `Requires(pre)`

  25.         Requires(pre): /usr/sbin/useradd
  26.         Requires(post): chkconfig

  27.         我实验的结果是括号中的内容被rpmbuild/rpm忽略,可能只是为了可读性.

  28. - What is `Prereq` and `BuildPrereq`

  29.         # In httpd.spec
  30.         BuildPrereq: apr-devel, apr-util-devel, openldap-devel, db4-devel, expat-devel, findutils, perl, pkgconfig, pcre-devel >= 5.0
  31.         BuildPrereq: /usr/bin/apr-1-config, /usr/bin/apu-1-config
  32.         Requires: apr >= 1.4.2, apr-util >= 1.3.10, pcre >= 5.0, gawk, /usr/bin/find, openldap
  33.         Prereq: /sbin/chkconfig, /bin/mktemp, /bin/rm, /bin/mv
  34.         Prereq: sh-utils, textutils, /usr/sbin/useradd


复制代码

论坛徽章:
0
36 [报告]
发表于 2012-12-25 17:10 |只看该作者
所以
  1. %post -p /sbin/ldconfig
复制代码
完全等同于
  1. %post
  2. /sbin/ldconfig
复制代码
喽?

你说的现象难道是把这行
  1. #%preun  -p /usr/bin/uptime
复制代码
uncomment的话,就不会传递operation参数(1/2)给%post/%postun了吗? 我试了一下,并没有你所说的现象……

论坛徽章:
0
35 [报告]
发表于 2012-12-25 05:03 |只看该作者
回复 34# libinbluewolf

spec 中默认对 hook 段的代码采用 /bin/sh 去解释,用户可以自己修改解释器,通过 %hook -p path 的方式来指定。
常见到的好多lib中

  1. %post  -p /sbin/ldconfig
  2. %postun -p /sbin/ldconfig
复制代码
的方式就是在安装/升级/卸载后显示调用/sbin/ldconfig 来更新链接库信息,比如你也可以写成这样子

  1. %post -p /bin/date
  2. %postun -p /usr/bin/uptime
复制代码
这些都容易理解,但是有一个现象比较奇怪,我还没弄清楚。
%post %postun 或者 %preun
在一起出现两个或者以上时 -p path 执行的就没问题,
但是单个出现时,比如:

  1. %post  -p /bin/date

  2. #%preun  -p /usr/bin/uptime

  3. %verifyscript
  4. echo "verify by duanjigang now"
复制代码
这样的方式,安装时,它就会把操作标志位通过第一个参数的方式传递给解释器,从而导致报错,比如 install 时参数是1,update 是2
我上面的写法在安装时会报错:

  1. sudo rpm -ivh RPMS/i386/test-baby-1.1-1.i386.rpm
  2. Preparing...                ########################################### [100%]
  3.    1:test-baby              ########################################### [100%]
  4. /bin/date: 额外的操作数 “1”
  5. 请尝试执行“/bin/date --help”来获取更多信息。
  6. error: %post(test-baby-1.1-1.i386) scriptlet failed, exit status 1
复制代码
这个可以理解,是因为执行了 "/bin/date 1"命令。 但是不清楚为什么%post 单独出现时就会传递operation参数1/2给它,而最少两个hook出现时就不会传递参数给它。。
有知道这个现象的朋友帮解释下,谢谢!



   

论坛徽章:
0
34 [报告]
发表于 2012-12-24 23:32 |只看该作者
我最近也在研究rpmbuild,max-rpm已经快看完了。从哪里能下载到一些(>10个)的source rpm,然后学习下他们的spec脚本?

另外,我在一些spec中看到这样的写法,不知道其作用:

%post -p /sbin/ldconfig

'-p'在这里是什么意思呢?
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP