天天看点

linux下的rpm包的制作--以红旗2009开源大赛附加题为例

一、首先准备rpmbuild命令,采用yum install rpm-build -y

特别注意:不是rpmbuild,而是rpm-build,用rpmbuild系统会提示你压根就没有这款软件。

二、先在当前目录下运行

1、[root@liukai rpm]# rpmbuild -ba rar.spec

error: Architecture is not included: i386

发生错误,说是当前cpu架构i386在rar.spec文件中没有指定,那你说哪错咱就往哪改呗,那么现在就开始指定

在rar.spec中加入,ExclusiveArch:    i686 i386

2、[root@liukai rpm]# rpmbuild -ba rar.spec

error: File /usr/src/redhat/SOURCES/rarlinux-3.6.b1.tar.gz: 没有那个文件或目录

现在我知道了,要把rarlinux-3.6.b1.tar.gz放到那里了,执行

mv ./rarlinux-3.6.b1.tar.gz /usr/src/redhat/SOURCES/

3、[root@liukai rpm]# rpmbuild -ba rar.spec

怪了,不是都方下去了吗?会不会是文件权限?

[root@liukai rpm]# ll  /usr/src/redhat/SOURCES/

总计 756

-rwxr-xr-x 1 root root 769033 11-16 15:08 rarlinux-3.7.b1.tar.gz

看来不是权限问题,难道就是题目中的陷阱?

呵呵,睁大眼睛一看,原来是版本号不同。

查看了rarlinux-3.7.b1.tar.gz里面的README,没有版本的说明,又看了whatsnew.txt,里面第二行就是“rarlinux-3.7.b1.tar.gz”!

OK,现在把rar.spec文件中的Version:    3.6改为Version:    3.7

4、这下又往前走了点,但肯定还是错误

[root@liukai rpm]# rpmbuild -ba rar.spec

error: bad date in %changelog: fri nov 13  2009 dtteam 3.7-1.beta1

不是吧,%changelog也被红旗动了手脚?这是红旗有错误的源文件中的%changelog段:

%changelog

* fri nov 13  2009 dtteam 3.7-1.beta1

- Update to 3.7 beta1 (aka 3.7.b1).

而在%define段中

Name:        rar

Version:    3.7

Release:    1

晕倒,不看不知道,一看吓一跳,问题可是不少哦,首先是Name项,应该是rarlinux,而不是rar;其次,Release不应该是1,而是1-beta1,因为log中说道是升级到beta1版。

先修改

Name:        rarlinux

Release:    1-beta1

结果是:

error: line 11: Illegal char '-' in release: Release:   1-beta1

看来有些不对,回头一想,人家也没提示我Name或Realse错误阿,就是说error: bad date,是日期错误。

那么我就修改日期好了,fri nov 13  2009,首先这个日期的格式是正确的,是2009年11月13日星期五,而今天是2009年11月16日星期一,难不成得改成今天?激动之后,我觉得应该不是,这个日期是原代码的更新日期,和我啥时后做rpm应该没关系。但试试吧,把Name和Release改回执行。结果还是bad date。

难不成要大写?

5、改成

* Thu Nov 16  2009 dtteam 3.7-1.beta1

Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.64263

+ umask 022

+ cd /usr/src/redhat/BUILD

+ rm -rf rar-3.7

+ /bin/gzip -dc /usr/src/redhat/SOURCES/rarlinux-3.7.b1.tar.gz

+ tar -xf -

+ STATUS=0

+ '[' 0 -ne 0 ']'

+ cd rar-3.7

/var/tmp/rpm-tmp.64263: line 31: cd: rar-3.7: 没有那个文件或目录

error: Bad exit status from /var/tmp/rpm-tmp.64263 (%prep)

RPM build errors:

    Bad exit status from /var/tmp/rpm-tmp.64263 (%prep)

竟然过去了,看来是大写。这感觉和破案一样,真是太爽了。不过现在不能高兴太早,任务还没完成呢。接着看,程序在“/var/tmp/rpm-tmp.64263: line 31: cd: rar-3.7: 没有那个文件或目录“个地方出了错,反映出来是“/var/tmp/rpm-tmp.64263 (%prep)”,看来很可能%prep配置出错。

