LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: freebsdchina

RPM 使用和制作教程集合

[复制链接]
发表于 2005-5-13 09:35:45 | 显示全部楼层
内容是很丰富 不过英文的我是看的懂

还是没找到具体的解决办法~
Post by 13251947
我只能rebuild出这些包
kernel
kernel-hugemem
kernel-hugemem-unsupported
kernel-smp
kernel-smp-unsupported
kernel-unsupported
可这机个包怎么可以得到呢?
kernel-BOOT
kernel-doc
kernel-source
回复 支持 反对

使用道具 举报

发表于 2005-6-5 13:55:31 | 显示全部楼层

[fedora-cn] 第一个打包 cce.spec 分析总结

下载 http://www.linuxsir.cn/bbs/showthread.php?t=193988
  1. %define with_xorg 1
  2. %define dist fc4
  3. Name:                 cce
  4. Version:        0.51
  5. Release:        3.%{dist}
  6. Summary:        A CJK console with many input method
  7. Summary(zh_CN):        一个自带输入法的 CJK 控制台
  8. Group:                System Environment/Shells
  9. License:        GPL
  10. URL:                http://sourceforge.net/projects/cce2k/
  11. Source0:        http://dl.sourceforge.net/cce2k/cce-0.51-02132004-dist.tgz
  12. NoSource:        0
  13. Patch0:                cce-0.51-gcc4.patch
  14. Patch1:                cce-0.51-cin2tab-makefile.patch
  15. Patch2:                cce-0.51-doc-makefile.patch
  16. Patch3:                cce-0.51-default-im.diff
  17. BuildRoot:        %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
  18. Requires:       SDL, freetype >= 2.1, gpm
  19. BuildRequires:  SDL-devel, freetype-devel >= 2.1, gpm-devel
  20. %if %{with_xorg}
  21. Requires:        xorg-x11
  22. BuildRequires:        xorg-x11-devel
  23. %else
  24. Requires:        XFree86
  25. BuildRequires:        XFree86-devel
  26. %endif


  27. %description
  28. CCE let you display and input Chinese/Japanese/Korean/UTF8 in many OS:
  29. Linux *BSD Solaris LynxOS QNX SCOUnix Minix Hurd BeOS Windows Darwin MacOSX.
  30. It supports console(framebuffer/VGA) & X11(through GGI/SDL), bitmap/TrueType
  31. fonts and many input methods.

  32. %description -l zh
  33. CCE 使您能在多种操作系统里显示和输入中文/日文/韩文/UTF-8:
  34. Linux *BSD Solaris LynxOS QNX SCOUnix Minix Hurd BeOS Windows Darwin
  35. MacOSX。它支持控制台(祯缓冲/VGA)以及 X11(通过 GGI/SDL),bitmap/TrueType
  36. 字体和众多输入法。

  37. %prep
  38. %setup -q
  39. %patch -p1
  40. %patch1 -p1
  41. %patch2 -p1
  42. %patch3 -p1

  43. %build
  44. %configure --enable-gpmmouse --enable-fb --enable-sdl --enable-freetype --enable-filter --enable-memfile --enable-x11fonts
  45. make

  46. %install
  47. rm -rf $RPM_BUILD_ROOT

  48. %makeinstall

  49. pushd %{buildroot}%{_bindir}
  50.         chmod 0755 cce
  51.         rm -rf cceb5 cceconv ccegbk ccejis cceksc
  52. popd

  53. mkdir -p %{buildroot}%{_sysconfdir}
  54. pushd %{buildroot}%{_datadir}/cce
  55.         mv cce.cfg %{buildroot}%{_sysconfdir}/cce.conf
  56.         rm -f cin2tab bdf2bin
  57. popd


  58. %clean
  59. rm -rf $RPM_BUILD_ROOT

  60. %post
  61. cd %{_bindir}
  62.         ln -sf cce cceb5
  63.         ln -sf cce cceconv
  64.         ln -sf cce ccegbk
  65.         ln -sf cce ccejis
  66.         ln -sf cce cceksc
  67. cd %{_datadir}/cce
  68.         ln -sf /etc/cce.conf cce.cfg

  69. %preun
  70. if [ $1 -eq 0 ]; then
  71.         cd %{_bindir}
  72.                 rm -f cceb5 cceconv ccegbk ccejis cceksc
  73.         cd %{_datadir}/cce
  74.                 rm -f cce.cfg
  75. fi

  76. %files
  77. %defattr(-,root,root,-)
  78. %doc AUTHORS BUGS COPYING ChangeLog INSTALL README* TODO
  79. %config(noreplace) %{_sysconfdir}/cce.conf
  80. %{_bindir}/*
  81. %{_mandir}/man1/*
  82. %{_datadir}/%{name}

  83. %changelog
  84. * Sun Jun 5 2005 Yuan Yijun <bbbush@163.com> - 0.51-3
  85. - move pushd and popd to %post to avoid check-files error
  86.   set default im to 全拼 since we cannot use 智能拼音 as normal user :(

  87. * Sat Jun 4 2005 Yuan Yijun <bbbush@163.com> - 0.51-2
  88. - use pushd and popd in spec by gugong @ linuxfans
  89.   patch doc/Makefile.am by sunmoon1997 @ linuxsir
  90.   patch inputs/all/Makefile.in and input/utils/Makefile.in
  91.   since we don't install cin2tab so we simply set CCELIB to ../utils/

  92. * Mon Apr 25 2005 Yuan Yijun <bbbush@163.com>
  93. - compile on gcc4 for fedora.

  94. * Sun Sep 19 2004 kde <jack@linux.net.cn>
  95. - 0.51 release
  96. - initialize the first spec file
复制代码

  1. %define         dist fc4
  2. Name:           cce-24x24fonts
  3. Version:        0.50
  4. Release:        1.%{dist}
  5. Summary:        24x24 fonts for cce
  6. Summary(zh_CN):        用于 cce 的 24x24 点阵字体
  7. Group:                Documentation
  8. License:        Distributable
  9. URL:            http://dl.sourceforge.net/cce/cce-24x24fonts-dist.tgz
  10. Source0:        http://dl.sourceforge.net/cce/cce-24x24fonts-dist.tgz
  11. NoSource:        0
  12. Patch0:                cce-24x24fonts-gcc4.patch
  13. BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

  14. Requires:       cce

  15. %description
  16. 24x24 fonts for cce

  17. %description -l zh
  18. 用于 cce 的 24x24 点阵字体

  19. %prep
  20. %setup -q
  21. %patch0 -p1


  22. %build
  23. %configure
  24. make #%{?_smp_mflags}


  25. %install
  26. rm -rf $RPM_BUILD_ROOT
  27. %makeinstall
  28. pushd %{buildroot}%{_datadir}/cce
  29.         rm -f bdf2bin
  30. popd



  31. %clean
  32. rm -rf $RPM_BUILD_ROOT


  33. %files
  34. %defattr(-,root,root,-)
  35. %doc AUTHORS ChangeLog COPYING INSTALL NEWS README
  36. %{_datadir}/cce/*


  37. %changelog
  38. * Sun Jun 5 2005 Yuan Yijun <bbbush@163.com> - 0.50-1
  39. - initial import
复制代码


动手做一个 spec 才发现要达到 fedora-extras 的要求不是很容易。好在也不是很难,只要多了解一些情况,使用通行的惯例和工具就可以了。下面说得将会很零散,因为本来就是从网上很零散地查找到的。

1. fedora-extras 提供了 fedora-rpmdevtools 工具。使用 yum install fedora-rpmdevtools 来安装这个工具。这个工具包含了很多辅助工具,包括
  1. /usr/bin/fedora-buildrpmtree
  2. /usr/bin/fedora-diffarchive
  3. /usr/bin/fedora-extract
  4. /usr/bin/fedora-installdevkeys
  5. /usr/bin/fedora-kmodhelper
  6. /usr/bin/fedora-md5
  7. /usr/bin/fedora-newrpmspec
  8. /usr/bin/fedora-rmdevelrpms
  9. /usr/bin/fedora-rpmchecksig
  10. /usr/bin/fedora-rpminfo
  11. /usr/bin/fedora-rpmvercmp
  12. /usr/bin/fedora-wipebuildtree
  13. /usr/bin/spectool
复制代码
。另外一个必装的工具是 rpmlint,使用 yum install rpmlint 来安装,这个工具也在 fedora-extras 仓库中。

2. 制作 spec 时应当以普通用户身份,否则可能把系统搞挂掉,因为你不知道在编译过程中,这个软件包会做什么坏事。为了以普通用户身份操作,运行 fedora-bulidrpmtree 命令。这个命令在个人目录下建立一个文件夹 rpmbuild,内容类似 /usr/src/redhat,并且自动配置 $HOME/.rpmmacros 为
  1. [yuan2@geeks ~]$ cat .rpmmacros
  2. %_topdir      %(echo $HOME)/rpmbuild
  3. %_smp_mflags  -j3
  4. %__arch_install_post   /usr/lib/rpm/check-rpaths   /usr/lib/rpm/check-buildroot
复制代码
。然后,普通用户就可以编译 rpm 了。虽然这个配置不是很复杂,但是有一个专门的工具来做这件事,还是挺方便的。

3. 第一步当然是收集源代码,准备好完整的源代码,还要详细记录下载地址。如果源代码来自 cvs,通常官方发布的不同时间的 cvs 源代码打包都有着相同的名字,例如 http://download.gro.clinux.org/__tarballs/fedora-cvsroot.tar.gz 的名字总是 fedora-cvsroot.tar.gz,这在自动编译的 spec 中是不允许的,因为在验证源代码的 SHA1SUM 时候,会出现一个软件包有多个 SHA1SUM 的情况。因此下载后应该把源码包改名,加上打包的日期。例如,今天是 20050605 那么可以用 fedora-cvsroot-20050605.tar.gz 作为源码包的名字;又如 fontconfig-2.3.2.20050527.tar.bz2 这样带有版本号和日期的名字。当然,这种处理只限于 cvs 源代码无法区分的情况。

4. 有一个工具 fedora-newrpmspec 可以用来生成一个 newpackage.spec 文件。这个文件是个框架,内容大概就是这样
  1. Name:           
  2. Version:        
  3. Release:        1
  4. Summary:        

  5. Group:         
  6. License:        
  7. URL:            
  8. Source0:        
  9. BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

  10. BuildRequires:  
  11. Requires:      

  12. %description


  13. %prep
  14. %setup -q


  15. %build
  16. %configure
  17. make %{?_smp_mflags}


  18. %install
  19. rm -rf $RPM_BUILD_ROOT
  20. make install DESTDIR=$RPM_BUILD_ROOT


  21. %clean
  22. rm -rf $RPM_BUILD_ROOT


  23. %files
  24. %defattr(-,root,root,-)
  25. %doc



  26. %changelog
复制代码

这个 spec 是一个“最小值”,通常生成这样一个框架和设置 rpmbuildroot 一样很简单却很讨厌,使用工具就简单多了。


5. 为软件包选择一个合适的名称。通常的规矩是上游叫它什么,软件包的名称就叫什么。如果上游没有明确的名称,或者使用可执行文件的名称会更合适,那么就使用可执行文件名。如果是数据文件,那么就查看一下惯例的做法,例如 openoffice.org-langpack-zh_CN 这样的名称,或者 fonts-xorg-ISO8859-9-100dpi 这样的名称。直接使用源码包的名称也是个好办法。一旦选好了名称,例如我们的 cce 选定之后,将 newpackage.spec 移动到 $(rpmbuild)/SPECS 目录:mv newpackage.spec $(HOME)/rpmbuild/SPECS/cce.spec

6. 填充 spec 的内容。如果包含中文,修改后一定要用 UTF-8 来保存文件!

6.1 spec 的最前面是 %define 部分,定义 %define dist fc4 只是权益之计,因为还不知道 %{dist} 究竟怎么用 (FIXME! ) 接下来,Name 是刚才选定的,Release 默认是 1,每次修改 spec 或者 patch 都应该把 Release 增加 1,并且这里加上了 %{dist} 后缀。Summary 只能有一句,并且绝对不能太长。有个很奇怪的限制,这句话的最后不能用句点。这也是用 rpmlint 查出来的。
6.2  Group 的定义,参见 /usr/share/doc/rpm-*/GROUPS 文件,据说这个定义已经好多年没有变动了,也许以后也不可能再变了,虽然不合理,但是不能捏造。Group(zh_CN) 是按照 magic 的规矩捏造的。License 是 GPL 或者 Distributable 之类的,这里不能用 Copying,只能用 License,否则编译会报错。源代码地址 Source0 必须带有 URL,这样自动编译时,可以验证源代码是否可以下载。我喜欢在 Source0 后面再加上一个 NoSource 0 也就是在源代码srpms中只包含 spec 和 patch,这样发送给别人时会更方便一点 根据网上的文档,如果你的 spec 是重新写的,而其他人或者上游已经提供了一个 spec,那么可以在这里定义一个 Source99 来包含那份暂时不用的 spec,也许其他人有一天会用到。另外,按照网上的文档,不能在 Source0 中使用宏,这里也是自动编译的原因。
6.3  接下来是 Patch,再接下来是 Requires 等等。按照网上的文档,不要包含 Packager 和 Vendor 标记。这和使用 License 代替 Copying 一样是强制的规定,不知道为什么。Requires(pre) 和 Requires(post) 用来定义安装顺序,如果你的 scriptlet 要用到其他软件包,那么必须在 Requires(pre) 和 Requires(post) 里面定义他们。因为经常有这样的情况,一个软件包仅仅在安装和卸载时会用到 desktop-file-install 或者 alternatives 这些程序,而平时运行时不会使用它们,因此使用 Requires(pre) 和 Requires(post)。
6.4 %description 有一个很著名的限制,就是一行不能超过 80 个字符,否则会把某些终端搞乱掉。实际上除去回车,一行只能写 79 个字符了。使用 rpmlint 可以很容易检查到这些错误。%prep, %build 和 %install 是编译和安装的全过程,应该灵活地把握这个过程,利用各种宏。小心宏之间的不同之处。cce 倒是没什么特别的,不能使用默认的 make install DESTDIR=$RPM_BUILD_ROOT,应该用 %makeinstall,因为在所有的 Makefile.in 都定义了 CCE_SHARE_DIR=$(DESTDIR)$(datadir) (具体是怎么回事,我也说不明白 :beat)。 cce 默认的 make install 很讨厌,把配置文件装在 /usr/share/cce/cce.cfg,并且把两个可执行文件也装到了 /usr/share/cce 目录,因此这里在 %install 把它们都删掉了。rpmlint 还检查到了 setuid 的问题,因此需要重新设置一下 cce 的文件模式,代价就是不能在 VGA 中使用,也不能使用智能拼音输入法,不能保存词库。为了通过 rpmlint 的检测,没有办法
6.5 在小程序 (%pre, %post, %preun, %postun, 以及 triggers) 这里,好像有很多规定,包括使用 desktop-file-install,以及刷新 icon cache 等等,不过这里还没有用到。这里是在 %post 和 %preun 建立了一些链接。不知道为什么我的系统里不能在 %files 中包含链接,所以只好在 scriptlet 里面做了 (FIXME! :comp) 另外,要判断 $1 的值,来决定是否进行操作。大概的规矩就是,在升级时,%preun 和 %postun 的 $1=1,在单纯卸载时 $1=0,这样就不会因为升级而错误地执行卸载程序。参见 www.fedora.us/wiki/PackagingHints ,这个页面应该已经搬到了 http://fedoraprojects.org 但是从 livna 只追踪到了 fedora.us 的链接
6.6 %files 这一处,要设定权限,区分不同的文件类型。如果有其他语言的 man 文本,还应该用 %lang(zh_CN) 来区分语言,可以参考 rpm.spec 里面的示例。%changelog 的格式中,要记住更新第一行最后的软件包版本。

