Ubuntu20下rpmbuild构建RPM报cannot create regular file错误
问题根因
核心故障是Windows风格换行符(CRLF,即\r回车符,对应ASCII八进制码015)污染了打包配置或源文件,属于Linux下非常典型的跨系统编辑文件引发的隐形字符问题:
- 报错路径末尾的
$'\r'、目录结构中BUILDROOT路径下出现的异常目录名alascript\015都是直接证据 - 如果是在Windows系统下编辑spec文件、脚本/配置后传到Linux,或是编辑器默认开启了Windows换行格式,文件每行末尾会比Linux标准的LF换行多一个
\r字符,Linux的shell会把这个隐形字符当成路径、命令的正常组成部分 - spec文件%install段的第一行创建目录命令末尾带
\r,导致实际创建的目录不是预期的/etc/alascript,而是名字末尾带隐形\r的异常目录,后续install命令写文件时路径匹配不上,就会抛出无此文件/目录的错误。
修复步骤
- 先清理之前构建生成的异常缓存,避免错误生成的带特殊字符的目录干扰后续构建:
rm -rf ~/rpmbuild/BUILD/* ~/rpmbuild/BUILDROOT/*
- 安装换行符转换工具,把所有打包相关文件全部转为Linux标准的LF换行格式:
apt update && apt install -y dos2unix # 转换spec文件 dos2unix ~/rpmbuild/SPECS/alascript.spec # 转换所有源码文件,重新打压缩包 cd ~/rpmbuild/SOURCES/alascript-1 dos2unix ./* cd .. rm -f alascript-1.0.tar.gz tar -zcf alascript-1.0.tar.gz alascript-1
- 重新执行构建命令即可正常完成打包:
rpmbuild -ba ~/rpmbuild/SPECS/alascript.spec
后续避坑提示
- 之后编辑spec、shell脚本、Linux侧配置文件时,把编辑器的换行格式设置为Unix/Linux(LF)模式,不要用Windows默认的CRLF换行,这类隐形字符导致的报错没有明显规律,排查成本很高
- 当前spec里的
Group字段属于旧版RPM规范的要求,新版RPM构建已经不需要强制填写该字段,留空或者删掉都不影响打包结果。
内容的提问来源于stack exchange,提问作者Ujjawal Pandey
相关产品推荐
相关产品推荐

