制作RPM包,可以方便日后的维护。统一了标准
-
yum install rpmdevtools
安装后,使用 rpmdev-setuptree命令创建rpm包的目录结构。默认是在$HOME下rmpbuild下,也可以通过~/.rpmmacros配置。
- SPEC文档是制作rpm包的核心。
- 下面是从fedora中copy过来的
-
新建一个 .spec 文件 现在,您需要在 ~/rpmbuild/SPECS 目录下,新建一个 SPEC 文件。文件应命名为 "软件包名.spec"。名称根据软件包名或通用名填写即可。但是,必须要遵守 软件包命名规定。 模板和实例 模板 如果您首次创建 .spec 文件,vim 或 emacs 会自动生成模板: $ cd ~/rpmbuild/SPECS $ vim program.spec 示例(仅供参考): Name: Version: Release: 1%{?dist} Summary: Group: License: URL: Source0: BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: Requires: %description %prep %setup -q %build %configure make %{?_smp_mflags} %install rm -rf %{buildroot} make install DESTDIR=%{buildroot} %clean rm -rf %{buildroot} %files %defattr(-,root,root,-) %doc %changelog
- 里面的参数该怎么写:
-
"
#
" 字符表示注释,但需要避免注释宏(以%
开头),因为它们会首先被替换展开。使用%%
注释宏。另外,还要避免在脚本命令的相同行中使用行内注释。以下介绍了主要的标签。注意
%{name}
,%{version}
和%{release}
代表 Name, Version 和 Release 这三个标签。只要更改标签,宏就会使用新值。- Name: 软件包名,应与 SPEC 文件名一致。命名必须符合 软件包命名规定。
- Version: 上游版本号。请查看 版本标签规定。如果包含非数字字符,您可能需要将它们包含在 Release 标签中。如果上游采用日期作为版本号,请考虑以:
yy.mm[dd]
(例如2008-05-01
可变为8.05
) 格式作为版本号。 - Release: 发行编号。初始值为
1%{?dist}
。每次制作新包时,请递增该数字。当上游发布新版本时,请修改 Version 标签并重置 Release 的数字为1
。具体参考打包规定中的 Release 标签部分,以及 Dist tag。 - Summary: 一行简短的软件包介绍。请使用美式英语。请勿在结尾添加标点!
- Group: 指定软件包组,例如 "Applications/Engineering";执行 "
less /usr/share/doc/rpm-*/GROUPS
" 查看完整的组列表。任何包含文档的子软件包,使用 "Documentation" 组(如kernel-doc
)。注意 Fedora 17+ 后已废除此标签。Spec 文件参考手册 有介绍 - License: 授权协议,必须是开源许可证。请不要使用旧的 Copyright 标签。协议采用标准缩写(如 "
GPLv2+
")并且描述明确(如, "GPLv2+
" 表示 GPL 2 及后续版本,而不是 "GPL
" 或 "GPLv2
" 这种不准确的写法)。参考 Licensing 和 Licensing Guidelines。如果一个软件采用多个协议,可以使用 "and
" 和 "or
"(例如 "GPLv2 and BSD
")来描述。 - URL: 该软件包的项目主页。注意:源码包 URL 请使用 Source0 指定。
- Source0: 软件源码包的 URL 地址。"
Source
" 与 "Source0
" 相同。强烈建议提供完整 URL 地址,文件名用于查找SOURCES
目录。如果可能,建议使用%{name}
和%{version}
替换 URL 中的名称/版本,这样更新时就会自动对应。下载源码包时,需要 保留时间戳。如果有多个源码包,请用Source1
,Source2
等依次列出。如果你需要添加额外文件,请将它们列在后面。更多特殊案例(如 revision control),请参考 Source URL。 - Patch0: 用于源码的补丁名称。如果你需要在源码包解压后对一些代码做修改,你应该修改代码并使用 diff 命令生成 patch 文件,然后放在
~/rpmbuild/SOURCES
目录下。一个 Patch 应该只做一种修改,所以可能会包含多个 patch 文件。 - BuildArch: 如果你要打包的文件不依赖任何架构(例如 shell 脚本,数据文件),请使用 "
BuildArch: noarch
"。RPM 架构会变成 "noarch
"。 - BuildRoot: 在 %install 阶段(%build 阶段后)文件需要安装至此位置。Fedora 不需要此标签,只有 EPEL5 还需要它。默认情况下,根目录为 "
%{_topdir}/BUILDROOT/
"。 - BuildRequires: 编译软件包所需的依赖包列表,以逗号分隔。此标签可以多次指定。编译依赖 不会 自动判断,所以需要列出编译所需的所有依赖包。常见的软件包可省略,例如
gcc
。如果有必要,你可以指定需要的最低版本(例:"ocaml >= 3.08
")。如果你需要找到包含/EGGS
文件的软件包,可执行 "rpm -qf /EGGS
"。如果你需要找到包含EGGS
程序的软件包,可执行 "rpm -qf `which EGGS`
"。请保持最小依赖(例如,如果你不需要 perl 的功能,可使用sed
代替),但请注意,如果不包含相关依赖,某些程序会禁用一些功能;此时,你需要添加这些依赖。auto-buildrequires
软件包可能会有帮助。 - Requires: 安装软件包时所需的依赖包列表,以逗号分隔。请注意, BuildRequires 标签是编译所需的依赖,而 Requires 标签是安装/运行程序所需的依赖。大多数情况下,
rpmbuild
会自动探测依赖,所以可能不需要 Requires 标签。然而,你也可以明确标明需要哪些软件包,或由于未自动探测所需依赖而需要手动标明。 - %description: 程序的详细/多行描述,请使用美式英语。每行必须小于等于 80 个字符。空行表示开始新段落。使用图形安装软件时会重新格式化段落;以空格开头的行被视为已格式化的格式,一般使用等宽字体显示。参考 RPM Guide。
- %prep: 打包准备阶段执行一些命令(如,解压源码包,打补丁等),以便开始编译。一般仅包含 "
%autosetup
";如果源码包需要解压并切换至NAME
目录,则输入 "%autosetup -n NAME
"。查看 %prep 部分了解更多信息。 - %build: 包含构建阶段执行的命令,构建完成后便开始后续安装。程序应该包含有如何编译的介绍。查看 %build 部分了解更多信息。
- %install: 包含安装阶段执行的命令。命令将文件从
%{_builddir}
目录安装至%{buildroot}
目录。查看 %install 部分了解更多信息。 - %check: 包含测试阶段执行的命令。此阶段在 %install 之后执行,通常包含 "
make test
" 或 "make check
" 命令。此阶段要与 %build 分开,以便在需要时忽略测试。 - %clean: 清理安装目录的命令。此阶段在 Fedora 中是多余的,仅针对 EPEL。一般只包含:
rm -rf %{buildroot}
- %files: 需要被打包/安装的文件列表。查看 %files 部分了解更多信息。
- %changelog: RPM 包变更日志。请使用示例中的格式。注意,不是软件本身的变更日志。
- ExcludeArch: 排除某些架构。如果该软件不能在某些架构上正常编译或工作,通过该标签列出。
- ExclusiveArch: 列出该软件包独占的架构。
放置源代码
把一个名为devrpm-0.0.1.tar.gz
的源码压缩文件放到rpmbuild
根目录下的SOURCES目录下(注,确保此归档文件解压后的目录为devrpm-0.0.1,否则会有问题)。
到此一个完整的rpm打包环境已经构建完成,下面我们就可以开始构建二进制和源代码RPM包。
构建RPM包
构建RPM包是有命令rpmbuild在SPEC的指导下完成。
开始构建操作,首先进入到当前用户的rpmbuild根目录(即上面提到的目录环境)。
#cd ~/rpmbuild/
执行如何命令,-ba表示build all,即生成包括二进制包和源代码包的所有RPM包,下来如果正常的话,rpmbuild将正常退出,同时在RPMS目录和SRPMS目录中将生成对应的RPM包。
#rpmbuild -ba SPECS/hellorpm.spec
以上参考:https://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-cn#.E6.A8.A1.E6.9D.BF.E5.92.8C.E5.AE.9E.E4.BE.8B
http://segmentfault.com/a/1190000002539129