SPEC 基础知识
SPEC 基础知识
写 RPM 包的核心,不是命令多复杂,而是把“构建过程”和“最终安装内容”写清楚。
这篇文章以 rpmbuild 为主线,整理一份可直接落地的 SPEC 入门指南。
1. SPEC 文件是什么
SPEC 是 RPM 的打包脚本与元数据描述文件。
它决定了:
- 包叫什么、版本是多少。
- 构建时需要什么依赖。
- 代码如何编译、安装到临时目录。
- 最终哪些文件进 RPM 包。
可以理解成:元信息 + 构建脚本 + 打包清单。
2. 最小可用 SPEC 模板
1 | Name: hello |
如果你刚接触 SPEC,先把这个模板跑通,再做高级改造。
3. 头部字段(Header)
常见核心字段:
Name:包名。Version:上游软件版本。Release:打包发布号(同一版本改 SPEC 通常加这个)。Summary:一句话描述。License:许可证。Source0:源码包。BuildRequires:构建依赖。Requires:运行依赖。
说明:
Version与Release组合决定升级比较顺序。Release常用1%{?dist},便于不同发行版区分。
4. 各阶段脚本做什么
4.1. %prep
准备源码,解压、打补丁。
- 现代写法优先
%autosetup。 - 需要补丁时在头部加
Patch0、Patch1,再由%autosetup或%patch应用。
4.2. %build
执行编译,常见是:
./configure/%configuremake %{?_smp_mflags}
%{?_smp_mflags} 通常会展开成 -jN,用于并行编译。
4.3. %install
把产物安装到 虚拟根目录 %{buildroot},不是直接装系统。
典型模式:
1 | %install |
4.4. %files
声明“最终打包进 RPM 的文件”。
注意:
- 这里写的是最终系统路径(如
%{_bindir}/hello)。 %install里必须先把这些文件放进%{buildroot}对应位置。
5. %files 常用标记
%doc:文档文件。%license:许可证文件。%config:配置文件(升级可能覆盖,视场景)。%config(noreplace):配置文件升级时尽量不覆盖本地修改,生成.rpmnew。%dir:声明目录。%attr(mode,user,group):指定权限和属主属组。
一个常见示例:
1 | %files |
6. 脚本钩子(可选)
需要安装/卸载动作时可用:
%pre:安装前。%post:安装后。%preun:卸载前。%postun:卸载后。%posttrans:事务完成后。
示例(systemd 服务):
1 | %post |
没必要时不要加脚本钩子,保持简单。
7. 宏与路径(高频)
常用宏:
%{_bindir}:/usr/bin%{_sbindir}:/usr/sbin%{_libdir}:/usr/lib64(64 位常见)%{_sysconfdir}:/etc%{_unitdir}:systemd unit 目录(发行版相关)%{buildroot}:打包虚拟根%{?_smp_mflags}:并行编译参数
查看宏值:
1 | rpm --eval '%{_bindir}' |
8. BuildRequires 与 Requires 的区别
BuildRequires:只在构建机需要。Requires:用户安装包时需要。
典型误区:
- 把构建工具误写进
Requires。 - 漏掉运行时依赖,导致安装成功但运行失败。
9. 从 0 到 1 的打包流程
1 | # 1) 准备目录(通常是 ~/rpmbuild) |
验证:
1 | rpm -qpi xxx.rpm # 看包头信息 |
10. 常见报错与排查
File not found by glob:%files写了不存在的路径,先检查%install是否真的安装到%{buildroot}。Installed (but unpackaged) file(s) found:有文件进了%{buildroot}但没在%files声明。- 依赖报错:区分是
BuildRequires缺失还是Requires缺失。 - 宏路径不一致:用
rpm --eval先确认宏值,再写路径。
11. 我的建议
- 先保证“能稳定构建 + 文件列表准确”,再做宏优化。
%install和%files要一一对应,这是 SPEC 最容易踩坑的地方。- 先写最小模板跑通,再逐步引入
%config、脚本钩子和子包拆分。
当你能稳定回答“这个文件为什么会进包、为什么会装到这个目录”,SPEC 就算入门了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 因受!
评论