hongfeng 发表于 2004-5-10 10:47:35

RPM制作心得

RPM制作心得
这是我制作RPM的试验心得,我的理解难免有错误请大家给予提出,谢谢!!
在我的附件中有RPM制作讲义(即是公社的资料变成DOC文档),如果大家仔细阅读你将获得许多有用的知识,下面就让我们一起来开始这次试验之旅……
工作环境:Redhat 9.0 (不好意思,由于种种原因我没有可利用的Magiclinux的平台,所以我只能在Redhat平台下进行,等我开通ADSL就有Magiclinux可用了)
原材料: rarlinux-3.3.0.tar.gz
Rar的RPM的制作:
1tar –zxvf rarlinux-3.3.0.tar.gz
2cd rar
3我们查看Makefile可以发现内容如下:
   ###################################################################
    # Installing RAR executables, configuration files and SFX modules #
    # to appropriate directories                                    #
    ###################################################################

    PREFIX=/usr/local

    install:
        cp rar unrar $(PREFIX)/bin
        cp rarfiles.lst /etc
        cp default.sfx $(PREFIX)/lib
这几行的意思是将相应的文件Copy到相应的目录里面,这对我们生成rar.spec很有用处的。
4根据需要编辑的rar.spec的内容如下:
#############################

%define name rar
%define ver 3.3.0
%define RELEASE 1
%define rel 1
%define _prefix /usr/local
#############################
# 这里定义的是改软件的一些信息当你安装后可以通过rpm –qi rar来查看这些信息
Summary: 解压RAR软件
Name: %name
Version: %ver
Release: %rel
Copyright: GPL
Vendor: Magiclinux
Group: Application/systemtools
Buildroot: /var/tmp/%{name}-%{ver}-root
Source: rarlinux-3.3.0.tar.gz
Packager: HongFeng <[email protected]>
#Prefix: /usr/local
#Prefix: /usr
#Prefix: /tmp

###############################

%description
RAR archiver:

* RAR introduces an original compression algorithm.It allows higher
   compression ratios than other PC archiving tools, especially
   on executable files, object libraries, large text files, etc.

* RAR offers an optional compression algorithm highly optimized
   for multimedia data.

* RAR provides functionality for creating a 'solid' archive, which
   can raise the compression ratio by 10% - 50% over more common
   methods, particularly when packing large numbers of small files.

* RAR offers the ability to create and change SFX archives using
   default and external SFX modules.

* RAR offers the ability to create a multi-volume archive as SFX.

* RAR offers a number of service functions, such as setting a
   password, adding archive and file comments.Even physically
   damaged archives may be repaired and an archive may be locked
   to prevent further changes.Authenticity information may be
   added for additional security and RAR will store information
   on the last update and name of the archive.

################################

%prep
%setup -n rar
#在install过程中我们要建立相应的目录并将文件copy到对应的目录中.
%install
mkdir -p $RPM_BUILD_ROOT%{_prefix}/bin
mkdir -p $RPM_BUILD_ROOT/etc
mkdir -p $RPM_BUILD_ROOT%{_prefix}/lib
#对应Makefile的cp rar unrar $(PREFIX)/bin
install-m 644 unrar $RPM_BUILD_ROOT%{_prefix}/bin
install-m 644 rar$RPM_BUILD_ROOT%{_prefix}/bin
#对应Makefile的 cp rarfiles.lst /etc
install-m 644 rarfiles.lst $RPM_BUILD_ROOT/etc
#对应Makefile的 cp default.sfx $(PREFIX)/lib
install-m 644 default.sfx $RPM_BUILD_ROOT%{_prefix}/lib
################################

################################

%clean
rm -rf $RPM_BUILD_ROOT
rm -rf $RPM_BUILD_DIR/rar

######################################
#由于安装中的权限是644下面将改变这些。
%post
chmod 755 /%{_prefix}/bin/unrar
chmod 755 /%{_prefix}/bin/rar

######################################
%files
%defattr (-,root,root)
%doc readme.txt rar_faq.txt rar.txt
/%{_prefix}/bin/unrar
/%{_prefix}/bin/rar
/%{_prefix}/lib/default.sfx
%config /etc/rarfiles.lst
####################################
#%changelog
关于这个spec文件内使用到的一些宏定义可以在/usr/lib/rpm/macros中查到。
其中用到的参数在我的附件中都有提到。

5copy rarlinux-3.3.0.tar.gz到/usr/src/redhat/SOURCES/
6rpmbuild –ba rar.spec
这样我们在/usr/src/redhat/RPMS/i386下将生成rar-3.3.0-1.i386.rpm文件
整个过程完成我们的第一次rpm制作之旅圆满结束,或许我的表达有限有很多不清楚的地方大家可以问我也将尽我所能来回答问题。
谢谢!!

hongfeng 发表于 2004-5-10 10:54:09

我有一个疑问始终没有解决:
此域定义可重定位的目录前缀,可在描述文件中书写多次。其描述格式为:
Prefix : 目录前缀1 [目录前缀2] ...

