关于RPM spec文件中%{arm}预定义变量的技术咨询
关于RPM Spec中%{arm}预定义变量的详解
你猜的没错!%{arm}是RPM构建系统内置的预定义架构宏(变量),完全不需要用户手动定义就能直接在spec文件中使用,和你自己用%global shared 0定义的自定义变量不是一个类型。下面给你拆解清楚:
1. 预定义架构宏的本质
RPM工具(rpmbuild)会根据当前构建环境的CPU架构,或者你通过--target参数指定的目标架构,预先内置了一系列对应不同硬件架构的宏。这些宏的作用就是帮你在spec文件中快速做架构专属的条件分支处理,比如只在ARM架构下应用特定补丁、添加专属编译参数,或者调整打包内容。
2. 怎么验证/查看这些预定义宏
如果你想确认某个架构宏的存在或者它的取值,可以用rpm --eval命令直接展开变量:
# 查看%{arm}的取值,如果当前是ARM架构环境,会输出arm;非ARM环境则输出空 rpm --eval '%{arm}' # 查看64位ARM架构宏%{aarch64}的取值 rpm --eval '%{aarch64}'
如果想一次性查看RPM所有的预定义宏(包括架构相关和其他全局宏),可以执行:
rpm --showrc
你可以用grep过滤出架构相关的宏:
rpm --showrc | grep -E '^-.*arch'
3. 常见的预定义架构宏例子
除了%{arm},日常打包中常用的还有这些:
%{x86_64}:64位x86架构(也就是常说的AMD64)%{i386}:32位x86架构%{aarch64}:64位ARM架构(ARM64)%{ppc64le}:小端模式的64位PowerPC架构%{s390x}:IBM z系列64位架构
4. 实际用法场景
比如你要给ARM架构单独打补丁,就可以在spec里这么写:
%ifarch %{arm} %{aarch64} # 只在ARM/ARM64架构下应用这个补丁 Patch100: arm-specific-fix.patch %endif
或者针对不同架构设置不同的编译参数:
%ifarch %{arm} CFLAGS="%{optflags} -march=armv7-a" %endif
这些预定义宏是RPM打包体系中用来适配多架构的核心工具之一,不用自己去手动判断架构,直接用这些内置宏就够省心啦。
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

