QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: KDE

rpm 建包原理(2010.11.22 更新)

[复制链接]
发表于 2005-7-25 20:38:15 | 显示全部楼层
真是学习的好地方阿!
回复

使用道具 举报

发表于 2005-9-25 22:36:23 | 显示全部楼层
怎样制作一个rpm文件,在安装的时候可以输入序号才可以安装?lanche,
回复

使用道具 举报

发表于 2005-9-25 22:37:09 | 显示全部楼层
怎样制作一个rpm文件,在安装的时候可以输入序号才可以顺利安装,否则不能安装?
KDE,
回复

使用道具 举报

发表于 2005-9-26 01:28:52 | 显示全部楼层
In linux i have never saw what u said before.
回复

使用道具 举报

发表于 2005-9-26 10:07:38 | 显示全部楼层
[quote:60fd30a47c="iamagoodmaster"]怎样制作一个rpm文件,在安装的时候可以输入序号才可以顺利安装,否则不能安装?
KDE,[/quote]
rpm可以写pre脚本,不过看不出来这么做的意义。

如果要做这类安装包,最好用installbuilder/installanywhere一类的做。
回复

使用道具 举报

 楼主| 发表于 2005-9-26 21:21:50 | 显示全部楼层
lanche 你好,这样做的意义不大,因为在 linux 下很容易解开 rpm 包,在 magic 下只要右键点击就可以。毕竟 rpm 是开放的。若要实现,可以在 spec 的 pre 段写入交互脚本,如果输入序列号正确,就可以安装,但是这样的脚本也是很容易查看到的,你的密码岂不是昭然若揭?使用 bin 打包格式会好一点,但我不能确定是否就真的有效。sejishikong 说的你可以试试。
回复

使用道具 举报

发表于 2006-9-1 15:35:58 | 显示全部楼层
典型的 windows 用户后遗症。linux 是一个庞大的多用户、多任务网络操作系统,对于熟悉她的人来说,很多情况下使用控制台会更加高效,特别是没有 x 环境的服务器。要是完全把每个软件都分开存放,将使控制台下强大的自动命令补齐功能失效!否则你必须把所有软件的私有目录加入路径,这是可怕的,不讲操作是否可行,仅仅浪费在搜索路径上的时间就足以使你精神崩溃。

是的,很多人都有Windows的后遗症。但是我们选择使用linux决不是因为它是什么多用户网络操作系统,而是它的开放,自由,分享。我们用linux是做桌面的,不是拿来做服务器,一个月维护一次就够了,我们要每天在上面装软件,上网,打游戏,而命令自动补齐对于习惯双击的我们有何意义?那些在/usr/bin里的很多程序居然不能双击运行,太搞笑了~~让熟悉Win的用户再去玩Shell(只比dos多个命令自动补其的东西),岂不是一种倒退?
回复

使用道具 举报

发表于 2006-9-1 16:03:41 | 显示全部楼层
对于那些使用古怪包管理工具的发行版,除非拥有庞大的软件包打包队伍,否则会使用户面临软件包匮乏的尴尬局面。

我觉得那些刚从Window转到linux的用户来说,rpm就是一个非常古怪的包管理工具,居然在magic上的发行包不能在mandriva上安装,真是不可思议**他们本来以为rpm会像一个setup.exe那样通吃一切,所以迷茫了,还是把linux删掉吧。究其原因就是每个rpm并不是一个完整的像setup.exe那样的安装包,只是包含了整个软件的一部分,其依赖的库由其他的rpm来安装。而依赖不只是缺少文件那样简单,找依赖库的过程会让你意志消沉,直至放弃安装为止。
所以,我有一个疑问为什么不把rpm包做大一点,包含依赖的库,即使下载时大点,也无所谓。安装的时候重复就覆盖,又不会导致系统当机。不要什么复杂的依赖检查,自己带库就行了,如果要依赖也只依赖一些比较大的(比如gtk),有些几k的还要单独搞个rpm,有时搞不到真能把人气死。
当前的各大发行版皆按这种方式发行,真不知道为什么没人打包的时候想到这一点呢?
回复

使用道具 举报

发表于 2006-9-1 20:29:48 | 显示全部楼层
所以,我有一个疑问为什么不把rpm包做大一点,包含依赖的库,即使下载时大点,也无所谓。

一个包带全部的Linux 库程序?需要 xxxM ??
回复

使用道具 举报

发表于 2006-9-3 12:15:34 | 显示全部楼层
引用:

所以,我有一个疑问为什么不把rpm包做大一点,包含依赖的库,即使下载时大点,也无所谓。