6、文件中原来是:

%prep

%setup -q

红旗给的教程中说道“(2) -n name :

上面已经谈到,源程序包中的文件应采用"软件名-版本号"作为上层目录。如果用了别的什么目录(如 name),%setup宏无法正常工作,那该怎么办?没关系,可以用-n选项,引用一下这个目录(name)就行了。假如我的LZE源程序包中的文件是以lze为上层目录,那么我就可以用"%setup -n lze"宏命令来解压缩该包。”。很显然,我犯的错误就是有软件名和版本号时缺少那个目录。

%setup -n %{name}

但是,我不知掉那个-q是什么。

7、程序又继续向下跑了,但又出错了。

Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.23492

+ rm -rf rar

+ cd rar

++ /usr/bin/id -u

+ '[' 0 = 0 ']'

+ /bin/chown -Rhf root .

+ /bin/chgrp -Rhf root .

+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .

+ exit 0

Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.23492

+ /bin/rm -rf /var/tmp/rar-3.7-1-root

+ /usr/bin/install -D -p -m0755 rar /var/tmp/rar-3.7-1-root/usr/bin/rar

+ /usr/bin/install -D -p -m0644 rarfiles.lst /var/tmp/rar-3.7-1-root/etc/rarfiles.lst

+ /usr/bin/install -D -p -m0755 default.sfx /usr/lib/default.sfx

+ /usr/lib/rpm/brp-compress

+ /usr/lib/rpm/brp-strip

+ /usr/lib/rpm/brp-strip-static-archive

+ /usr/lib/rpm/brp-strip-comment-note

Processing files: rar-3.7-1

error: File not found: /var/tmp/rar-3.7-1-root/usr/lib/rar

error: File not found: /var/tmp/rar-3.7-1-root/usr/lib/default.sfx

Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.55654

+ DOCDIR=/var/tmp/rar-3.7-1-root/usr/share/doc/rar-3.7

+ export DOCDIR

+ rm -rf /var/tmp/rar-3.7-1-root/usr/share/doc/rar-3.7

+ /bin/mkdir -p /var/tmp/rar-3.7-1-root/usr/share/doc/rar-3.7

+ cp -pr license.txt rar.txt readme.txt technote.txt whatsnew.txt file_id.diz /var/tmp/rar-3.7-1-root/usr/share/doc/rar-3.7

Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/rar-3.7-1-root

error: Installed (but unpackaged) file(s) found:

   /usr/bin/rar

    File not found: /var/tmp/rar-3.7-1-root/usr/lib/rar

    File not found: /var/tmp/rar-3.7-1-root/usr/lib/default.sfx

    Installed (but unpackaged) file(s) found:

感觉这回跑得比较远,离成功更加接近,因为出来了一大堆东西,一般make成功时前面才是这么一大堆提示。呵呵。别光顾着乐了,看看什么问题到底:

恩,两处文件没有,一个rar安装,但没解压,那这个生成的rar到底是什么呢?看看再说:

[root@liukai rpm]# file /usr/bin/rar

