RPM构建DPDK 21.11.1时spec自定义宏已替换但执行失败
故障根因
- 构建工具版本不兼容:DPDK 21.11 最低要求 meson ≥ 0.53、ninja ≥ 1.10,当前环境安装的 meson 0.49.2、ninja 1.8.2 版本远低于最低要求,meson 配置阶段虽然能跑完,但生成的构建规则和老版本 ninja 不匹配,执行编译时直接触发报错。
- RPM 宏展开冲突:自定义的
%meson_build宏和系统rpm-macros-meson包提供的同名公共宏冲突,且宏定义存在递归引用问题,RPM 替换宏时无法正确解析层级,最终生成的 shell 脚本里残留未替换的宏字符串、命令拼接错误,导致 shell 执行失败。 - 宏定义缺失必要逻辑:系统自带的
%meson_build宏默认注入了编译前环境检查、标准编译参数等必要逻辑,直接重写宏后丢失这部分内容,也会导致构建流程异常。
修复方案
- 升级容器内构建工具到满足DPDK要求的版本
# 卸载旧版本 rpm -e --nodeps meson ninja-build # 安装符合版本要求的meson pip3 install meson>=0.53 # 下载ninja 1.10+版本二进制,解压到/bin目录并赋予可执行权限 # 验证版本 meson --version ninja --version - 修正spec文件中的宏定义,不要和系统公共宏重名,避免递归展开问题
%define __ninja /bin/ninja %define __ninja_common_opts -v %{?_smp_mflags} %define my_ninja_build %{__ninja} %{__ninja_common_opts} %define my_meson_build %my_ninja_build -C %{_vpath_builddir} - 按照RPM打包meson项目的规范调整%build段逻辑,不要跳过meson配置步骤
%build # 先执行meson配置,指定安装路径、编译选项 %meson setup %{_vpath_builddir} \ -Dprefix=%{_prefix} \ -Dlibdir=%{_libdir} \ # 不需要的驱动可以直接在此处关闭,避免依赖缺失报错 -Ddisable_drivers=common/mlx5,net/mlx5,crypto/mlx5 # 执行编译 %my_meson_build - 对照meson日志里的缺失依赖列表,按需安装对应开发包启用需要的驱动,不需要的驱动直接在配置阶段关闭即可,不影响核心功能编译。
打包规范提示
- 打包meson类RPM包时,优先使用系统提供的标准meson宏,非必要不要重定义同名公共宏,避免出现宏冲突、参数丢失问题。如果需要自定义编译参数,直接给标准宏传参即可,无需整个重写宏逻辑。
- 编译高版本DPDK前必须先核对官方文档标注的最低构建依赖版本,不要直接用发行版默认源提供的老版本meson、ninja,多数发行版默认源携带的版本都无法满足新版DPDK的构建要求。
- 定义RPM宏时,引用其他宏统一用
%{宏名}的格式明确包裹,不要直接写%宏名,避免宏解析时出现识别错误。
内容的提问来源于stack exchange,提问作者shiv chittora
相关产品推荐
相关产品推荐