注: []为可选项,各目录前缀之间均以空格分隔。例如:
Prefix : /usr /etc
它也可写作:
Prefix : /usr
Prefix : /etc
RPM利用可重定位的目录前缀,实现了软件包的重定位安装,使软件中的文件不必固定在某个绝对位置,这种做法很好。LZE软件包描术文件lze-6.0-2.spec中就定义了一个可重定位的前缀/usr(见第15行),这样,安装时就可将该包中在/usr目录下的文件重定位到用户指定的目录,如:
# rpm -i --prefix /tmp lze-6.0-2.i386.rpm
#
或者:
# rpm -i --relocate /usr=/tmp lze-6.0-2.i386.rpm
#
注: 此命令安装lze包,将其中含/usr重定位目录前缀的文件定位到/tmp目录。如包中
的/usr/bin/lze文件安装后,因重定位而成了/tmp/bin/lze。
我遇到的问题是我在spec定义了prefix : /usr/local /tmp,可是当我用rpm -i --prefix /tmp *.rpm时提示出错,谁有经验帮忙解决一下。
谢谢!!

樱家冢 发表于 2004-5-10 22:18:50

我只知道spec文件可以做出src.rpm来,但是怎么利用已有的二进制文件做i386.rpm?

Fujinsan 发表于 2004-5-11 01:40:06

不错!只要大家都积极将自己的学习心得写出来,我们就可以学得更快一些。

加精了。

llc 发表于 2004-5-11 02:03:54

我只知道spec文件可以做出src.rpm来,但是怎么利用已有的二进制文件做i386.rpm?

rpm包你完全可以看作是功能比较强大的文件的压缩包

只要你在spec的%files段定义好你要打包的各个文件路径,准备好那些文件,它就一股东给你压缩成rpm,直接拿二进制文件来制作也行

Fujinsan 发表于 2004-5-11 03:07:27

任何二进制软件安装,无非就是拷贝文件到相应目录,然后修改相应的配置。
rpm的功能就是将这些拷贝操作和配置操作规范化为一定的格式。

Windows下使用*.msi的越来越多,我看就是学rpm来着的。

hongfeng 发表于 2004-5-11 10:11:29

谢谢加精!我将努力学习!为MagicLinux服务。

hongfeng 发表于 2004-5-11 10:55:03

我只知道spec文件可以做出src.rpm来,但是怎么利用已有的二进制文件做i386.rpm?
我的这个例子就是利用现有的二进制文件做rpm包的。

MichaelBibby 发表于 2004-5-11 12:48:16

不过好像这个例子稍微简单了点
我看gaim-0.76cvs和dia-0.92的spec文件,比这个稍麻烦和复杂。看得我有点头大

qianzheng82 发表于 2004-5-13 02:09:04

我觉得最困难的是不知道要在 %files 这里写要拷贝哪些文件,因为我们毕竞不是软件作者,我不知道编译好后会产生哪些二进制文件,并在安装时对哪些文件作符号连接(特别是安装库的时候).要是谁会解决这个问题,请教我一下,谢谢.

hongfeng 发表于 2004-5-13 09:06:24

我觉得最困难的是不知道要在 %files 这里写要拷贝哪些文件,因为我们毕竞不是软件作者,我不知道编译好后会产生哪些二进制文件,并在安装时对哪些文件作符号连接(特别是安装库的时候).要是谁会解决这个问题,请教我一下,谢谢.
其实,我想这个问题在源代码的软件包中有Makefile中将有你需要的信息。我这个也是在Makefile中找到的并且copy到相应的目录中。我有提到%files中对应的栏位有在Makefile中对应的栏位。
谢谢!!

llc 发表于 2004-5-14 10:38:28

提示一下:

库的依赖问题一般不用自己去判断和加上,rpmbuild会自己根据你的二进制文件来生成相关的依赖关系,当然,你可以手动加上依赖信息,这样在某些情况下更有利于安装者安装

譬如,假设制作某个包时需要SDL1.2.4版本以上,如果你不在spec上指定SDL1.2.4以上的依赖关系,那么rpmbuild将自动为你生成SDL库相关so的依赖信息,安装者安装时如果安装了低版本的SDL,因为亦满足so的依赖(但版本号不满足)从而可以安装上,但软件可能运行出错;或者安装者根本没有安装SDL,于是安装时必然出现SDLxxx.so依赖缺少的信息,但不知道这个so是属于哪个包;如果你指定SDL1.2.4依赖,那么安装者就可以明确知道缺少的是SDL1.2.4这个依赖包

hongfeng 发表于 2004-5-14 12:13:54

提示一下:

库的依赖问题一般不用自己去判断和加上,rpmbuild会自己根据你的二进制文件来生成相关的依赖关系,当然,你可以手动加上依赖信息,这样在某些情况下更有利于安装者安装

譬如,假设制作某个包时需要SDL1.2.4版本以上,如果你不在spec上指定SDL1.2.4以上的依赖关系,那么rpmbuild将自动为你生成SDL库相关so的依赖信息,安装者安装时如果安装了低版本的SDL,因为亦满足so的依赖(但版本号不满足)从而可以安装上,但软件可能运行出错;或者安装者根本没有安装SDL,于是安装时必然出现SDLxxx.so依赖缺少的信息,但不知道这个so是属于哪个包;如果你指定SDL1.2.4依赖,那么安装者就可以明确知道缺少的是SDL1.2.4这个依赖包
谢谢!!有长一智。

tyfrlj 发表于 2004-5-14 21:21:40

Windows下使用*.msi的越来越多,我看就是学rpm来着的。
如果是真的,那说明M$善于学习优点,这是好的,同样,Linux也需要学习其它OS的优点。
我觉得知识产权很不好,过犹不及啊。知识就应该共享。

delphi1977 发表于 2005-3-15 16:39:52

学习,
页: [1] 2
查看完整版本: RPM制作心得