RPM包使用
1、宏定义文件
1.1、内置宏
/etc/rpm/macros
/etc/rpm/macros.d/
其它可能位置
/usr/lib/rpm/macros
/usr/lib/rpm/redhat/macros
1.2、用户的宏
~/.rpmmacros
1.3、spec文件中定义的宏
1.4、执行rpmbuild时通过--define
传入的宏
以上宏的覆盖顺序反过来,即1.4 > 1.3 > 1.2 > 1.1
2、宏语法
https://rpm-software-management.github.io/rpm/manual/macros.html
查看宏:
rpmbuild --showrc | grep macrofile
3、spec文件编写常用指令
文档编写官方文档
https://rpm-software-management.github.io/rpm/manual/spec.html
3.1 %prep --bp
%setup (解压、设定环境、cd切换目录)
3.2 %build --bc
./configure
make %{?_smp_mflags}
3.3 %install --bi
%{__make} install DESTDIR="%{buildroot}"
make install
%{__install}
3.4 其它在RPM包安装卸载时的指令(宏脚本)
在宏脚本中,$1变量的使用
值 | 含义 |
---|---|
- | 初次安装 |
--ugrade | 包升级 |
--erase | 卸载 |
--reinstall | 重新安装 |
--verify | 验证 |
指令 | 功能 |
---|---|
%pre | 安装前执行的命令,如创建用户 |
%post | 安装后执行的命令,如更改文件权限 |
%preun | 卸载前执行的命令,如停止程序 |
%postun | 卸载后执行的命令,如删除用户 |
3.4 %check
make check
常为空或不写
3.5 %files
%{buildroot}下的文件 -> RPM包
除了/usr/src下的文件可以不用包含,其余必须全部包含,不能多不能少
可用宏指令 | 说明 | 示例 |
---|---|---|
%defattr(<mode>, <user>, <group>, <dirmode>) | 该指令设置归属和权限的默认值 若后面列举的文件没有声明,则用该值 | %defattr(0644, root, root, 0755) %defattr(-,root,root,-) %defattr(-,root,root) |
%attr(<mode>, <user>, <group>) <file|directory> | 指定目录的权限和归属 | %attr(500,root,root) /usr/tkgup/start.sh |
%ghost | 已删除文件 不复制,但在安装rpm时会删除该文件 | %docdir /usr/tkgup/old_start.sh |
%config(option) | 指定该文件为配置文件 在做升级时,可以考虑是否覆盖 若为noreplace,则升级不覆盖该文件 option: noreplace | missingok | %config(noreplace) %attr(0644, root, root) /usr/tkgup/config |
%dir | 创建该文件夹 不复制其下内容 | %dir /usr/tkgup/app |
%exclude | 文件不放入rpm包 | %exclude /usr/tkgup/tests |
%license | 版权声明文件 | %license LICENSE |
%doc | 默认路径为: /usr/share/doc/<package_name>/ | %doc readme.md |
%docdir | 更改%doc文件的安装路径 | %docdir /usr/tkgup/doc |
%verify(option) | 验证文件的状态 option: all | md5 | size | timestamp等 | %verify(all) /etc/myapp/config.conf |
3.6 %clean
%{__rm} -rf %{buildroot}
3.7 %changelog
注意格式要求
参考:
%changelog
* Wed Jul 17 2024 tangkuigang <tkgup@qq.com> - 14:4.99.4-5
- Type:bugfix
- CVE:NA
- SUG:NA
- DESC:resolve user information residue after RPM package uninstallation, add user checks
* Tue May 07 2024 xinghe <xinghe2@h-partners.com> - 14:4.99.4-4
- Type:bugfix
- CVE:NA
- SUG:NA
- DESC:fix a not defined macro error
4、源RPM包的使用
rpmbuild --rebuild ${rpm_name}.src.rpm
yum-builddep ${rpm_name}.src.rpm
5、构建RPM包的常用调试阶段参数
参数 | 结果 |
---|---|
-bl | 检查buildroot的file包含情况 |
-bp | %prep结束 |
-bc | %build结束 |
-bi | %install结束 |
-bb | 仅二进制格式RPM包 |
-bs | 仅源码格式RPM包 |
-ba | 二进制和源码RPM包 |
6、rpm包下载网站
欧拉首页
欧拉资源
https://repo.openeuler.org/
其它镜像
https://www.openeuler.org/zh/mirror/list/
其它常用网址
https://pkgs.org/
https://rpmfind.net/linux/RPM/index.html
https://koji.fedoraproject.org/koji/index
http://rpm.pbone.net/ (该网站似乎已不可用)
7、SPEC文件编写的其它说明
标签 Name/Version 中不能使用短横线 -
软件包信息必须:Name、Version、Release、Group、Summary、%description
组织信息,必须:License,建议加上:Vendor、URL
Packager: LastName FistName
Requires: a, b>=2.0,perl({模块名})>3.2
Requires(pre): a, b>=2.0,perl({模块名})>3.2
注释中使用%要用两个,即%%
定义宏,不要与关键字、标签重名
%define macro_name macro_value
使用宏
%{macro_name}
%macro_name
如使用buildroot,变量引用:
${RPM_BUILD_ROOT}
$RPM_BUILD_ROOT
%{buildroot}
%buildroot
在使用shell命令时可以引用宏变量
rpmbuild --showrc: 显示宏相关定义
一个下划线: 私有宏 / 内部宏,用于 RPM 系统的内部处理,用户不应覆盖或定义,如 _buildroot
两个下划线:高级内部宏 / 低级宏,用于内部处理某些系统特性,通常与操作系统或架构相关,如 __arch
rpmbuild --showrc | grep macrofiles #关注~/.rpmmacros文件
_topdir: 定义顶级目录
%_topdir /home/tkg/rpmbuild #修改宏的值
8、一个spec打包多个rpm包
增加
%package other_package
Summary: your describe summary
Requires: AAA
Requires: BBB = 5.2.0
%description other_package
your describe
%files other_package
[your files in this pacage]
.....
9、完整spec文档编写参考
https://gitee.com/tkgup/tcpdump/blob/master/tcpdump.spec
10、其它
10.1、install命令
创建目录:-d 全为路径,并创建 -D 最后一个为目标文件
10.2、查看文件变更情况
#查看文件是否被改过
rpm -qV {RPM}
10.3 制作补丁文件
#可以为路径
diff -Naur original_file new_file > patch_file
10.4 执行命令构建rpm包
rpmbuild --nodeps --target aarch64 --define '__your_shell_macro exit 0' '--define=yourmacro /usr/tkgup' tkg_app.spec -ba