7. 做好了 rpm 以后就是打包。通常,在 SOURCES 目录,将软件包源代码解压,随时准备打 patch。使用 gendiff 命令可以很容易地生成符合要求的 patch,每做好一个 patch 之后只要稍微修改 spec 就可以了。每个 patch 应该对应一种修改,不要把好多 patch 都合到一起。可以顺利编译之后,使用 rpmlint 来校验生成的 rpm,会发现很多需要改的地方。这个过程听起来不是很难,习惯了之后,总是几个命令 vi, gendiff, vi, rpmbuild, vi, rpmlint ……

8. 提交啊,fedora-cn gro cvs,还有邮件列表,论坛,各发一份。修改得烦死了。:beat


-
回复 支持 反对

使用道具 举报

发表于 2005-11-28 10:40:38 | 显示全部楼层
如果只编译适于 fedora 的 rpm,推荐使用 mock
Mock Readme
Mock is a simple chroot/rpm building program. It doesn't do anything
terribly fancy other than build a single srpm at a time in a chroot.

You invoke it as:
mock -r name-of-chroot /path/to/srpm

options:
  -r CHROOT             chroot name/config file name default: chroot.cfg
  --no-clean            do not clean chroot before building
  --arch=ARCH           target build arch
  --debug               Output copious debugging information
  --resultdir=RESULTDIR
                        path for resulting files to be put
  --statedir=STATEDIR   path for state dirresulting files to be put
  --uniqueext=UNIQUEEXT
                        Arbitrary, unique extension to append to buildroot
                        directory name

