找回密码
 注册
楼主: 樱家冢

rebuild 工作认领

[复制链接]
 楼主| 发表于 2003-6-7 22:45:19 | 显示全部楼层
[quote:41e73a3d82="baif"]怎么rebuild?[/quote]
见上面KDE的回帖。
回复

使用道具 举报

发表于 2003-6-8 00:07:14 | 显示全部楼层
认领 qt、arts、kdelibs,能否提供修正 konsole 的 kdebase 源码包?否则只能编译有毛病的。
回复

使用道具 举报

发表于 2003-6-8 08:25:07 | 显示全部楼层
可惜,我不会做RPM。 我一般都是下源码编译的。
VIM现在换上了6.2,虽然没有什么变化(只是没
有中文了提示什么的了)。
回复

使用道具 举报

 楼主| 发表于 2003-6-8 10:24:55 | 显示全部楼层
我也不会做rpm,最多就是修改spec文件以后把src.rpm里面的旧版本改成新版本的程序,还经常失败,555。
回复

使用道具 举报

发表于 2003-6-8 11:45:20 | 显示全部楼层
[quote:5aafbe42e7="樱家冢"]我也不会做rpm,最多就是修改spec文件以后把src.rpm里面的旧版本改成新版本的程序,还经常失败,555。[/quote]

不知道这个对你有没有用,如果没有用,请删除!


