关于不同RPM版本中rpmbuild读取rcfile行为差异的技术咨询
RPM版本间rcfile与宏加载行为差异的原因及解决方案
我来帮你拆解这个问题——你遇到的差异其实是RPM项目在版本迭代中对配置加载逻辑做了明确调整导致的,具体细节如下:
1. 核心原因:RPM配置机制的版本变更
在RPM 4.4.2.3(SLES-15)这类旧版本中,rpmrc文件支持macrofiles指令,用来指定额外的宏文件路径。当你用--rcfile指定自定义rpmrc时,程序会解析这个指令并自动加载对应的rpmmacros文件,所以能正确识别%_name并输出"Rakesh"。
但从RPM 4.11开始(包括你测试的4.14.3版本),RPM团队重构了配置加载流程,废弃了rpmrc中的macrofiles指令。这意味着新版本的rpmbuild会直接忽略你rpmrc里的这条配置,自然不会加载你指定的rpmmacros文件,所以执行--eval %_name时,程序找不到这个宏的定义,只能原样输出%_name。
2. 新版本加载自定义宏的正确方式
如果你要在RPM 4.11/4.14.3中加载自定义宏文件,有两种可靠的方法:
- 直接用
--macros参数指定宏文件:rpmbuild --macros /home/rmehta/rpmtest/rpmmacros --eval %_name - 把宏文件放到默认加载路径:将你的rpmmacros文件复制到用户家目录下的
~/.rpmmacros,rpmbuild会自动加载这个路径下的宏定义,无需额外参数。
补充说明
这种变更其实是RPM为了让配置逻辑更清晰、更可控——旧的macrofiles指令把rpmrc(程序基础配置)和宏文件(构建自定义规则)的加载绑定在一起,容易导致配置混乱;新版本用--macros明确区分两类配置的加载入口,逻辑更直观。
内容的提问来源于stack exchange,提问作者Rakesh Mehta




