创建 RPM
RPM 创建相当简单, 你只需要获得软件源码就可以尝试创建
创建 RPM 步骤通常分为:
1. 获得需要创建 RPM 的源码
2. 获得对应补丁
3. 创建 spec 文件
4. 确保一切文件放置在合适位置
5. 创建 RPM
通常操作, RPM 都会创建二进制与源码包
spec 文件
我们会对 spec 文件进行讨论, spec 文件用于创建软件包, 用于描述如何创建软件并定义编译后, 定义二进
制文件安装位置, 定义文件列表等信息
spec 文件需要按照标准格式进行命名, packagename-version-release.spec 假如你具有一个软件包的多个
版本, 确保你每个源码都具有完整的 spec 文件
spec 文件命名规则例: eject-2.0.2-1.spec
Summary: A program that ejects removable media using software control.
Name: sniffer
Version: 2.1.4.9
Release: 3
Copyright: GPL
Group: System Environment/Base
Source:
http://xxx/xxxx/xxx/eject-2.1.4.9.tar.gz
Patch:
BuildRoot: $RPM_SOURCE_DIR
%description
The sniffer program use to ...
%prep
%setup -q
%build
make
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/man/man1
install -s -m 755 eject $RPM_BUILD_ROOT/usr/bin/eject
install -m 644 eject.1 $RPM_BUILD_ROOT/usr/man/man1/eject.1
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root)
%doc README TODO COPYING ChangeLog
/usr/bin/eject
/usr/man/man1/eject.1
%changelog
* 2012-03-03 <xxx@xxx.com>
- auto rebuild in the new build environment (release 3)
spec 文件中, 具有下面的一些语法标准, 你必须按照标准使用
Summary: 软件包的描述, 只能够使用一行
Name: 打算编译后的 RPM 软件包命名
Version: 打算编译后的 RPM 版本字符串
Release: 编译后的 RPM 版本发行号
Copyright: 版权, 常见有 GPL, BSD, MIT, public domain, distributable, 或 commercial.
Group: 组工具(能够被 YUM 调用)
Source: 通常定义软件下载来源, 便于以后更新
Patch: 描述补丁下载来源, 便于以后更新
注意: Patch, source 文件都需要存放到 SOURCE 目录中才能够被编译时发现
Group: 参考 /usr/share/doc/rpm*/GROUPS 文件, 代表软件属于软件库中的那个组
BuildRoot: 定义软件包编译, 安装的根目录
%description 不属于 header 部分, 用于综合描述软件功能, 你可以用于描述包信息, 允许使用多行信息
%prep 属于 spec 第二部分, 用于定义打补丁, 配置并编译源码
有一点需要注意:
这个章节中会执行 shell 脚本, 你只需要创建 sh 脚本, 并存放到 %prep 之后, 并调用 macro 宏编译
第一个 macro 是 %setup, 用于解压并进入到源码目录, 常见选项有
-n name 将会把 name 作为编译目录, 默认是 packagename-version 或者 {NAME}{VERSION}
-c 将会在解压软件后自动进入目录
-b 只用于在多个源码文件时候, 直接解压, 不进入目录
-a 进入目录后再解压源码
-T 假如这是第二个源码则需要使用, 意味着覆盖默认解压源码操作, 并需要 -b 0 或 -a 0 对主程序解压
-D 在解压后不删除软件包, 如果需要多次 %setup 配置时, 可以使用
第二个 macro 是 %patch 用于为源码进行打补丁, 可以参数如下
不带参数, 则直接应用该补丁
-p 定义目录位置, 如 /u/howard/src/blurfl/blurfl.c 文件
-p0 -> /u/howard/src/blurfl/blurfl.c
-p1 -> u/howard/src/blurfl/blurfl.c
-p4 -> blurfl/blurfl.c
-b 将会保留打补丁前文件为 filename.extension
假如上述宏定义正确, 你可以配置 sh 脚本, 脚本需要利用 %build 宏进行执行, 参考下面例子
之前已经描述对软件进行解压, 打补丁, 并进入到源码目录
当前部分中不需要任何宏定义, 你只需要定义有效脚本, 并由 sh 执行合法的命令(包括注释)
你当前工作的目录会在源码的根目录中,假如需要, 你可以 cd 到子目录中
变量 RPM_OPT_FLAGS 调用 /usr/lib/rpm/rpmrc 变量, 用于定义机器架构, 该变量属于可选变量
安装
不需要使用任何宏定义, 你只需要定义安装时必须的命令, 可以对软件包进行安装, 或者对 makefile 打
补丁, 也可以调用 sh 脚本, 注意, 当前目录为源码根目录
变量 RPM_BUILD_ROOT 由 header 部分中 Buildroot 进行定义, 推荐 使用 build root
清除系统
建议在生成软件包后, 清除编译目录, %clean 宏能够帮助你清除软件, 只需要利用命令清除编译目录就可以
注意: 不要把 RPM_BUILD_ROOT 设定为 /
可选地 pre 与 post 安装与反安装脚本
你可以利用 %pre %post 存放脚本, 并在 RPM 安装前/后进行执行, 最常见的例子是在 RPM 安装后执行
ldconfig 命令, 导入合适的共享库, 下面描述可用的宏
%pre 安装前脚本
%post 安装后脚本
%preun 执行 %pre 反安装脚本
%postun 执行 %post 反安装脚本
脚本需要使用 magic number 进行定义 #!/bin/sh.
文件
这个章节描述你必须列出二进制包文件, RPM 不知道 make install 时候需要安装什么文件
下面宏能够用于定义一些安装信息
%doc 用于标记安装二进制时候并发源码包中的文档, 文档将会安装到 /usr/share/doc/name-ver-release
目录, 你可以利用 %doc 安装多个文件
%config 用于标记软件包配置文件, 包括例如 sendmail.cf, passwd 等,假如你反安装软件包并希望删除
配置文件, 任何未改变过的文件都会被删除, 而改变过的则重命名为 xx.rpmsave 文件, 可以利用宏定义
多个配置文件
%defattr 允许你定义文件默认属性, 属性定义为 (mode, owner, group) 如(644, oracle, dba)
%file -f <filename> 允许你列出源码目录中的任意文件, 例如你具有一个包, 那么可以创建包的文件列表
你只需要在这里包含文件列表, 而不需要列出文件
Changelog
当软件包进行升级时的标记, 假如你修改一个存在的 RPM, 那么建议你进行升级标记
格式很简单, 每行都需要以 * 然后跟随一个日期, 你的姓名, EMAIL.
建议使用下面的方法定义时间
date +"%a %b %d %Y"
余下部分是文字列, 没有固定格式, 你可以用于整理一些相关信息
源码树目录
第一件事, 你需要配置编译源目录, 你需要利用 /etc/rpmrc 文件, 但大部分人直接使用 /usr/src
你需要创建下面的目录用于编译代码
BUILD 目录用于 RPM 编译
SOURCES 用于存放源码, 补丁, RPM 会自动从该目录自动寻找
SPECS 存放 SPEC 文件
RPMS 二进制软件编译后存放位置
SRPMS 源码 RPM 存放位置
编译测试
可能需要干净的源码编译, 而不使用 RPM, 解压源码, 改变目录命名为 $NAME.orig, 再次解压源码, 使用这个源码进行
编译, 进入到源码并按照下面步骤进行编译, 假如你需要作出修改, 打补丁, 必须在编译后清除源码目录, 确保以后其他
不需要的文件, 然后回到主目录, 然后执行下面信息创建自己的补丁
diff -uNr dirname.orig dirname > ../SOURCES/dirname-linux.patch
生成文件列表
现在源码用于编译, 并安装, 查看安装输出, 然后创建文件列表到 spec 文件中,
利用软件包生成 RPM
当完成 SPEC 文件后, 你可以尝试创建软件包, 利用下面命令
rpm -ba foobar-1.0.spec
-b能够与下面参数进行配合使用
p 代表只执行 spec 文件中 prep 部分
c 只执行 prep 与编译, 常用于你无法确保源码是否能够完整编译,
i 执行 prep, compile, install
b prep, compile, install 只创建一个二进制包
a 创建源码与二进制包