Linux下制作RPM软件包的关键所在
随着RedHat Linux的风靡全球,其软件包管理工具及格式RPM也得到推广。基于RPM源代码开放、安装卸载简单、升级维护方便及查询功能强大的特点,越来越多的开发者喜欢采用RPM格式来发布自己的软件包,更多的用户从中受益。那么,RPM软件包是怎样制作的呢?
其实,制作RPM软件包并不是一件复杂的工作,其中的关键在于编写SPEC软件包描述文件。下面以我制作小赵编辑器LZE的软件包(lze-6.0-1.i386.rpm)为例,详细说明一下软件包的制作过程。
1.mkdir -p /usr/src/dist/{BUILD,RPMS/i386}
上述命令用于创建两个目录/usr/src/dist/BUILD与/usr/src/dist/RPMS/i386,前一个目录是RPM建立软件包时用的目录,后一个是RPM输出软件包的目录,我的LZE软件包lze-6.0-1.i386.rpm就是在此目录下存放的。这两个目录不创建,运行rpm命令建包时将报错退出。
注意:输出目录名i386,意味着这是台X86的机器。如果你的机器与此体系不同,则目录名也要相应更换。
2.编写软件包描述文件lze-6.0-1.spec
要想制作一个软件包,就必须写一个软件包描述文件(SPEC)。这个文件中包含了软件包的诸多信息,如软件包的名字,版本,类别,说明摘要,创建时要执行什么指令,安装时要执行什么操作,以及软件包所要包含的文件列表等等。
LZE软件包描述文件lze-6.0-1.spec比较简单,仅用于创建二进制程序包。其描述文件内容如下:(每行开头的数字为所在行在文件中的行号)
1 Summary:小赵全屏幕中英文多窗口多功能编辑器(Linux/UNIX系统适用)
2 Name:lze
3 Version:6.0
4 Release:1
5 Vendor:纵横软件制作中心(Email:[email protected]
6 Copyright:Share
7 Group:Applications/Editors
8 Source:http://zhsoft.myetang.com/lze-6.0.tar.gz
9 %description
10 小赵编辑器,是为使用SCO UNIX,Linux多用户系统的广大用户专门设计的全屏幕多窗
11 口中英文多功能编辑器。
12 它主要有以下十大特点:1.全屏幕菜单操作。2.显示方式多样。3.块操作丰富。4.十
13 字制表功能强大。5.多窗口操作灵活自如。6.文件操作功能齐全。7.解释输出功能独具特
14 色。8.自带中文输入法(增强五笔和增强拼音),实用方便。9.十六进制编辑功能,如虎
15 添翼。10.即时翻译,按到即译。
16 总之,小赵编辑器会成为您在UNIX,Linux系统上编制程序和书写一般性文稿的好帮手。
17 它将在工作中助您一臂之力,轻松上阵,游刃有余!
18
19 %prep
20 # prep start.
21
22 %build
23 # build start.
24 cp /root/{读我,版权声明} .
25
26 %install
27 # install start.
28
29 %files
30 %defattr (-,root,root)
31 %doc 读我
32 %doc 版权声明
33 %config /etc/funkey.def
34 %config /etc/inputme.def
35
36 /usr/bin/lze
37 /usr/bin/lzeime.py
38 /usr/bin/lzeime.wb
39
40 %changelog
41
42 * Fri May 1 1998 雨亦奇 <[email protected]>
43 - 增加多窗口操作
44
45 * Mon Mar 24 1997 雨亦奇 <[email protected]>
46 - 增加块操作命令
47
描述文件说明如下:
(1)文件头  
它包含以下几个域:
* Summary:
软件包一句话说明,一行有效。
* Name:
软件包的名字,RPM用该名字与版本号,释出号及体系号来命名软件包。如,本例输出的软件包名为
lze-6.0-1.i386.rpm。
* Version:
软件版本号。仅当软件较以前有较大改变时才增加版本号。
* Release:
软件释出号。若软件较以前改变较小,则仅增加释出号,不改变版本号。
* Vendor:
软件开发者的名字。
* Copyright:
软件包所采用的版权规则。具体有: GPL(自由软件),BSD,MIT,Public Domain(公共域),Distributable
(贡献),commercial(商业),Share(共享)等。
* Group:
软件包所属类别,具体类别有:
Amusements/Games (娱乐/游戏)
Amusements/Graphics(娱乐/图形)
Applications/Archiving (应用/档案)
Applications/Communications(应用/通讯)
Applications/Databases (应用/数据库)
Applications/Editors (应用/编辑器)
Applications/Emulators (应用/仿真器)
Applications/Engineering (应用/工程)
Applications/File (应用/文件)
Applications/Internet (应用/因特网)
Applications/Multimedia(应用/多媒体)
Applications/Productivity (应用/产品)
Applications/Publishing(应用/印刷)
Applications/System(应用/系统)
Applications/Text (应用/文本)
Development/Debuggers (开发/调试器)
Development/Languages (开发/语言)
Development/Libraries (开发/函数库)
Development/System (开发/系统)
Development/Tools (开发/工具)
Documentation (文档)
System Environment/Base(系统环境/基础)
System Environment/Daemons (系统环境/守护)
System Environment/Kernel (系统环境/内核)
System Environment/Libraries (系统环境/函数库)
System Environment/Shells (系统环境/接口)
User Interface/Desktops(用户界面/桌面)
User Interface/X (用户界面/X窗口)
User Interface/X Hardware Support (用户界面/X硬件支持)
* Source:
源程序软件包的名字。
* %description:
软件包具体说明,可写在多个行上。示例中第10-18行均为说明。
(2)%prep段  
这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep和下面
%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL
命令,命令可以有很多行。示例中,本段只有第20行一行注释语句(以#开头),不执行任何操作。  
(3)build段  
本段是建立段,所执行的命令为生成软件包服务。  
本段第23行是注释行,第24行执行的是拷贝命令,将/root目录下的两个文件(读我,版权声明)拷贝
到软件包建立目录(/usr/src/dist/BUILD)。  
(4)%install段  
本段是安装段,其中的命令在安装软件包时将执行。示例中,本段只有第27行一行注释语句(以#开头),
不执行任何操作。  
(5)%files段  
本段是文件段,用于定义软件包所包含的文件,分为三类--说明文档(doc),配置文件(config)及执行
程序,还可定义文件存取权限,拥有者及组别。本段中:  
第30行-%defattr宏:定义文件存取权限为默认值(用-表示默认值,也可选择八进制数值,如0777
等),定义拥有者为root,定义组别为root。  
第31,32行-%doc宏:用该宏定义软件包所含的说明文档,若没有指定目录,则目录为
/usr/src/dist/BUILD。每个宏只能定义一个说明文档。说明文档一般安装在"/usr/doc/软件包名-版本号
-释出号"目录下。  
第33,34行-%config宏:定义软件包应用的配置文件,象sendmail.cf,passwd等。当卸载含有配
置文件的软件包时,任何未作改动的配置文件将被删除,改动过的配置文件将自动改名,后缀加
上.rpmsave,以便再度安装这个软件包时可以迅速恢复使用。  
第36-38行-为软件包所包含的文件名列表,可以写许多行。如果文件名指示的是一个目录,则该目录下
的所有文件将被包含在软件包中,注意不要弄错了。  
(6)%changelog段  
本段是修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。每一
个修改日志都有这样一种格式:第一行是:* 星期 月 日 年 修改人 电子信箱。其中:星期、月份均用英
文形式,用中文会出错。 接下来的行写的应是修改了什么地方,可写多行。一般以减号起始,便于查阅。
3.rpm -bb lze-6.0-1.spec

用此命令生成软件包,执行后屏幕将显示如下信息:(每行开头为行号)
1 Executing: %prep
2 + umask 022
3 + cd /usr/src/dist/BUILD
4 + exit 0
5 Executing: %build
6 + umask 022
7 + cd /usr/src/dist/BUILD
8 + cp /root/读我 /root/版权声明.
9 + exit 0
10 Executing: %install
11 + umask 022
12 + cd /usr/src/dist/BUILD
13 + exit 0
14 Processing files: lze
15 Executing: %doc
16 + umask 022
17 + cd /usr/src/dist/BUILD
18 + DOCDIR=/usr/doc/lze-6.0
19 + export DOCDIR
20 + rm -rf /usr/doc/lze-6.0
21 + /bin/mkdir -p /usr/doc/lze-6.0
22 + cp -pr 读我 /usr/doc/lze-6.0
23 + cp -pr 版权声明 /usr/doc/lze-6.0
24 + exit 0
25 Finding Provides: (using /usr/lib/rpm/find-provides)...
26 Finding Requires: (using /usr/lib/rpm/find-requires)...
27 Requires: ld-Linux.so.2 libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1)
28 Wrote: /usr/src/dist/RPMS/i386/lze-6.0-1.i386.rpm

第28行显示: 制作完成软件包,名字为lze-6.0-1.i386.rpm,在/usr/src/dist/RPMS/i386目录下。
4.软件包制作完成后,可用以下命令查询一下,看看效果。如果不满意的话,可以再次修改软件包描述文
件,重新运行上一步命令,产生新的RPM软件包。

转到/usr/src/dist/RPMS/i386目录,执行以下命令:  

(1)rpm -qpi lze-6.0-1.i386.rpm  

此命令用于查询指定软件包的头部信息,结果如下:(以行号开头)
1 Name: lze Relocations: (not relocateable)
2 Version : 6.0 Vendor: 纵横软件制作中心(Email:[email protected]
3 Release : 1 Build Date: 2001年07月12日 星期四 13时33分21秒
4 Install date: (not installed) Build Host: 纵横软件制作中心
5 Group : Applications/Editors Source RPM: lze-6.0-1.src.rpm
6 Size: 532081 License: Share
7 Summary : 小赵全屏幕中英文多窗口多功能编辑器(Linux/UNIX系统适用)
8 Description :
9 小赵编辑器,是为使用SCO UNIX,Linux多用户系统的广大用户专门设计的全屏幕多窗
10 口中英文多功能编辑器。
11 它主要有以下十大特点:1.全屏幕菜单操作。2.显示方式多样。3.块操作丰富。4.十
12 字制表功能强大。5.多窗口操作灵活自如。6.文件操作功能齐全。7.解释输出功能独具特
13 色。8.自带中文输入法(增强五笔和增强拼音),实用方便。9.十六进制编辑功能,如虎
14 添翼。10.即时翻译,按到即译。
15 总之,小赵编辑器会成为您在UNIX,Linux系统上编制程序和书写一般性文稿的好帮手。
16 它将在工作中助您一臂之力,轻松上阵,游刃有余!

(2)rpm -qpl lze-6.0-1.i386.rpm  

此命令用于查询指定软件包的全部文件列表,将命令中的-qpl换作-qpd,将显示文档文件列表,换作-qpc
将显示配置文件列表。  

命令执行结果如下:(行号开头)
1 /etc/funkey.def
2 /etc/inputme.def
3 /usr/bin/lze
4 /usr/bin/lzeime.py
5 /usr/bin/lzeime.wb
6 /usr/doc/lze-6.0
7 /usr/doc/lze-6.0/版权声明
8 /usr/doc/lze-6.0/读我
查询结果一切正常,软件包制作到此结束。
小结
在Linux下制作RPM软件包关键在描述文件,写起来着实简单,根据上述步骤生成软件包后,就可以对
外发布了。在其它机器上用安装命令(rpm -i 包名)可安装这个软件包,若想卸载,可用命令(rpm -e 包
名)来卸载这个包,非常方便。
回复

使用道具 举报

 楼主| 发表于 2003-6-8 17:02:21 | 显示全部楼层
这篇是挺好,可惜排版乱掉了……
看起来比较吃力。
回复

使用道具 举报

发表于 2003-6-9 13:52:46 | 显示全部楼层
重新排版!
另一个如下:[code:1]
制作Linux RPM包

RPM是Redhat Package Manage的缩写。透过RPM的管理,使用者可以把Source Code包装成一种
Source和Binary的档案形式。利用它,我们可以用Binary的档案进行安装,用 Source 的档案形式重新
整理包装。许多Linux爱好者对安装RPM包比较熟悉,但对如何在Linux下制作RPM包不甚了解,因此,
我将通过实例,讲解如何在Linux下制作RPM包。  
1. 最初要求  
为了创建RPM,你需要RPM要编译的源代码、一个rpmrc文件(设置一些RPM的缺省值并控制它的行为),
以及一个spec文件(控制包的建立过程)。这里假定已有其它的开发环境(gcc、make、install、vi等),
而且你的源代码已经编译成功。  
2. 制作流程  
1)确定/etc/rpmrc(也可能是/usr/lib/rpm/rpmrc)已经正确设定。rpmrc文件控制几乎所有RPM的行
为。如果你想重载一个或多个全局设置,可以在~/.rpmrc文件中包含你的定制。可以使用rpm--showrc
来显示RPM的当前设置。大多数情况下,rpmrc 文件的设置不需要改变。  
2)取回所建造的源代码并放入正确的目录中。  
3)编写spec文件。  
4)使用rpm -ba 来构造整个程式套件。  
3.应用举例  
现在以Lynx实用程序来介绍构造RPM包的整个过程。Lynx是在文本方式下的Web浏览器,可以从
ftp://www.slcc.edu/pub/lynx/取得。  
1)得到lynx源代码。  
2)lynx-2.8.spec文件的详细编写方法略。  
3)使用RPM来构造包。  
按照rpmrc文件的缺省设置,应该把lynx-2.8.spec文件放入SPECS/目录下,然后执行:
rpm -ba lynx-2.8.spec
其中-b 表示prep、compile、install,并build出一份binary RPM包。-a 表示执行所有的build动作,
即还要build 出一份source code RPM包。  
如果一切顺利的话,可以在RPMS/目录下找到lynx-2.8-4.i386.rpm文件。可以执行:
rpm -qpl lynx-2.8-4.i386.rpm
来观察RPM 包中是否包含了要求的所有文件。  
为了测试它的正确性,可以拷贝此文件到另一台机器上,并执行:
rpm -ivh lynx-2.8-4.i386.rpm
进行安装测试。  
一旦测试成功,就可以上载你的大作,享受成功的喜悦。
制作RPM包需要开发人员做很多工作。比如不仅要懂得c/c++编程,而且还要能熟练掌握像make、
autoconf、diff、patch、tar、install等工具的使用并能编写spec文件。但从长远来看,应用RPM,在
软件包的维护和方便性方面使得开发者受益。



