QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4123|回复: 15

RPM制作心得

[复制链接]
发表于 2004-5-10 10:47:35 | 显示全部楼层 |阅读模式
RPM制作心得
这是我制作RPM的试验心得,我的理解难免有错误请大家给予提出,谢谢!!  
在我的附件中有RPM制作讲义(即是公社的资料变成DOC文档),如果大家仔细阅读你将获得许多有用的知识,下面就让我们一起来开始这次试验之旅……
工作环境:Redhat 9.0 (不好意思,由于种种原因我没有可利用的Magiclinux的平台,所以我只能在Redhat平台下进行,等我开通ADSL就有Magiclinux可用了)
原材料: rarlinux-3.3.0.tar.gz
Rar的RPM的制作:
1  tar –zxvf rarlinux-3.3.0.tar.gz
2  cd 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中查到。
其中用到的参数在我的附件中都有提到。

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 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?
回复

使用道具 举报

发表于 2004-5-11 01:40:06 | 显示全部楼层
不错!只要大家都积极将自己的学习心得写出来,我们就可以学得更快一些。

加精了。
回复

使用道具 举报

发表于 2004-5-11 02:03:54 | 显示全部楼层
[quote:64b0905219="樱家冢"]我只知道spec文件可以做出src.rpm来,但是怎么利用已有的二进制文件做i386.rpm?[/quote]

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

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

使用道具 举报

发表于 2004-5-11 03:07:27 | 显示全部楼层
任何二进制软件安装,无非就是拷贝文件到相应目录,然后修改相应的配置。
rpm的功能就是将这些拷贝操作和配置操作规范化为一定的格式。

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

使用道具 举报

 楼主| 发表于 2004-5-11 10:11:29 | 显示全部楼层
谢谢加精!我将努力学习!为MagicLinux服务。
回复

使用道具 举报

 楼主| 发表于 2004-5-11 10:55:03 | 显示全部楼层
[quote:0dd0360e82="樱家冢"]我只知道spec文件可以做出src.rpm来,但是怎么利用已有的二进制文件做i386.rpm?[/quote]
我的这个例子就是利用现有的二进制文件做rpm包的。
回复

使用道具 举报

发表于 2004-5-11 12:48:16 | 显示全部楼层
不过好像这个例子稍微简单了点
我看gaim-0.76cvs和dia-0.92的spec文件,比这个稍麻烦和复杂。看得我有点头大
回复

使用道具 举报

发表于 2004-5-13 02:09:04 | 显示全部楼层
我觉得最困难的是不知道要在 %files 这里写要拷贝哪些文件,因为我们毕竞不是软件作者,我不知道编译好后会产生哪些二进制文件,并在安装时对哪些文件作符号连接(特别是安装库的时候).要是谁会解决这个问题,请教我一下,谢谢.
回复

使用道具 举报

 楼主| 发表于 2004-5-13 09:06:24 | 显示全部楼层
[quote:9be911a5a1="qianzheng82"]我觉得最困难的是不知道要在 %files 这里写要拷贝哪些文件,因为我们毕竞不是软件作者,我不知道编译好后会产生哪些二进制文件,并在安装时对哪些文件作符号连接(特别是安装库的时候).要是谁会解决这个问题,请教我一下,谢谢.[/quote]
其实,我想这个问题在源代码的软件包中有Makefile中将有你需要的信息。我这个也是在Makefile中找到的并且copy到相应的目录中。我有提到%files中对应的栏位有在Makefile中对应的栏位。
谢谢!!
回复

使用道具 举报

发表于 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这个依赖包
回复

使用道具 举报

 楼主| 发表于 2004-5-14 12:13:54 | 显示全部楼层
[quote:170042e00b="llc"]提示一下:

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

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

使用道具 举报

发表于 2004-5-14 21:21:40 | 显示全部楼层
[quote:197a44697c="Fujinsan"]Windows下使用*.msi的越来越多,我看就是学rpm来着的。[/quote]
如果是真的,那说明M$善于学习优点,这是好的,同样,Linux也需要学习其它OS的优点。
我觉得知识产权很不好,过犹不及啊。知识就应该共享。
回复

使用道具 举报

发表于 2005-3-15 16:39:52 | 显示全部楼层
学习,
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-4-19 22:29 , Processed in 0.119163 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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