commands:
  init  - initialize a chroot (install pkgs, setup devices, etc,) then exit
  clean - purge the chroot tree - normally this happens right before a build
          but this is for the tidy-minded
  rebuild <srpm> - for mach compatibility

mock does:
- builds the chroot
- takes the srpm, rebuilds into another srpm
   - it does this to make sure that the build deps in the spec file are
     made in the right environment.

- takes the build deps from the new srpm and installs them.
- rebuilds the new srpm into binary packages
- copies the binary packages into the result dir
- logs nicely so that chroot creation and build logs are separate
- outputs little unless it needs to.


TODO: document more
TODO: man page?
回复 支持 反对

使用道具 举报

发表于 2006-11-5 19:14:46 | 显示全部楼层
用了一下午看了 bbbush的文章 终于打包了自己的第一个rpm
开始的时候主要是一些语法错误 后来更正之后 发现 打包出来的rpm 是空的  郁闷死了 弄了好长时间也没发现什么错误 一行行的看 最后才发现 原来 %doc下面少了要打包的文件
加上  %{_bindir}/* 就好了 同样 可以加上
%{_infodir}/*
%{_mandir}/*
%{_datadir}/×
不然打出来的就是空包了 我郁闷了好久
下面是我为conky打包的spec文件 (应该是minimal的 )
  1. Name:   conky
  2. Version:     1.4.2
  3. Release:        1%{?dist}
  4. Summary:       conky
  5. Group:          User Interface/X
  6. License:        GPLv2
  7. URL:           www.conky.org
  8. Source0:     %{name}-%{version}.tar.bz2   
  9. BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
  10. BuildRequires:  fontconfig
  11. Requires:       fontconfig
  12.      
  13. %description
  14. %prep
  15. %setup -q
  16. %build
  17. %configure
  18. make %{?_smp_mflags}
  19. %install
  20. rm -rf $RPM_BUILD_ROOT
  21. make install DESTDIR=$RPM_BUILD_ROOT
  22. %clean
  23. rm -rf $RPM_BUILD_ROOT
  24. %files
  25. %defattr(-,root,root,-)
  26. %doc
  27. %{_bindir}/*
  28. %changelog
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-11-5 21:37:42 | 显示全部楼层
thanks
回复 支持 反对

使用道具 举报

发表于 2006-11-6 00:16:20 | 显示全部楼层
呵呵 支持支持啊!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表