在使用linux的过程中可能可能需要安装新的软件,升级已安装的软件或删除已安装的  
软件,这就或多或少要涉及到rpm.  
Rpm是redhat公司开发的一种源代码和二进制代码封装的方式,这种封装的方式能让用  
户轻松的进行软件包的管理,包括软件包的安装、升级、删除、查询和管理。由于采用rpm  
方式安装软件包无论是从二进制和源代码方面来讲,都比用.tar.gz的方式要简单的多.故用  
rpm安装软件成了一个linux下安装软件的标准.对于一个有志于linux下软件软件编程的程  
序员来说,掌握简易的rpm套件的制作对于推广自己的程序非常有用.  
Rpm套件的制作大致可分为:  
1. 取得.tar.gz格式的软件源程序和补丁文件.  
2. 制作rpm套件的spec规格文件.  
3. 执行rpm –ba 产生并测试rpm套件.  
整个包装rpm套件的重心就在于如何定义完整的rpm套件规格文件(specification)以及包装后的测试工
作.制作rpm套件之前,必须先了解整个系统文件的目录结构与运行,因为某些rpm套件的制作会常常牵扯
到系统运行的问题,比如安装了某种新的shell,就必须在/etc/shells中加入该shell的可执行文件路径和名
称,才能正确的使用该shell.为了免除考虑这个顾虑,可以先从无关系统运行的应用软件做起,等对linux系
统相当熟悉了,再尝试这些涉及到系统运  
行的rpm套件制作.  
Rpm的Spec就如同编译程序时的Makefile,定义制作Rpm包的所有文件信息及制作流程,其主要工作将
源程序解压缩,为源程序打补丁,编译源程序,包装二进制码Rpm包,包装源代码Rpm包,清除包装过程在
Build目录产生的临时目录.它山之石,可以攻玉.多看看他人已经编好的spec文件,是学习spec文件编写
的捷径,用以下命令将spec文件取出.  
$:rpm –qlp *.src.rpm  
$:rpm2cpio *.src.rpm|cpio –ivh *.spec  
首先执行rpm –qlp查询,得知该套件中有个.spec文件,再执行rpm2cpio将rpm文件转换成cpio文件
格式,并将转换结果输出给cpio程序,把source rpm套件中的sepc文件解压取出.打开一个spec文件,
可以发现它可以分为以下几个段: %define、 %description、%prep、%build、%install、%clean、
%files、%changelog。  
%define段主要用来做一些全局定义,如:版本号:Version;简单的概要:Summary;程序的名称:
Name;版权:Copyright;软件所属的组:Group;Source名称是最重要的位置,这里定义Source的
来源(一些tar.gz文件和一些补丁文件,若该软件的Source不仅只有一个文件,可以指定多重源程序,只需
要将"Source"和"Patch"标签编号,依次指定即可),用户必须把该文件放在/usr/src/redhat/SOURCES
目录下,rpm才可以进行包装工作;icon指名该套件的图标,前提必须是一个gif文件,且位于
/usr/src/redhat/source目录下;常常在安装某些软件是会出现某些依赖关系信息,告诉用户必须先安装
某些套件才能安装这个rpm套件的情况,需要制作这种功能的rpm套件,就是依赖"Requires"这个标签,
Requires共有<、〉、<=、=、 >=这五种.若某软件同时需要用到三四个函数库,则Requires标签就必须
定义三四行.或用逗号隔开写成一行.如: Requires: kdesupport.当然, %define段的标签还有几个,不过
不 常用,这里就不再多说了.  
%description段较为简单,主要是对该软件的一个简要的介绍.  
%prep 段是spec的准备段,该段主要执行包装Rpm包的准备工作,检查标签语法是否正  
确,检查/usr/src/redhat/SOURCES目录是否存放源程序及补丁文件,删除旧的软件源程序,  
并替程序作untar、patch等工作。当然,这些工作可以写一些shell script来进行指定的  
工作,但是如果真的写shell script来进行这些准备工作,可能会令人苦恼。于是rpm开  
发人员为用户提供了%setup和%patch这两个命令来替用户处理这些繁杂的准备工作。  
%setup 不加任何选项,仅将软件包打开。  
%setup –n newdir 将软件包解压在newdir目录。  
%setup -c 解压缩之前先产生目录。  
%setup –b num 将第num个source文件解压缩。  
%setup –T 不使用default的解压缩操作。  
%setup –T –b 0 将第0个源代码文件解压缩。  
%setup –c –n newdir 指定目录名称newdir,并在此目录产生rpm套件。  
%patch 最简单的补丁方式,自动指定patch level。  
%patch 0 使用第0个补丁文件,相当于%patch –p 0。  
%patch –s 不显示打补丁时的信息。  
%patch –T 将所有打补丁时产生的输出文件删除。  
%build 段主要是用来完成程序的编译,通常情况下是一个make命令用来完成编译。  
%install这个段较为复杂,该段主要执行安装的工作,在这里你可以写一些脚本将程序加入菜单栏中,由
于各个发行版不同,各个脚本也不通用,简单的就是执行make install来完成程序的安装(视不同程序的
安装而定)。  
%clean段是spec的删除段,它是使用rm –f命令删除编译时的临时目录,一般用rm -rf
$RPM_BUILD_ROOT即可。  
%files、%changelog段分别用来告诉用户软件安装的地方和软件的一些更新的日志等。
做完这些后,一个spec文件便就完成了,执行rpm –ba 产生并测试rpm套件,如果没出什么错的话,
便就会产生相应的二进制rpm包和源代码的srpm包。它们分别位于/usr/src/Redhat/RPMS和
/usr/src/Redhat/SRPMS目录下(注:我使用的是Redhat 7.0,不同的发行版本路径有差别).  [/code:1]

献给樱家冢斑竹!因为我的RPM做的很丑,希望他能一直为了我们共同的LINUX努力!
回复

使用道具 举报

 楼主| 发表于 2003-6-9 14:34:28 | 显示全部楼层
多谢了
回复

使用道具 举报

发表于 2003-6-9 18:21:09 | 显示全部楼层
[quote:3057043279="KDE"]认领 qt、arts、kdelibs,能否提供修正 konsole 的 kdebase 源码包?否则只能编译有毛病的。[/quote]
奇怪!为什么编译 qt 的时候提示要 mysql-devel 包??? 而且 rpmbuild 居然不支持 --build 参数!!这两天值班,没能动手,但这个问题不解决,我就没法编译!
回复

使用道具 举报

发表于 2003-6-9 18:24:19 | 显示全部楼层
在 redhat 8 下面就没有这些问题!
回复

使用道具 举报

 楼主| 发表于 2003-6-9 18:44:12 | 显示全部楼层
[quote:e6974b0dd5="KDE"][quote:e6974b0dd5="KDE"]认领 qt、arts、kdelibs,能否提供修正 konsole 的 kdebase 源码包?否则只能编译有毛病的。[/quote]
奇怪!为什么编译 qt 的时候提示要 mysql-devel 包??? 而且 rpmbuild 居然不支持 --build 参数!!这两天值班,没能动手,但这个问题不解决,我就没法编译![/quote]
不是--build吧?应该是--rebuild
回复

使用道具 举报

发表于 2003-6-9 18:53:53 | 显示全部楼层
--build=是指本机型号 --target=是指目标机型号 如果连 --rebuild 都不支持,那还能做什么?
回复

使用道具 举报

 楼主| 发表于 2003-6-9 21:07:30 | 显示全部楼层
一般--build不用指定,rpm会自动检测的吧?
回复

使用道具 举报

发表于 2003-6-9 22:13:13 | 显示全部楼层
[quote:264a276dbc="KDE"]--build=是指本机型号 --target=是指目标机型号 如果连 --rebuild 都不支持,那还能做什么?[/quote]
--build可以却省,默认是本机型号。
回复

使用道具 举报

发表于 2003-6-10 16:42:36 | 显示全部楼层
有时候是需要解决依赖关系的,昨天遭遇到的也是*-devel包,好像大部分是这些个!
回复

使用道具 举报

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

本版积分规则

GMT+8, 2025-1-9 22:59 , Processed in 0.095683 second(s), 13 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

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