AOSP编译失败求助:ssfilter.y语法冲突致ninja构建终止
解决AOSP编译中ssfilter.y的shift/reduce冲突问题
我之前编译老版本AOSP时也碰到过一模一样的问题,核心是external/iproute2/misc/ssfilter.y语法文件存在35个shift/reduce冲突,新版本bison会因为这类冲突直接终止编译(旧版本可能仅弹出警告)。给你几个可行的解决方案:
方案1:使用AOSP预编译的bison工具(最推荐)
AOSP自带了适配项目的构建工具,大概率是你编译时调用了系统自带的bison,而非项目预编译版本。可以通过以下步骤强制切换:
- 先清理之前的构建缓存:
m clean rm -rf out/target/product/generic/obj/EXECUTABLES/ss_intermediates/ - 重新初始化编译环境并指定工具路径:
source build/envsetup.sh lunch aosp_arm-eng export PATH=$(pwd)/prebuilts/build-tools/linux-x86/bin:$PATH m -j$(nproc)
这样会优先使用AOSP预编译的bison,它对项目语法文件兼容性更好,不会因这类冲突报错。
方案2:修改ssfilter.y解决语法冲突
如果你懂Yacc/Bison语法,可以手动修复歧义规则:
编辑external/iproute2/misc/ssfilter.y,在文件开头附近添加优先级声明,比如针对运算符号的优先级:
%left '+' '-' %left '*' '/' # 可根据bison输出的具体冲突详情,针对性调整优先级规则
修改后同样清理缓存再重新编译。
方案3:降低bison的严格性
如果系统bison版本过高,可以通过编译参数忽略冲突:
找到external/iproute2/misc/Android.mk中ssfilter的编译规则,将bison命令修改为:
prebuilts/build-tools/linux-x86/bin/bison -d --defines=out/target/product/generic/obj/EXECUTABLES/ss_intermediates/ssfilter.h -o out/target/product/generic/obj/EXECUTABLES/ss_intermediates/ssfilter.c -Wno-conflicts-sr external/iproute2/misc/ssfilter.y
添加-Wno-conflicts-sr参数,禁止shift/reduce冲突的错误提示,让bison继续生成代码。
另外提一句:你看到的android_stubs_current和BOARD_SEPOLICY_VERS警告都是非致命的,不会影响构建完成,不用过度在意。
内容的提问来源于stack exchange,提问作者Stephan John
相关产品推荐
相关产品推荐

