RPM软件包编译

spec文件解析

关键字

Name: 软件包的名称,在后面的变量中即可使用%{name}的方式引用
Summary: 软件包的内容
Version: 软件的实际版本号,例如:1.12.1等,后面可使用%{version}引用
Release: 发布序列号,例如:1%{?dist},标明第几次打包,后面可使用%{release}引用
Group: 软件分组,建议使用:Applications/System
License: 软件授权方式GPLv2
Source: 源码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
BuildRoot: 这个是安装或编译时使用的临时目录,即模拟安装完以后生成的文件目录:%_topdir/BUILDROOT 后面可使用$RPM_BUILD_ROOT 方式引用。
URL: 软件的URI
Vendor: 打包组织或者人员
Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:
libxxx-devel >= 1.1.1 openssl-devel 。 注意:“>=”号两边需用空格隔开,而不同软件名称也用空格分开
BuildRequires: 该rpm包编译时所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本。

rpm处理spec文件的几个阶段

%prep: 预备参数,软件包编译前的准备阶段,通常将软件包解压、打补丁的步骤放在这个阶段

常用参数:
%setup -n%{name}-April2003Rel 如果 tar 打包中的目录不是这样命名的,可以用 -n 选项来指定要切换到的目录
%setup -nnewdir---------将压缩的软件源程序在newdir目录下解开。
%setup -c---------------在解开源程序之前先创建目录。
%setup -bnum------------在包含多个源程序时,将第num个源程序解压缩。
%setup -T----------------不使用缺省的解压缩操作。
Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
%patch -p1 -b xxx 生成备份文件

%build: 编译参数 ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx/……
%install: 安装步骤,此时需要指定安装路径,创建编译时自动生成目录,复制配置文件至所对应的目录中。
%pre: 安装前需要做的任务。
%post: 安装后需要做的任务。
%post %{name} 指定包名软件包安装后执行的操作
%preun: 卸载前需要做的任务
%postun: 卸载后需要做的任务
%clean: 清除上次编译生成的临时文件,就是上文提到的虚拟目录
%files: 设置文件属性,包含编译文件需要生成的目录、文件以及分配所对应的权限
%changelog: 修改记录

变量判断

%bcond_with xx
以%if %{with xx} 为判断条件时,默认xx 的开关为0

spec systemd 相关:
%post
%systemd_post xxx.service //安装后触发

%preun
%systemd_preun xxx.service //卸载前触发 disable

%postun
%systemd_postun_with_restart xxx.service //如果升级需要重启
%systemd_postun xxx.service //如果升级不需要重启

%systemd_post()
if [ $1 -eq 1 ] ; then
#Initial installation
systemctl preset %{?*} >/dev/null 2>&1 || : \ #其效果等价于按照预设规则,对列出的单元依次使用 disable 或 enable 命令
fi
%{nil}

%systemd_preun()
if [ $1 -eq 0 ] ; then
#Package removal, not upgrade
systemctl --no-reload disable %{?} > /dev/null 2>&1 || : \ #执行disable即不开机自启动,并且不自动加载配置(.service文件),也就是不自动执行daemon-load命令。
systemctl stop %{?
} > /dev/null 2>&1 || :
fi
%{nil}

#重新加载 systemd 守护进程的配置。
%systemd_postun()
systemctl daemon-reload >/dev/null 2>&1 || : \ #重新加载所有单元文件,即.service文件
%{nil}

#重新启动(先停止再启动)指定的已启动单元。
%systemd_postun_with_restart()
systemctl daemon-reload >/dev/null 2>&1 || :
if [ $1 -ge 1 ] ; then
#Package upgrade, not uninstall
systemctl try-restart %{?*} >/dev/null 2>&1 || : \ #注意,若指定的单元尚未启动,则不做任何操作。
fi
%{nil}

RPM软件包

制作RPM包

工作目录结构

~/rpmbuild
~/rpmbuild/SOURCES //存放源码包
~/rpmbuild/SPEC //存放spec文件
~/rpmbuild/BUILD //编译目录
~/rpmbuild/BUILDROOT
~/rpmbuild/RPMS //生成的二进制文件
~/rpmbuild/SRPMS //生成的源码包

RPMBUILD命令常用参数

rpmbuild -bp xxx //spec文件 build之前的工作
rpmbuild -bb xxx //build
rpmbuild -bi xxx //install
rpmbuild -bs xxx //生成源码包
rpmbuild -ba xxx //生成二进制和源码包

例:
rpmbuild -bp -D “_topdir `pwd`” SPCE/xxx.spec -D "dist .el8"在当前目录执行bp操作并指定spec文件中dist宏的值

RPM命令常用参数

-ivh 安装
-Uvh 升级
-Uvh --force 强制安装
-e 卸载
-qi 显示包信息
-qa 显示包
-qf 显示目录所属包
-q --qf '%{version}' xxx 通过rpm宏的形式 查询软件包相关信息
rpm --eval "%{_datadir}" 查找变量对应的值

spec文件 宏定义文件: /usr/lib/rpm/macros

其他命令

设置自动添加小版本号,以及changelog
rpmdev-bumpspec -c "- Rebuild." -u "test <test@email.com>" SPECS/xxx.spec
解压二进制包到当前目录
rpm2cpio pcs-0.10.4-6.el8.01.x86_64.rpm | cpio -div

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值