一个包带全部的Linux 库程序?需要 xxxM ??

没说要带全部的依赖库啊,基本的linux 系统库,X,gtk,qt,不要自带,其他的小点的比如什么SDL,stdc++,之类带上就不用用户再去下载了,万一系统中没这些小玩意,不就装不上了吗?

这其实不是主要的麻烦,如果你的系统有SDL1.2但是你要装的程序是依赖SDL2.0,这时你也不得不去下载SDL2.0去装,同时装2个SDL先不管有没有冲突,就是没有冲突,用户也要分清版本去下载,不然下了也白下,这又添加了不少麻烦。
回复

使用道具 举报

发表于 2006-9-3 15:14:48 | 显示全部楼层
[quote:a70cfc0cb6="linuxpgy"]
引用:

所以,我有一个疑问为什么不把rpm包做大一点,包含依赖的库,即使下载时大点,也无所谓。

一个包带全部的Linux 库程序?需要 xxxM ??

没说要带全部的依赖库啊,基本的linux 系统库,X,gtk,qt,不要自带,其他的小点的比如什么SDL,stdc++,之类带上就不用用户再去下载了,万一系统中没这些小玩意,不就装不上了吗?

这其实不是主要的麻烦,如果你的系统有SDL1.2但是你要装的程序是依赖SDL2.0,这时你也不得不去下载SDL2.0去装,同时装2个SDL先不管有没有冲突,就是没有冲突,用户也要分清版本去下载,不然下了也白下,这又添加了不少麻烦。[/quote]
真正依赖问题,都不是小型的系统库,都是大型库,也就是说 SDL、stdc++ 都不是问题。
编译程序的时候用 static 就可以了,但大型库依赖根本不能解决。
Linux 的特点就是依赖库程序所提供的功能,一个程序很可能引用了系统里一半的库(这似乎也是 Linux 有统一目录树结构的原因)。而不像 Windows ,仅仅使用系统提供的库。
而且 Windows 系统的库经常好几年不更新,库之间的功能基本不重叠。Linux 经常更新系统库来增加新的程序,而且经常有好几种库提供相同的功能,让大家选择使用。
回复

使用道具 举报

发表于 2006-9-4 09:26:16 | 显示全部楼层
真正依赖问题,都不是小型的系统库,都是大型库,也就是说 SDL、stdc++ 都不是问题。
编译程序的时候用 static 就可以了

编译程序的时候用 static 就可以了?对于别人已经编译好的文件就没有办法了,做rpm的时候再把别人的源码拿过来再编译太浪费时间了(而且我的机器连gcc都没有装!),我只是想做一个依赖很少或没有依赖的包。
但大型库依赖根本不能解决。

自带就行了,虽然大了很多,我打包一个mplayer+mencoder+gmplayer+win32-codecs 包含所有用到的系统库只有23M左右,看来rpm压缩算法挺好的 ,而且有些可以踢掉的,linux.so.2 glibc.so.2之类的,基本每个系统都带的吧~
Linux 经常更新系统库来增加新的程序

关键问题是怎么更新呢?如果是版本升级,比如linux.so.2-->linux.so.3那正好,自带linux.so.2的话,也可以在只有linux.so.3的系统中安装 。对于小版本升级,比如linux.so.2.0-->linux.so.2.1,所有的程序只是使用linux.so.2这个符号连接,如果安装的时候你提供了一个linux.so.2.0,而系统中的是linux.so.2.1,那么会不会冲突呢?这点还请高人指点.
而且经常有好几种库提供相同的功能,让大家选择使用。

正是因为这一点,所以我们才有自带库的必要!虽然好几种库提供的功能相同,但是实际编译出来的binary文件只会对特定编译时使用的库依赖,举个例子wxWidget可以跨平台编译,但是你决不能把windows下编译的binary拿到linux下用,同样wxWidget可以在gtk上编译,也可以在qt上编译,但是运行的时候gtk编译的还只能在包含gtk的系统运行,而不能那到只有qt的系统中运行。 不知道我理解的对不对,如果理解有误请指正,谢谢!

补充一点,关于rpm制作,不一定非要root身份(**很危险哦!!**),所以把打包工作防在/usr/src/mBuild/稍显不方便,查了一些资料有说到:
可以通过更改 %_topdir 设置来告诉 RPM 查找和创建不同目录集中的文件。按照下面的方法在您的主目录下创建一个名为 .rpmmacros的文件:

%_topdir /home/peter/rpm    #这里一定要是全路径,把peter换成你的用户名

