Ubuntu20.04下用scons0.98.1+Python2.7编译旧版gem5(stt/sdo/invisispec)失败如何解决
旧版本gem5编译报错解决方案
报错根因分析
- 最初的SyntaxError本质是scons执行时默认调用了Ubuntu20.04系统自带的Python3解释器,旧版gem5的构建脚本完全基于Python2语法开发,Python3不兼容
except xx, e、无括号print等Python2特有语法,因此出现批量语法报错。 NameError: name 'EnsureSConsVersion' is not defined报错的原因是你安装的scons 0.98.1没有被当前执行环境正确加载,要么是scons启动时调用了其他版本的scons依赖库,要么是该版本scons没有默认导入对应API模块。
具体解决方案
第一步:强制指定Python2解释器执行scons
不需要修改大量语法文件,直接显式指定解释器即可解决Python版本混用问题,编译命令替换为:python2.7 /usr/bin/scons build/X86/gem5.opt -j5
如果你的scons安装在/usr/local/bin路径下,把路径替换为/usr/local/bin/scons即可
第二步:修复EnsureSConsVersion未定义问题
如果执行第一步后仍然报该错误,直接修改./site_scons/site_init.py文件即可:
- 在文件最开头添加导入语句:
from SCons.Script import EnsureSConsVersion
- 如果添加导入后仍报错,说明你安装的scons 0.98.1本身不自带该API,可以直接注释掉第49行的
EnsureSConsVersion(0, 98)语句,你已经手动确认过当前scons版本符合要求,跳过版本检查不会影响后续编译流程。
第三步:后续兼容处理
如果后续仍零散出现Python2/3语法报错,不需要逐个修改构建脚本,执行编译前临时将系统默认python软链接指向Python2.7即可:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --set python /usr/bin/python2.7
编译完成后可以切回Python3避免影响系统其他功能:
sudo update-alternatives --set python /usr/bin/python3
兜底方案
如果上述修改后仍存在大量依赖冲突,可以直接拉取Ubuntu 18.04镜像在容器内编译,Ubuntu18.04默认自带Python2.7和兼容的旧版scons,不需要手动修改环境配置,编译成功率更高。
内容的提问来源于stack exchange,提问作者yuanting
相关产品推荐
相关产品推荐

