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