打印

rpm 建包原理(2010.11.22 更新)

[quote:05f218cfb5="linuxpgy"]1.不管是一个或几十个dll,只要是你程序需要的,而且你又不能确定目标系统肯定有的,你就必须带上,这是对用户的负责!linux的rpm包,除了带自己写so,用到的其他人的so一个不带,让用户自己去找去吧!!
2.更新kde,就需要把上面的软件重新编译?我没做过,不知道是什么原因~~也许是你的设置有问题,比如库收索路径等等~~还有你说不能用的出错信息是什么?
3.正是因为更新不能完全同时,所以才需要自带库啊!!!!VC7编译的软件基本都自带msvcrt7.dll,不然根本无法运行,因为系统中只有msvcrt6.dll!!
4.我说它的目的是告诉大家可以不用root权限来打包rpm,就这样,understand?[/quote]
关于第一个问题,linux的rpm包,各大基于rpm的发行版的官方的rpm都有特定对应的系统,比如for rh9 fr1 fr5等等,你要你满足了依赖关系,一般不会有问题,但是如果你把不同发行版之间的rpm互用,满足不了其他的so,那不关发行版本身的问题。
2,更新一个软件,可能很多联带的软件都需要更新,很多接口都不同,你编译的时候都会出现 undefined symbol......., 或者undefined defination....,如果直接用不同发行版之间的rpm,用的时候就更不用说了。你没做过,说明你自己软件安装升级之类的经验还需要累积。

3,自带库没有问题阿,你打包时候每个包都用自带库,系统会增大多少? 此其一,另外你如何自带库,带多少库,你只会打包,不是开发者的话,你如何知道到底需要用什么样的库,你怎么在打包的source中把所有的库添加,你从源码安装,configure make make install, configure 会告诉你缺什么软件,但你知道添加该软件的什么库么?你找到了一个so,你知道这个so又会需要多少系统原有的什么样库呢?

4, 非root当然可以打包,可以简单创建一个环境,但是有些命令有可能仍然需要
root权限,我做过这样的包

“用rpm制作跨发行版的安装包”首先 static 包会引来很多问题。 在你想这个问题之前,我相信很多人都想过这个问题,不同的发行版配置,路径都不完全相同,打包rpm不只是一个简单的程序那么简单,很多设置都是rpm包完成的,谁能打出一个包配置所有不同的发行版???,不同的发行版谁都不能保证自己什么时候升级,用的基础库都不一样,如何知道哪个发行版带了什么样的库,一个rpm能把需要的整个系统的库都带全么??
easy come, easy go 天道本无常, 人生如大梦!

TOP

"怎么自带所有的库(包括so依赖的so)呢?其实你知道/usr/lib/rpm/find-providers 和 /usr/lib/rpm/find-requires的原理就明白了,这里就不详细说明了。所以自带哪些库就是用这两个脚本是查出来的。(不管是源码编译,还是直接的执行程序,打包之前都查一下就知道了)。 "
那个是查已有rpm包提供库和依赖的,不是你未打包之前的,不同系统打出的包依赖是不同的,提供的库也有可能是不同的,就是你说的so,打包不只是打个应用程序包那么简单。
“还有安装之后系统不会增大多少,相同的文件会覆盖的”
在你对一个系统不了解的情况下,不要这么做,很危险的,如果你打的是系统的一些核心包,有可能导致系统崩溃甚至无法启动的
easy come, easy go 天道本无常, 人生如大梦!

TOP

[quote:fe4af95701="linuxpgy"]看来我的好心可能害了用户~~~~如果不覆盖系统库的话不是不行,只要系统中保证有这些系统文件就行了,那样也能实现跨发行版安装。关键问题就是linux有那些系统文件是像user32.dll,kernel32.dll那样每个系统都带的呢?
如果不确定带哪些的话,是否有这样的选项,即安装的时候自动跳过已经存在的文件,而不是提示冲突中止安装呢?请高手指点!

关于autopackage,klik我会研究一下,不过rpm还是大部分linux使用的包管理系统,毕竟用的人不多。看看有没有借鉴之处~~谢谢啦! [/quote]
即便是系统满足了所有的库,只是文件名相同的话,不在当前系统编译的rpm包安装后也未必正常运行,即相同名字的库因为编译它的环境configure时的参数等等不能替换使用,所以即使你跳过了文件也未必解决问题,这也是为什么不能盲目直接替换文件的原因,各个linux系统文件版本都不同,提供的so名字可能不尽相同,很难说哪个文件是所有系统都带的。
easy come, easy go 天道本无常, 人生如大梦!

TOP