/usr/bin/rar: ERROR: cannot open `/usr/bin/rar' (No such file or directory)

嘿嘿,原来还是没有生成啊。

自己看看,那两个目录:

[root@liukai rpm]# file /var/tmp/rar-3.7-1-root/usr/

bin/   share/

[root@liukai rpm]# file /var/tmp/rar-3.7-1-root/usr/share/doc/rar-3.7/

file_id.diz   rar.txt       technote.txt 

license.txt   readme.txt    whatsnew.txt 

[root@liukai rpm]# file /var/tmp/rar-3.7-1-root/usr/bin/rar

查到一个,rar在bin下面,不在lib下,所以:

%files

%defattr(-, root, root, 0755)

%doc *.txt file_id.diz

%{_sysconfdir}/rarfiles.lst

%{_libdir}/rar   改为:%{_bindir}/rar

%{_libdir}/default.sfx

8、继续执行:rpmbuild -ba rar.spec

Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.87897

Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.87897

Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.54597

看来现在就是default.sfx文件的问题了。经验证根本就不存在/var/tmp/rar-3.7-1-root/usr/lib,这么一个目录。

哈哈,我知道了,还是得看rar.spec文件,里面说:

%install

%{__rm} -rf %{buildroot}

%{__install} -D -p -m0755 rar %{buildroot}%{_bindir}/rar

%{__install} -D -p -m0644 rarfiles.lst %{buildroot}%{_sysconfdir}/rarfiles.lst

%{__install} -D -p -m0755 default.sfx %{_libdir}/default.sfx

看到最后一行了吗?怪不得它找不到呢,因为路径就不正确嘛,改成:

%{__install} -D -p -m0755 default.sfx %{buildroot}%{_libdir}/default.sfx

9、接下来

Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.85988

+ tar -xvvf -

drwxr-xr-x root/root         0 2007-01-09 01:50:18 rar/

-rw-r----- root/root       217 2007-01-09 01:50:18 rar/file_id.diz

-rw-r----- root/root      4398 2007-01-09 01:50:18 rar/license.txt

-rw-r----- root/root       428 2007-01-09 01:50:18 rar/Makefile

-rw-r----- root/root      3183 2007-01-09 01:50:18 rar/order.htm

-rw-r----- root/root      1018 2007-01-09 01:50:18 rar/rarfiles.lst

-rw-r----- root/root     70107 2007-01-09 01:50:18 rar/rar.txt

-rw-r----- root/root      1050 2007-01-09 01:50:18 rar/readme.txt

-rw-r----- root/root      8957 2007-01-09 01:50:18 rar/technote.txt

-rw-r----- root/root      6018 2007-01-09 01:50:18 rar/whatsnew.txt

-rwxr-xr-x root/root    341152 2007-01-09 01:50:18 rar/rar

-rwxr-xr-x root/root    872804 2007-01-09 01:50:18 rar/rar_static

-rwxr-xr-x root/root    196720 2007-01-09 01:50:18 rar/unrar

-rwxr-xr-x root/root     56994 2007-01-09 01:50:18 rar/default.sfx

Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.1562

+ /usr/bin/install -D -p -m0755 default.sfx /var/tmp/rar-3.7-1-root/usr/lib/default.sfx

strip: there are no sections to be copied!

Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.1562

Finding  Provides: /usr/lib/rpm/find-provides

Finding  Requires: /usr/lib/rpm/find-requires

Requires(rpmlib): rpmlib(PayloadFilesHavePrefix)

Requires: libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.1.3) libc.so.6(GLIBC_2.2) libc.so.6(GLIBC_2.4) libgcc_s.so.1 libgcc_s.so.1(GCC_3.0) libgcc_s.so.1(GLIBC_2.0) libm.so.6 libstdc++.so.6 libstdc++.so.6(GLIBCXX_3.4)

Wrote: /usr/src/redhat/SRPMS/rar-3.7-1.src.rpm

Wrote: /usr/src/redhat/RPMS/i386/rar-3.7-1.i386.rpm

Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.61074

哈哈,很顺利的结束了。看看文件去:

[root@liukai rpm]# ls /usr/src/redhat/RPMS/i386

rar-3.7-1.i386.rpm

[root@liukai rpm]# ls /usr/src/redhat/RPMS/i686

[root@liukai rpm]# rpm2cpio /usr/src/redhat/RPMS/i386/rar-3.7-1.i386.rpm | cpio -t

./etc/rarfiles.lst

./usr/bin/rar

./usr/lib/default.sfx

./usr/share/doc/rar-3.7

./usr/share/doc/rar-3.7/file_id.diz

./usr/share/doc/rar-3.7/license.txt

./usr/share/doc/rar-3.7/rar.txt

./usr/share/doc/rar-3.7/readme.txt

./usr/share/doc/rar-3.7/technote.txt

./usr/share/doc/rar-3.7/whatsnew.txt

952 blocks

现在心情很好!

红旗2009开源软件大赛RPM附加题原题地址为:

http://edu.redflag-linux.com/comp/category.php?id=8

中的“附加题:收据打包项目(可选题)”小节

继续阅读