1、准备环境
首先请准备一个Linux环境。
RPM打包使用的是rpmbuild命令,这个命令来自rpm-build包,这个是必装的。
yum install rpm-build -y
当然也可以直接安装rpmdevtools,这个工具还包含一些其他的工具,同时它依赖rpm-build,所以直接安装的话会同时把rpm-build装上。
yum install rpmdevtools -y
当然,根据不同的软件构建过程,还需要其他的编译打包工具,比如C语言的make、gcc,python的setuptools等,根据需要安装即可。
2、生成工作空间
RPM打包的时候需要编译源码,需要把编译好的配置文件、二进制命令文件之类的东西按照安装好的样子放到合适的位置,还要根据需要对RPM的包进行测试,这些都需要先有一个“工作空间”。rpmbuild命令使用一套标准化的“工作空间”:
rpmdev-setuptree
3、编辑SPEC文件
# 自定义宏
%define bindir /opt/jdbc
# 1.信息定义阶段
# 软件名字,要与spec的文件名一致
Name: jdbc4postgresql
# 软件主版本号
Version: 1.0
# 发行编号,每打包一次值递增,主版本号发布新版后需重置该值
Release: 1%{?dist}
# 一行简短的软件简介,结尾不要加标点
Summary: my first
# 软件许可
License: GPL
# 软件项目主页
# URL: http://git.intra.weibo.com/openapi_rd/motan-go/
# 放置在SOUIRCES目录的软件源码包名,可以指定多个:source1、source2等
Source0: %{name}-%{version}.jar
# 安装软件包时所需的依赖包列表,可以指定版本如 bash >= 1.1.1
# Requires: pcre-devel,openssl-devel
# 程序的详细多行描述,每行必须小于等于 80 个字符,空行表示开始新段
%description
# 2.准备阶段
%prep
# 3. 编译阶段
%build
# 4.安装阶段
%install
# 删除之前的残留文件
rm -rf %{buildroot}
mkdir -p %{buildroot}
rpm_app_dir=%{buildroot}/%{bindir}
mkdir -p $rpm_app_dir
cp -r %{_topdir}/SOURCES/* $rpm_app_dir
# rpm安装前执行的脚本
%pre
# rpm安装后执行的脚本
%post
# 卸载前执行的脚本
%preun
# 卸载后执行的脚本
%postun
# 5.清理阶段
%clean
# 删除buildroot目录
# rm -rf %{buildroot}
# 6.文件设置阶段
%files
#要打包的文件和目录,在执行完rpmbuild -bi后,参考%{rootbuild}下生成的文件和目录
%{bindir}/%{name}-%{version}.jar
# 变更日志 格式固定,生成请用命令: rpmdev-bumpspec --comment=COMMENT --userstring=NAME+EMAIL_STRING SPECFILES
%changelog
4、开始打RPM包
将需要打包的 jar 包放到工作空间目录/rpmbuild/SOURCES 下,SPEC文件放到工作空间目录 /rpmbuild/SPECS 下。执行命令:
rpmbuild -ba jdbc4postgresql.spec
rpmbuild命令会根据spec文件来生成rpm包,主要用到以下几个参数
rpmbuild --help
-bp 执行到%prep阶段结束
-bc 执行到%build阶段结束
-bi 执行到%install阶段结束
-bl 检测%files文件是否有丢失
-ba 创建src.rpm和二进制包
-bs 只创建src.rpm源码包
-bb 只创建二进制rpm包
打包好的 RPM包
5、原理
rpmbuild 命令有一套标准化的“工作空间”
rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
各目录的具体作用:
默认位置 | 默认位置 | 名称 | 名称 |
---|---|---|---|
~/rpmbuild/SPECS | %_specdir | Spec 文件目录 | 保存 RPM 包配置(.spec)文件 |
~/rpmbuild/SOURCES | %_sourcedir | 源代码目录 | 保存源码包(如 .tar 包)和所有 patch 补丁 |
~/rpmbuild/BUILD | %_builddir | 构建目录 | 源码包被解压至此,并在该目录的子目录完成编译 |
~/rpmbuild/BUILDROOT | %_buildrootdir | 最终安装目录 | 保存 %install 阶段安装的文件 |
~/rpmbuild/RPMS | %_rpmdir | 标准 RPM 包目录 | 生成/保存二进制 RPM 包 |
~/rpmbuild/SRPMS | %_srcrpmdir | 源代码 RPM 包目录 | 生成/保存源码 RPM 包(SRPM) |
具体执行步骤:
- SPECS下是RPM包的配置文件,它会告诉rpmbuild命令如何去打包。
- 需要将源码放到%_sourcedir中。
- 进行编译,编译的过程是在%_builddir中完成的,所以会将源码复制到此目录下。
- 进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件等)复制到%_buildrootdir中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;
- 配置一些必要的操作,比如安装前的准备,安装后的卸载。
- 可选操作,检查软件是否正常运行。
- 最后,生成的RPM包放置到%_rpmdir,源码包放置到%_srpmdir下。
以上这些步骤都是配置在SPEC文件中的,详情:
阶段 | 读取的目录 | 写入的目录 | 具体操作 |
---|---|---|---|
%prep | %_sourcedir | %_builddir | 读取位于 %_sourcedir 目录的源代码和 patch ,解压源代码至 %_builddir 的子目录并应用所有 patch。 |
%build | %_builddir | %_builddir | 编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。 |
%install | %_builddir | %_buildrootdir | 读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。通过执行类似 make install 的命令实现。 |
%check | %_builddir | %_builddir | 检查软件是否正常运行。通过执行类似 make test 的命令实现。很多软件包都不需要此步。 |
bin | %_buildrootdir | %_rpmdir | 读取位于 %_buildrootdir 最终安装目录下的文件,以便最终在 %_rpmdir 目录下创建 RPM 包。在该目录下,不同架构的 RPM 包会分别保存至不同子目录, noarch 目录保存适用于所有架构的 RPM 包。这些 RPM 文件就是用户最终安装的 RPM 包。 |
src | %_sourcedir | %_srcrpmdir | 创建源码 RPM 包(简称 SRPM,以.src.rpm 作为后缀名),并保存至 %_srcrpmdir 目录。SRPM 包通常用于审核和升级软件包。 |