|
|
发表于 2005-6-5 13:55:31
|
显示全部楼层
[fedora-cn] 第一个打包 cce.spec 分析总结
下载 http://www.linuxsir.cn/bbs/showthread.php?t=193988
- %define dist fc4
- Name: cce-24x24fonts
- Version: 0.50
- Release: 1.%{dist}
- Summary: 24x24 fonts for cce
- Summary(zh_CN): 用于 cce 的 24x24 点阵字体
- Group: Documentation
- License: Distributable
- URL: http://dl.sourceforge.net/cce/cce-24x24fonts-dist.tgz
- Source0: http://dl.sourceforge.net/cce/cce-24x24fonts-dist.tgz
- NoSource: 0
- Patch0: cce-24x24fonts-gcc4.patch
- BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
- Requires: cce
- %description
- 24x24 fonts for cce
- %description -l zh
- 用于 cce 的 24x24 点阵字体
- %prep
- %setup -q
- %patch0 -p1
- %build
- %configure
- make #%{?_smp_mflags}
- %install
- rm -rf $RPM_BUILD_ROOT
- %makeinstall
- pushd %{buildroot}%{_datadir}/cce
- rm -f bdf2bin
- popd
- %clean
- rm -rf $RPM_BUILD_ROOT
- %files
- %defattr(-,root,root,-)
- %doc AUTHORS ChangeLog COPYING INSTALL NEWS README
- %{_datadir}/cce/*
- %changelog
- * Sun Jun 5 2005 Yuan Yijun <bbbush@163.com> - 0.50-1
- - initial import
复制代码
动手做一个 spec 才发现要达到 fedora-extras 的要求不是很容易。好在也不是很难,只要多了解一些情况,使用通行的惯例和工具就可以了。下面说得将会很零散,因为本来就是从网上很零散地查找到的。
1. fedora-extras 提供了 fedora-rpmdevtools 工具。使用 yum install fedora-rpmdevtools 来安装这个工具。这个工具包含了很多辅助工具,包括- /usr/bin/fedora-buildrpmtree
- /usr/bin/fedora-diffarchive
- /usr/bin/fedora-extract
- /usr/bin/fedora-installdevkeys
- /usr/bin/fedora-kmodhelper
- /usr/bin/fedora-md5
- /usr/bin/fedora-newrpmspec
- /usr/bin/fedora-rmdevelrpms
- /usr/bin/fedora-rpmchecksig
- /usr/bin/fedora-rpminfo
- /usr/bin/fedora-rpmvercmp
- /usr/bin/fedora-wipebuildtree
- /usr/bin/spectool
复制代码 。另外一个必装的工具是 rpmlint,使用 yum install rpmlint 来安装,这个工具也在 fedora-extras 仓库中。
2. 制作 spec 时应当以普通用户身份,否则可能把系统搞挂掉,因为你不知道在编译过程中,这个软件包会做什么坏事。为了以普通用户身份操作,运行 fedora-bulidrpmtree 命令。这个命令在个人目录下建立一个文件夹 rpmbuild,内容类似 /usr/src/redhat,并且自动配置 $HOME/.rpmmacros 为- [yuan2@geeks ~]$ cat .rpmmacros
- %_topdir %(echo $HOME)/rpmbuild
- %_smp_mflags -j3
- %__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 文件。这个文件是个框架,内容大概就是这样- Name:
- Version:
- Release: 1
- Summary:
- Group:
- License:
- URL:
- Source0:
- BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
- BuildRequires:
- Requires:
- %description
- %prep
- %setup -q
- %build
- %configure
- make %{?_smp_mflags}
- %install
- rm -rf $RPM_BUILD_ROOT
- make install DESTDIR=$RPM_BUILD_ROOT
- %clean
- rm -rf $RPM_BUILD_ROOT
- %files
- %defattr(-,root,root,-)
- %doc
- %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
- |
|