Ubuntu20.04下Braiins OS源码多方式构建失败求助
目前无法从源码构建Braiins OS。先后尝试了运行bb.py、遵循官方Docker构建指南操作、使用cargo编译bosminer、在firmware_latest和bos_release分支直接调用LEDE Makefile四种方式,所有方法均执行失败,出现的错误与异常信息如下:
1. 运行Docker构建器
参考操作指南为官方提供的构建文档
执行的命令
cd braiins/braiins-os./docker/build-docker-container.sh./docker/build-in-docker.sh zynq-am1-s9
错误与异常信息
INFO:root:Preparing LEDE build system... -- prepare:default_config . prepare:config scripts/config/conf: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.27' not found (required by scripts/config/conf) /src/braiins-os/build/zynq/lede/include/toplevel.mk:114: recipe for target 'defconfig' failed make: *** [defconfig] Error 1 TaskError - taskid:prepare:config PythonAction Error Traceback (most recent call last): File "/home/build/.local/lib/python3.5/site-packages/doit/action.py", line 424, in execute returned_value = self.py_callable(*self.args, **kwargs) File "/src/braiins-os/builder/dodo.py", line 50, in <lambda> task.update({'actions': [lambda: next(generator, None)]}) File "/src/braiins-os/builder/builder.py", line 1020, in prepare_config_doit self._run('make', 'defconfig') File "/src/braiins-os/builder/builder.py", line 565, in _run process = subprocess.run(args, input=input, stdout=stdout, check=True, cwd=cwd, env=env, preexec_fn=init) File "/usr/lib/python3.5/subprocess.py", line 398, in run output=stdout, stderr=stderr) subprocess.CalledProcessError: Command '('make', 'defconfig')' returned non-zero exit status 2
INFO:root:Preparing LEDE build system.. . prepare:config scripts/config/conf: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.27' not found (required by scripts/config/conf) /src/braiins-os/build/zynq/lede/include/toplevel.mk:114: recipe for target 'defconfig' failed make: *** [defconfig] Error 1 TaskError - taskid:prepare:config PythonAction Error Traceback (most recent call last): File "/home/build/.local/lib/python3.5/site-packages/doit/action.py", line 424, in execute returned_value = self.py_callable(*self.args, **kwargs) File "/src/braiins-os/builder/dodo.py", line 50, in <lambda> task.update({'actions': [lambda: next(generator, None)]}) File "/src/braiins-os/builder/builder.py", line 1020, in prepare_config_doit self._run('make', 'defconfig') File "/src/braiins-os/builder/builder.py", line 565, in _run process = subprocess.run(args, input=input, stdout=stdout, check=True, cwd=cwd, env=env, preexec_fn=init) File "/usr/lib/python3.5/subprocess.py", line 398, in run output=stdout, stderr=stderr) subprocess.CalledProcessError: Command '('make', 'defconfig')' returned non-zero exit status 2
INFO:root:Start cleaning LEDE build directory...' scripts/config/mconf: error while loading shared libraries: libncursesw.so.6: cannot open shared object file: No such file or directory /src/braiins-os/build/zynq/lede/include/toplevel.mk:127: recipe for target 'menuconfig' failed make[1]: *** [menuconfig] Error 127 make[1]: Leaving directory '/src/braiins-os/build/zynq/lede' /src/braiins-os/build/zynq/lede/include/toplevel.mk:94: recipe for target '.config' failed make: *** [.config] Error 2 Traceback (most recent call last): File "./bb.py", line 370, in <module> main(sys.argv[1:]) File "./bb.py", line 364, in main args.func() File "./bb.py", line 119, in clean builder.clean(purge=self._args.purge) File "/src/braiins-os/builder/builder.py", line 1109, in clean self._run('make', 'clean') File "/src/braiins-os/builder/builder.py", line 565, in _run process = subprocess.run(args, input=input, stdout=stdout, check=True, cwd=cwd, env=env, preexec_fn=init) File "/usr/lib/python3.5/subprocess.py", line 398, in run output=stdout, stderr=stderr) subprocess.CalledProcessError: Command '('make', 'clean')' returned non-zero exit status 2
为简化日志内容,已移除执行成功的步骤,如有需要可提供完整日志。
已尝试的解决步骤
- 安装了
lib32z1与libncurses5依赖,未解决问题
2. 运行bb.py构建
添加日志参数开启调试模式后,发现bb.py会调用位于zynq/lede路径下存在问题的Makefile。
执行的命令
python3.5 bb.py --log debug build
错误与异常信息
DEBUG:root:Run 'make defconfig' in '/home/max/rust/braiins/braiins-os/build/zynq/lede' # # configuration written to .config # -- prepare:public_key -- prepare:secret_key INFO:root:Start building LEDE...' DEBUG:root:Run 'make -j4' in '/home/max/rust/braiins/braiins-os/build/zynq/lede' make[1] world make[2] tools/install make[2] package/cleanup make[3] -C tools/flock compile make[3] -C tools/flock install make[3] -C tools/sed compile make[3] -C tools/sed install make[3] -C tools/xz compile make[3] -C tools/patch compile make[3] -C tools/tar compile make[3] -C tools/xz install make[3] -C tools/patch install make[3] -C tools/tar install make[3] -C tools/m4 compile make[3] -C tools/expat compile make[3] -C tools/pkg-config compile make[3] -C tools/sstrip compile make[3] -C tools/make-ext4fs compile make[3] -C tools/patch-image compile make[3] -C tools/scons compile make[3] -C tools/mtools compile make[3] -C tools/lzma compile make[3] -C tools/squashfs4 compile make[3] -C tools/pkg-config install make[3] -C tools/expat install make[3] -C tools/sstrip install make[3] -C tools/make-ext4fs install make -r world: build failed. Please re-run make with -j1 V=s to see what's going on make: *** [/home/max/rust/braiins/braiins-os/build/zynq/lede/include/toplevel.mk:200: world] Error 1 Traceback (most recent call last): File "bb.py", line 370, in <module> main(sys.argv[1:]) File "bb.py", line 364, in main args.func() File "bb.py", line 139, in build builder.build(targets=self._args.target) File "/home/max/rust/braiins/braiins-os/builder/builder.py", line 1159, in build self._run(args, path=path, init=partial(os.umask, 0o0022)) File "/home/max/rust/braiins/braiins-os/builder/builder.py", line 565, in _run process = subprocess.run(args, input=input, stdout=stdout, check=True, cwd=cwd, env=env, preexec_fn=init) File "/home/max/.anaconda3/envs/bos/lib/python3.5/subprocess.py", line 398, in run output=stdout, stderr=stderr) subprocess.CalledProcessError: Command '['make', '-j4']' returned non-zero exit status 2
3. 手动调用LEDE Makefile
通过bb.py的--log debug参数确认braiins/braiins-os/build/zynq/lede路径下的Makefile执行异常,因此手动执行该Makefile查看详细日志。
执行的命令
cd braiins/braiins-os/build/zynq/ledemake -j1 V=s
错误与异常信息
freadahead.c: In function 'freadahead': freadahead.c:91:3: error: #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib." 91 | #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib." | ^~~~~ make[7]: *** [Makefile:1837: freadahead.o] Error 1 make[7]: Leaving directory '/home/max/rust/braiins/braiins-os/build/zynq/lede/build_dir/host/m4-1.4.17/lib' make[6]: *** [Makefile:1602: all] Error 2 make[6]: Leaving directory '/home/max/rust/braiins/braiins-os/build/zynq/lede/build_dir/host/m4-1.4.17/lib' make[5]: *** [Makefile:1506: all-recursive] Error 1 make[5]: Leaving directory '/home/max/rust/braiins/braiins-os/build/zynq/lede/build_dir/host/m4-1.4.17' make[4]: *** [Makefile:1461: all] Error 2 make[4]: Leaving directory '/home/max/rust/braiins/braiins-os/build/zynq/lede/build_dir/host/m4-1.4.17' make[3]: *** [Makefile:29: /home/max/rust/braiins/braiins-os/build/zynq/lede/build_dir/host/m4-1.4.17/.built] Error 2 make[3]: Leaving directory '/home/max/rust/braiins/braiins-os/build/zynq/lede/tools/m4' make[2]: *** [tools/Makefile:148: tools/m4/compile] Error 2 make[2]: Leaving directory '/home/max/rust/braiins/braiins-os/build/zynq/lede' make[1]: *** [tools/Makefile:145: /home/max/rust/braiins/braiins-os/build/zynq/lede/staging_dir/target-arm_cortex-a9+neon_musl-1.1.16_eabi/stamp/.tools_install_yynyyyyynyyyyynyynnyyyynyyyyyyyyyyyyyyynyynynnyyynnny] Error 2 make[1]: Leaving directory '/home/max/rust/braiins/braiins-os/build/zynq/lede' make: *** [/home/max/rust/braiins/braiins-os/build/zynq/lede/include/toplevel.mk:200: world] Error 2
已尝试的解决步骤
- 安装了
m4尝试解决freadahead.c报错,未生效
4. 使用cargo构建Rust组件
不指定编译目标时,Rust代码可在本地机器正常编译,但指定目标为arm-unknown-linux-musleabi时编译完全失败。
执行的命令
- 下载了
arm-linux-musleabihf-cross交叉编译工具链 CC=/home/max/Downloads/arm-linux-musleabihf-cross/bin/arm-linux-musleabihf-gcc cargo build --release --target arm-unknown-linux-musleabi
错误与异常信息
error: linker `arm-openwrt-linux-muslgnueabi-gcc` not found | = note: No such file or directory (os error 2) error: could not compile `bosminer-erupter` due to previous error warning: build failed, waiting for other jobs to finish... error: build failed
运行环境
- OS: Ubuntu 20.04.3 LTS
- cargo: cargo 1.60.0 (d1fd9fe 2022-03-01)
- rustup: rustup 1.24.3 (ce5817a94 2021-05-31)
- python: Python 3.5.6 :: Anaconda, Inc.
所有报错归因为三个核心问题:官方Docker镜像版本过旧与新宿主系统不兼容、LEDE内置源码版本与高版本GCC不兼容、Rust交叉编译链接器配置不匹配,按以下步骤操作即可全部解决:
修复Docker构建依赖问题
官方默认构建脚本生成的镜像基于低版本Ubuntu,缺少GLIBC_2.27和libncursesw6依赖,直接修改Docker配置即可:
- 打开
docker/Dockerfile,将基础镜像替换为ubuntu:20.04 - 在依赖安装列表中添加
libc6、libncursesw6两个包,保留原有python3.5、编译工具链等依赖 - 重新构建Docker镜像后再执行容器内构建脚本,即可解决GLIBC版本不匹配、libncursesw.so.6缺失的报错
修复本地LEDE编译的m4报错
freadahead.c报错是因为LEDE内置的m4 1.4.17版本与GCC 9及以上版本不兼容,安装系统级m4无法解决该问题,需要替换LEDE编译链使用的m4版本:
- 进入
braiins/braiins-os/build/zynq/lede/tools/m4目录 - 修改目录下的Makefile,将
PKG_VERSION字段值从1.4.17改为1.4.19,同步更新PKG_HASH为m4 1.4.19版本对应的官方校验值 - 删除
build_dir/host目录下残留的m4-1.4.17旧源码目录,重新执行编译即可跳过该报错
注意:本地编译不要使用Anaconda虚拟环境,Anaconda自带的旧版GLIBC会干扰LEDE构建工具链的运行,切换到系统原生Python 3.5环境执行bb.py即可
修复Rust交叉编译链接器报错
该报错是因为cargo的目标架构配置默认查找OpenWrt命名规则的交叉编译器,和已下载的musl工具链命名不匹配,不需要额外找对应名称的编译器,直接修改cargo配置即可:
- 在项目根目录新建
.cargo/config.toml文件 - 在文件中添加以下配置,将链接器路径替换为本地实际的工具链gcc路径:
[target.arm-unknown-linux-musleabi] linker = "/home/max/Downloads/arm-linux-musleabihf-cross/bin/arm-linux-musleabihf-gcc"
- 保存配置后重新执行cargo构建命令即可正常编译。
内容的提问来源于stack exchange,提问作者Navid