这个文件会告诉 RPM:它先前在 /usr/src/redhat 下查找的所有目录应该改为在 /home/your_userid/rpm 下查找。 现在,您应该创建这样一个完整的目录树:~/rpm ~/rpm/SOURCES ~/rpm/SPECS ~/rpm/BUILD ~/rpm/RPMS ~/rpm/RPMS/i386 ~/rpm/SRPMS

~/rpm
~/rpm/SOURCES
~/rpm/SPECS
~/rpm/BUILD
~/rpm/RPMS
~/rpm/RPMS/i386
~/rpm/SRPMS

这样就方便多了,普通用户也可以方便建包了。详细请见:http://www.uplinux.com/www/dev/01/426.shtml
回复

使用道具 举报

发表于 2006-9-4 22:02:02 | 显示全部楼层
……………………………………………………………………………………………………………………

1、要是让你自己编译了,用 static 干什么?
2、要知道 linux 里,一个系统需要几百个包,自己带自己的,被携带的库重复次数 >10 很容易(要知道Linux的依赖是可以用排队来形容的)。
3、重新编译,换个参数,就能导致不兼容,0.0001的版本变化,就会变换接口。
4、你带你的库,我带我的库,结果咱俩用同一种。比如 jpeg ,用的太多了,还好他不是多种库并存并且不通用。WxWiget 你是打算携带还是不带?他本来就是为了兼容而制作的类似桥接的库。
5、我喜欢用 root 制作 rpm ,kanker 他就用非 root,这个是习惯的问题,我用非 root ,一样会丟数据,用 root ,也没有 rm -fr / 过。这些东西,没有必须的,只有自愿的。
回复

使用道具 举报

发表于 2006-9-5 12:16:03 | 显示全部楼层
[quote:483be91a81="jiangtao9999"]……………………………………………………………………………………………………………………

1、要是让你自己编译了,用 static 干什么?
2、要知道 linux 里,一个系统需要几百个包,自己带自己的,被携带的库重复次数 >10 很容易(要知道Linux的依赖是可以用排队来形容的)。
3、重新编译,换个参数,就能导致不兼容,0.0001的版本变化,就会变换接口。
4、你带你的库,我带我的库,结果咱俩用同一种。比如 jpeg ,用的太多了,还好他不是多种库并存并且不通用。WxWiget 你是打算携带还是不带?他本来就是为了兼容而制作的类似桥接的库。
5、我喜欢用 root 制作 rpm ,kanker 他就用非 root,这个是习惯的问题,我用非 root ,一样会丟数据,用 root ,也没有 rm -fr / 过。这些东西,没有必须的,只有自愿的。[/quote]

第1条.没看懂~~太笨~~
第2条.事实上Window下的安装程序为了能装上软件,以mfc42.dll为例,重复何止10次!!!甚至可以用成千上万来形容。到目前也没有听说某某安装程序因为多带了mfc42.dll,导致系统问题~
第3条.好像没那么夸张吧,一个动态库lb.so.2(这只是个符号链接) ,不管它链接到lib.so.2.5.0 还是链接到libso.2.6.1 依赖lib.so.2的程序都是可以工作的,如果接口变的话开发者会直接升级到lib.so.3的,这点不用担心。 不信可以自己试试
第4条.基本和上面一样,就是版本确定了这个软件的功能,一般不太可能这里的lib.so.2和那里的lib.so.2完全不一样(如果不一样也是某人的原因),小版本号理论上不应该影响上层应用,还是那句话自己试试就知道了。wxWidget的问题上次没有说清楚,其实他是静态链接的,所以不用带。
第5条.我说了"不一定非要root身份",只是给大家一个建议,采不采纳是自己的事,我没强制大家非要非root打包啊??
回复

使用道具 举报

发表于 2006-9-5 21:54:12 | 显示全部楼层
1、没懂就没懂吧。
2、一个 mfc42 有多大?win里,你能需要自带几个dll?
3、我每次emerge -u world ,如果更新了 KDE 相关(主要是 arts )那么 amarok 基本上就需要重新编译,还有别的支持 arts 输出的软件,也需要重新编译才能用。
4、但问题是,你能保证 0.2 这个比较大的版本号可以等到多长时间?反正 windows 基础库的更新一般都是跟随 windows 大版本一同更新。你的程序所依赖的库都是这么整齐划一的同时更新?
5、那你说他干啥?
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-3-28 22:06 , Processed in 0.058485 second(s), 12 queries .

© 2021 Powered by Discuz! X3.5.

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