日历
| |||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 1 | 2 | 3 | 4 | 5 | |||||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 | |||
| 13 | 14 | 15 | 16 | 17 | 18 | 19 | |||
| 20 | 21 | 22 | 23 | 24 | 25 | 26 | |||
| 27 | 28 | 29 | 30 | 31 | |||||
存档
搜索标题
统计信息
- 访问量: 319
- 日志数: 2
- 建立时间: 2008-03-25
- 更新时间: 2008-03-25
我的最新日志
-
Dephi快捷键
2008-3-25
1.SHIFT+鼠标左键 先选中任一控件,按键后可选中窗体(选中控件后按Esc效果一样)
2.Shift+F8 调试时弹出CPU窗口。
3.Shift+F10 等于鼠标右键(Windows快捷键)。
4.Shitf+箭头 选择
5.shift +F12 快速查找窗体并打开
6.F7 (步进式调试同时追踪进入子过程)
7.F8 (步进式调试不进入子过程)
8.F9 运行
9.F12 切换EDITOR,FORM
10.Alt+F4 关闭所有编辑框中打开的源程序文件,但不关闭项目
11.ALT+鼠标左键 可以块选代码,用来删除对齐的重复代码非常有用
12.Ctrl+F9 编译
13.Ctrl+shift+N(n=1,2,3,4......) 定义书签
14.Ctrl+n(n=1,2,3,4......)跳到书签n
15.CTRL +SHIFT+N 在书签N处,再按一次 取消书签
16.Ctrl+PageUp 将光标移至本屏的第一行,屏幕不滚动
17.Ctrl+PageDown 将光标移至本屏的最后一行,屏幕不滚动
18.Ctrl+↓ 向下滚动屏幕,光标跟随滚动不出本屏
19.Ctrl+↑ 向上滚动屏幕,光标跟随滚动不出本屏
20.Ctrl+Home 将光标移至文件头
21.Ctrl+End 将光标移至文件尾
22.Ctrl+B Buffer List窗口
23.Ctrl+I 同Tab键
24.CTRL+J (弹出Delphi语句提示窗口,选择所需语句将自动完成一条语句)代码模板
25.Ctrl+M 同Enter键。
26.Ctrl+N 同Enter键,但光标位置保持不变
27.Ctrl+T 删除光标右边的一个单词
28.Ctrl+Y 删除光标所在行
29.CTRL+C 复制
30.CTRL+V 粘贴
31.CTRL+X 剪切
32.CTRL+Z 还原(Undo)
33.CTRL+S 保存
34.Ctrl+F 查找
35.Ctrl+L 继续查找
36.Ctrl+r 替换
37.CTRL+ENTER 定位到单元文件
38.Ctrl+F3 弹出Call Stack窗口
39.Ctrl+F4 等于File菜单中的Close项
40.Ctrl+Backspace 后退删除一个词,直到遇到一个分割符
41.Ctrl+鼠标转轮 加速滚屏
42.Ctrl+O+U 切换选择块的大小写(注意松开O后再按U,Ctrl保持按下)
43.Ctrl+K+O 切换选择块为小写(注意松开K后再按O,Ctrl保持按下)
44.Ctrl+K+N 切换选择块为大写(注意松开K后再按N,Ctrl保持按下)
45.Ctrl+Shift+G 插入GUID
46.Ctrl+Shift+T 在光标行加入To-Do注释
47.Ctrl+Shift+Y 删除光标之后至本行末尾之间的文本
48.CTRL+SHIFT+C 编写申明或者补上函数,绝好!!!
49.CTRL+SHIFT+E 显示EXPLORER
50.Ctrl+Tab 在Inspector中切换Properties页和Events页
51.CTRL+SHIFT+U 代码整块左移2个空格位置
52.CTRL+SHIFT+I 代码整块右移2个空格位置
53.CTRL+SHIFT+↑ 在过程、函数、事件内部, 可跳跃到相应的过程、函数、事件的定义(在interface和implementation之间来回切换)
54.CTRL+SHIFT+↓ 在过程、函数、事件的定义处, 可跳跃到具体过程、函数、事件内部(同上)
55.Tab 在object inspector窗口按tab键将光标移动到属性名区,然后键入属性名的开头字母可快速定位到该属性
56.Ctrl+Alt 按着Ctrl+Alt之后,可用鼠标选择一个矩形块中的代码,并可比它进行复制,粘贴57.Shift+↓、↑、→、← 以1像素单位更改所选控件大小
58.Ctrl+↓、↑、→、←以1像素单位更改所选控件位置
59.Ctrl+E 快速选择
60.Ctrl+Alt+c 注释块
61.Ctrl+Alt+u 取消注释块
62.Ctrl+Alt+h 生成头(更详细的设置在GExperts配置的Editor Experts属性页)
63.Ctrl+Alt+o 选择对应分隔符之间的语句
64.Ctrl+Alt+v 在对应的分隔符之间来回跳转(与已有快捷键有冲突,请更改) -
rpm建包原理
2008-3-25
为什么要打包?
制作 rpm 不仅仅是打包,更可以解决菜单创建、打补钉、完成大量预配置、与其他软件包互动等操作。使用源代码安装要求用户了解基本的编译过程、能够应付各种不能编译的意外、必须自己完成抽象的配置、甚至懂得软件开发,能够自己打补钉,……对非计算机专业的用户而言简直就是天方夜谭。这是把软件开发的最后一步抛给了用户,作为发行版,这是极不负责任的!也是不现实的,除非用 lfs,但那是一本菜谱,不是真正的发行版。
软件作者发布源代码是正确的,负责的作者一般都同时提供 rpm 和 deb 包以及它们的源代码包。除非他们不会制作。愿意使用什么,那是个人的自由,但对外就不能只想到自己。GNU 精神是一种公益精神,没有奉献精神,在自由软件领域是要遭唾弃的!
直接使用其他发行版的 rpm 常常是不行的。不知道大家看没看“恼人的依赖关系”这个帖子。可以在技术支持区搜索一下。任何两个发行版本在二进制上都是不能兼容的!他们实际是不同的操作系统。不仅使用的库文件不同,配置也迥异。特别是同一个发行版的不同版本更不兼容。任何包都必须在本地重新编译,而且不一定通得过,因为还有 spec 宏的兼容问题!如果要在别的发行版上使用,必须用源码编译,这是常识。考虑文件布局和配置问题,有时直接编译也是不够的,必须修改 spec,甚至自己打补丁。
如何创建 rpm 包?
rpm 建包原理其实不复杂。写 spec 相当于一种脚本编程,主要是在 spec 里提供一些软件相关信息,以及安装、卸载前后要执行的脚本,然后展开压缩的源代码包,打上补丁,执行编译,然后利用 make install 可以重新指定安装目的地的特性,把编译好的文件安装到指定的虚拟根目录下的指定位置里,一般是虚拟的 /usr 里,然后把这些目录、信息和脚本打成一个压缩包,即 rpm 包。同时可选地生成源码包 src.rpm。当然有很多具体细节问题。您应该首先阅读软件的 readme 和 INSTALL 文件。
打包原则
1. 任何人都应该在系统现有 src.rpm 的 spec 基础上修改更新,除非没有这样的包。这可以省去很多麻烦,少走弯路。
2. 任何人都无权删除别人的 changelog 和原始打包者的信息,这是对别人的不尊重。但你可以追加自己的信息。
3. 尽可能在 spec 里使用系统的标准宏定义,而不要用非标准写法。
4. 任何人都不应该直接提供修改后的源代码,而应该以补丁形式发布你的修改,在 spec 里完成打补丁操作。务必做到一个补丁只解决一个问题,这样才能确保补丁的可重用性,否则版本升级后补丁很容易失效。如果你确信自己的补丁是清洁补丁,尽可能发给上游开发者,这样才能一劳永逸。你所打的任何补丁,其授权方式必须和被修改源代码保持一致。
5. rpm 不是跨平台打包技术。确保软件的二进制代码能够跨平台运行,不是系统软件打包者要考虑的事,而是应用软件作者和独立二进制代码发布者应该考虑的事。我们没有责任和义务确保从我们系统里拆解下来的部件能够运行于其他系统上,不支持,更不提倡这种移花接木的作法。
试图解决跨平台问题的打包技术,我印象中有 autopackage 和 klik 技术,参见:
http://autopackage.org
http://klik.atekon.de
预备知识:
首先我们观察一下 rpm 文件名的特点。一个 rpm 包文件名通常由 5 段组成:
%{name}-%{version}-%{release}.ix86.rpm
cutedict-1.1-1mgc.i686.rpm
这里 %{name}=cutedict,%{version}=1.1,%{release}=1mgc,ix86=i686,如果是为 athlon 芯片家族编译的包,这里就是 athlon,依此类推。
注意:
下面是一个spec 模板。
1. 凡是行首加上 # 的都被注释掉了,实际运行时不起作用,如要使其生效,请去掉注释符 #。
2. 凡是以 %{***} 和 %*** 形式出现的符号都是“宏”,很多宏都是系统预定义的[注2],也可以是自己定义的。
3. 下面的黑体字是 spec 文件的关键字,不能写错。
4. 有不明白的地方可以参见跟帖里的参考文献。
5. 如果软件没有使用 GNU autotool 创建,而是自己写的 Makefile,这就导致不能按照常规方法打包,非常麻烦。
6. 服务器软件通常都需要大量预配置工作,spec 打包绝非一两天能解决,需要深入研究很多东西和反复实践,建议初学者不要尝试。
7. 其他发行版的 spec 与 src.rpm 是很好的教材,建议打包前先找找 Fedora 或 SuSE 的文件学习,能借鉴最好,但不应该不修改照搬过来或使用 Mandrake/Mandriva 的文件,因为它使用的大量专有宏定义和我们不兼容,甚至 src.rpm 直接编译都通不过。
------------------------------------------------------------------
[spec 文件头部]
# Initial spec file created by autospec #这里是一些注释
%define _noautoreq perl(Plot) perl(WidgetDemo) #这里用 %define 自定义一个系统里没有的叫做 _noautoreq 的宏,后面可以用 %{_noautoreq} 引用。
Name: software #这是软件包名称,后面可以用 %{name} 引用
Summary: a software #这是软件包的内容提要
#Summary(zh_CN): #这里写入中文内容提要(如果有必要。不建议使用,因为如果系统里的默认编码与此处不符,会导致显示乱码。例如:我们使用 GBK,如果这里的中文是 UTF-8 编码,在 kpackage 里就会显示乱码,但是 synaptic 可能能够正确显示,但需要把 zh_CN 改为 zh_CN.UTF-8 )
Version: number #这是软件的实际版本号,例如 2.1.6、2.2final 等,后面可以用 %{version} 引用
Release: number #发布序列号,我们用 1mgc、2mgc 等等,标明这是第几次打包。如果软件本身是预览版,比如 pre6 版,则写成 pre6_1mgc、pre6_2mgc,后面可以用 %{release} 引用
Group: Applications/Multimedia #这是软件分组,建议使用标准分组,参见下面:[注1]
#Group(zh_CN): #中文软件分组(如果有必要)
License: GPL #这是软件授权方式,通常是 GPL
Source: %{name}-%{version}.tar.gz #这是源代码(通常是压缩包),可以带有完整的网址,可以用正整数标识多个源 Source0 Source4 Source5 Source100,数字不必连续排列,后面可以用 %{SOURCE0}、%{SOURCE4}、%{SOURCE5}、%{SOURCE100} 引用。例如 http://www.example.net/src/%{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot #这是 make install 时使用的“虚拟根目录”也称为“构建根目录”,通常是 /var/tmp/软件名称-版本号-发布序列号-buildroot。对于服务器环境,可能同时有多人操作,为了确保编译软件时临时目录不会相互覆盖,还需要加上当前用户的标识:BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n)
make install 时一般会将软件安装在 /var/tmp/软件名称-版本号-发布序列号-buildroot/usr/ 下的 bin/ 下(可执行文件)、share/ 下(数据、资源文件)、lib/ 下(动态共享库文件,即 .so 文件 <Share Object>,相当于 windows 下的 DLL 文件)等等,例如 /var/tmp/cce-0.51-1mgc-buildroot/usr/bin/cce。不过实际不一定都是这样,具体情况具体对待
# 下面是可选的字段
URL: http://www.example.net/ #这是软件主页地址
#Vendor: Red Hat Co.,ltd. #这是发行商或者打包组织的信息,我们统一写成 MGC Group,不过这一行可以省略,把它写入 /usr/lib/rpm/macros 标准宏定义文件里,该文件的 Vendor 这行定义是空的,而且通常前面用 # 注释掉了
#Distribution: Red Hat Linux #这是软件针对的发行版标识,我们是 Magic Linux
Patch: src-%{version}.patch #这是补丁源代码(可以是压缩包),可以用正整数标识多个源 Patch1 Patch4 Patch6,数字不必连续排列。
Prefix: %{_prefix} #指定 make install 时在虚拟根目录里的安装位置,通常用标准的 %{_prefix} 宏,它代表 /usr。这里指定后,用户可以在 rpm 安装阶段重新指定安装到其他位置,如 /opt,否则就不能改变安装位置。
Prefix: %{_sysconfdir} #如果软件有些文件并非都安装到 %{_prefix},那么你需要指明其他位置。例如你需要把一个配置文件放到 /etc 下面,这显然不在 /usr 下面,此时你需要前方这种写法。%{_sysconfdir} 宏代表 /etc。这里指定后,用户可以在 rpm 安装阶段重新指定这些文件安装到其他位置,如 /opt/etc,否则就不能改变安装位置。[注3]
#BuildArch: noarch #编译目标处理器架构,就是今后软件运行时的 CPU 类型。noarch 是不指定架构,通常标准默认是 i386,定义在了系统的标准宏定义文件 /usr/lib/rpm/macros 里 [注2]。实际编译时可以在 rpmbuild 命令行用 --target=i686 参数,spec 里通常不写这行。
#Requires: libpng-devel >= 1.0.20 zlib libpng #这里罗列所有安装本包时需要先行安装的包(依赖包),通常软件会依赖这些包里的一部分文件。可以分成多行来写。如果这里不写明依赖包,打包时系统仅仅会自动把具体依赖的 .so 文件写进 rpm 包,而不会注明这些文件属于哪些软件包,这会对用户造成困惑,因为他们很难知道这些文件属于哪些软件包。注意:如果使用 >= 这样的符号,务必在其两边各保留一个空格
#Obsoletes: #这里列出的软件包都是“陈旧”的,当升级安装本包的时候,这里列出的包都会被自动卸载!
NoAutoReq: %{_noautoreq} #这里的意思是禁止自动查找对 spec 文件头部预定义的 _noautoreq 宏里定义的两个软件包[perl(Plot) 和 perl(WidgetDemo)]的依赖关系,通常对于 prel 模块需要这样处理。因为即便你在 Requires 字段指明了本包所依赖的包含这两个模块的那些软件包,安装 本包的时候系统仍然会直接查找是否安装有这些 perl 模块,而不会查找那些包含这两个模块的软件包是否已经安装。
#PreReq: loop #如果在 %pre 字段执行的脚本需要使用一些特殊命令,例如 loop,你需要在此标明
#Requires(post): loop #这是上面一行的另一种写法,依此类推,还有其他几个类似的关键字:
#Requires(pre)
#Requires(preun)
#Requires(postun)
#Autoreq: 0 #这里使用 0 关闭了自动标注本软件包需要的依赖关系的功能,使用 1 或者不写此行(默认)就是开启自动标注依赖关系的功能。自动依赖校验只会通过 pkgconfig 找出依赖的 .so 文件,而绝对不是软件包!可以通过命令反查生成的 rpm 包所依赖的这些 .so 文件属于哪个包,再把这些依赖的包的名称写进 spec,最后重新编译就行了。
#Autoprov: 0 #这里使用 0 关闭了自动标注本软件包提供的依赖关系的功能,使用 1 或者不写此行(默认)就是开启自动标注依赖关系的功能
#Autoreqprov: 0 此关键字兼具上述两条的功能
#BuildRequires: libpng-devel >= 1.0.20 #这是编译时依赖的包
#Provides: lda #这里标注本软件包提供的某些特定功能。例如 sendmail 在没有本地递送代理 [local delivery agent (lda)] 时不能工作,而你的软件包恰好提供了这一功能,你需要在此标明。而在 sendmail 的 spec 里你需要写明:Requires: lda
Packager: Tony Black <tony@magiclinux.org> #这是打包者的信息
%descrīption 软件的详细说明
This is the descrīption...
#%descrīption -l zh_CN 中文软件说明(如果有必要。不建议使用,因为如果系统里的默认编码与此处不符,会导致显示乱码。例如:我们使用 GBK,如果这里的中文是 UTF-8 编码,在 kpackage 里就会显示乱码,但是 synaptic 可能能够正确显示,但需要把 zh_CN 改为 zh_CN.UTF-8 )
[spec 文件体部]
%prep #下面开始预处理
%setup -n %{name}-%{version} #到这里,系统把源码包从 /usr/src/mBuild/SOURCES 解压缩到 /usr/src/mBuild/BUILD/%{name}-%{version} ,并转到那里展开的压缩包目录(%{name}-%{version} )里,以便完成打补丁等准备工作,最后还要退回到 /usr/src/mBuild/BUILD 目录下。-n 后面指定的参数代表 tar 包展开后生成的目录名,一般 -n %{name}-%{version} 是不需要的,除非 tar 包名称和展开后生成的目录名不符,或者你要处理多个 tar 包。如果打包时报告找不到 ./configure 说明 -n 参数指定的目录不对,或者软件源代码目录里没有
