rpmbuild 文档

简介: 创建 RPM RPM 创建相当简单, 你只需要获得软件源码就可以尝试创建 创建 RPM 步骤通常分为:  1. 获得需要创建 RPM 的源码  2. 获得对应补丁  3. 创建 spec 文件  4. 确保一切文件放置在合适位置  5. 创建 RPM 通常操作, RPM 都会创建二进制与源码包 spec 文件 我们会对 spec 文件进行讨论, spec 文件用于创建软

创建 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 创建源码与二进制包

 

目录
相关文章
|
3月前
|
Ubuntu Unix Linux
在Ubuntu安装RPM文件
Ubuntu软件源包含数千个deb软件包,可以从Ubuntu软件中心或使用apt命令行安装。 Deb是所有基于Debian的Linux发行版,例如包括Ubuntu,Linux mint等发行版使用的安装包格式。 如果某些软件在Ubuntu软件源中不可用,可以通过启用适当的软件源来安装,然后使用APT命令安装。 在大多数情况下,当软件开发者不提供软件源时,他们都有一个下载页面,您可以在该页面下载并安装deb软件包,或者下载源码然后编译。 虽然不常见,但某些软件开发者可能会仅发布RPM包格式的文件。RPM是Red Hat及其衍生的Linux发行版,例如如CentOS,Fedora使用软件包
|
4月前
|
存储 数据挖掘 Linux
探索Linux命令rpm2cpio:解析RPM包内容的利器
`rpm2cpio`是Linux下用于从RPM包中提取内容的工具,它将`.rpm`转换为CPIO归档。无需安装,可直接访问包内文件,适合数据分析。命令简单,常与`cpio`结合使用,如`rpm2cpio package.rpm | cpio -idmv`解压文件。示例包括提取特定文件和列出包内所有文件。注意权限、路径和文件完整性,使用前备份数据,并查阅文档以优化使用。
rpmbuild必须在rpmbuild目录下
rpmbuild必须在rpmbuild目录下
111 0
|
Shell 数据库 索引
|
应用服务中间件 Linux nginx
|
应用服务中间件 Linux nginx