什么是 spec(配置规范文件)?RPM 编译过程的核心是处理 .spec 文件。它说明了软件包怎样被配置,补缀哪些补丁,安装哪些文件,被安装到哪里,在安装该包之前或之后需要运行哪些系统级别的活动。它必须手写,但更简单的办法是拿来他人写好的,在此基础上修改。RPM 自身对于你能在 spec 文件中做什么没有太多限制,所以你可以搞的很复杂。
章节预览:
1. spec文件的编码
2. spec文件的授权
3. 编写spec文件
3.1 生成一个空文件的安装包
3.2 生成一个包含文件的安装包
3.3 使用rpm2cpio解压源包和安装包
3.4 生成一个完整的源包
3.5 rpmbuild内不同文件夹的作用
3.6 编写一个包含源码的spec文件
3.7 制作并使用patch
4. 常见问题
章节内容:
1. spec文件的编码
如果不需要使用 ASCII字符集以外的字符,那就不用关心 spec 文件的编码。如果使用了 ASCII 字符集以外的字符,请把 spec 文件以 UTF-8 编码保存即可。
2. spec文件的授权
由于一些法律上的原因,spec 文件必须有一个授权说明的头部。请注意,如果你不写,开放式构建服务就会把它自己默认的加给你。如果这不是你想要的那样子,你可以参考下面的模板写你自己的。——引自openSUSE维基
当然,如果我们编写非开放式spec文件就不用增加授权说明的头部,模板示例如下:
#
# spec file for package python-$FOO
#
# Copyright (c) $CURRENT_YEAR $YOUR_NAME_WITH_MAIL_ADDRESS
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
#中文版
#
#
# 软件包 软件包名写这里 的 spec 文件
# 版权所有 (c) 年份写这里 你的名字 你的电邮
#
# 第三方修订者拥有对本文件的任何修正和增补的版权,除非他们宣布放弃。这份文件本身的授权,
# 修复和增补的授权,都和软件包的授权相同(除非软件包不是以开源协议发布,例如MIT协议)。
# 开源协议是一种遵守开源行动制定的开源定义的授权许可。
# 请通过 http://bug.opensuse.org 提交错误报告和评论。
#
3. 编写spec文件
首先分析一个完整的spec文件:
Name: rpm包名
Version: 版本
Release: 发布修正号(在指定版本的第一次发布假设为1,之后每次修改这个版本发布时增加1)
Summary: 介绍摘要
Group: 包所属组的类型
License: 发布许可类型
URL: 网址
AutoReqProv: 是否产生RPM依赖关系 yes/no
PAckager: 打包者的信息
Provides: 指定依赖包或可执行文件
Source0: 源码包说明,多个源码包可以由Source0、Source1等指定
Patch0: 补丁文件说明,与Source0相同,多个补丁文件也可以由Patch0、Patch1等指定
PreReq: 前期依赖
BuildRequires: 编译依赖
Requires: 代码片段的运行依赖
%description 描述标签
%prep 预备处理
%build 编译
%install 安装
%post rpm包安装时执行的内容
%postun rpm包卸载后执行的内容
%files 指定文件
%defattr(-,root,root) 文件权限
%changelog 修订日志
3.1 生成一个空文件的安装包
接下来在"/root/rpmbuild/SPECS"文件夹内写一个名为test.spec的文件 ,测试打包:
Name: test
Version: 1.2
Release: 1
Summary: 测试包
License: GPL
URL: 123456
Packager: 小明
AutoReqProv:no
%description
%prep
%pre
%post
%preun
%postun
%files
这个spec文件只有包的基本描述信息,没有指定具体执行内容,接下来执行这个文件,命令行输入:rpmbuild -ba test.spec,参考图1:
在“/root/rpmbuild/SRPMS/”文件夹内生成了test-1.2-1.src.rpm源包,在"/root/rpmbuild/RPMS"文件夹内生成了test-1.2-1.x86_64.rpm安装包。
3.2 生成一个包含文件的安装包
我们继续使用test.spec文件,并在“%files”下增加如下内容: