因需要在树莓派(及其其他各类派)下使用 akshare,但 akshare 的依赖库 PyMiniRacer 缺少 arm64 架构的包(该包已经不再维护),故在此记录下在 linux arm64 架构下编译 PyMiniRacer 的过程。有需要者可以参考,也可以从下面的链接直接下载已经编译好的 PyMiniRacer arm64 包(注:仅在 ubuntu 20.04 和 Ubuntu 22.04 下验证过):
编译前准备
编译前需要安装 clang llvm lld
注:ubuntu 22.04 下,可以直接使用 apt 安装 (sudo apt install clang llvm lld);但在 ubuntu 20.04 下,无法直接使用 apt 安装 clang,请自行百度搜索如何安装。
如果未安装 llvm 和 lld,在后续编译过程中会出现如下的错误:
usr/bin/llvm-ar: not found
FAILED: obj/third_party/zlib/libchrome_zlib.a
rm -f obj/third_party/zlib/libchrome_zlib.a && "../../../../../../../usr/bin/llvm-ar" -T -r -c -s -D obj/third_party/zlib/libchrome_zlib.a @"obj/third_party/zlib/libchrome_zlib.a.rsp"
/bin/sh: 1: ../../../../../../../usr/bin/llvm-ar: not found
clang: error: invalid linker name in argument '-fuse-ld=lld'
安装 generate-ninja 和 ninja
- ubuntu 22.04 下可以直接使用 sudo apt install gn 命令,直接安装 generate-ninja
- ubuntu 20.04 需参考 generate-ninja 项目(https://github.com/o-lim/generate-ninja)自行编译,编译后,请将相应路径加入环境变量 PATH 中。
- ninja 可参考(https://github.com/ninja-build/ninja)自行编译,同样需要加入加入环境变量 PATH 中
下载 PyMinRacer 源代码并作相应修改
源码地址: https://github.com/sqreen/PyMiniRacer.git
修改 helper/v8_build.py
修改第32行,保证系统的 PATH 在 depot_tools 之前,以便能够正确调用系统的 gn
按下图所示,注释掉第 136、150 行,添加右侧所示第 155、156 行
- 第 156 行添加:”clang_base_path”: “\”/usr\””,
- 第 157 行添加:”treat_warnings_as_errors”: “false”,
注释掉如下图所示第 299、300 行
修改 helper/build_package.py
修改第 36 行 “manylinux1_x86_64” 改为 “linux_aarch64″,如下图所示:
设置环境变量
export VPYTHON_BYPASS=”manually managed python not supported by chrome operations”
开始编译
进入 PyMiniRacer 目录下,执行如下命令
python helper/v8_build.py
然后慢慢等 。。。(请确保自己能访问 google 相关网站,下载 chrome v8 源码)
编译过程中的错误处理
错误1
ERROR at //testing/gmock/BUILD.gn:11:1: Dependency not allowed.
source_set("gmock") {
^--------------------
The item //testing/gmock:gmock
can not depend on //third_party/googletest:gtest_config
because it is not in //third_party/googletest:gtest_config's visibility list: [
//third_party/googletest:*
]
该错误需要修改 py_mini_racer/extension/v8/third_party/googletest/BUILD.gn 文件,见下图中第 6 行,需要将 "visibility = [ ":" ]" 改为 "visibility = [ "" ]" 即可。由于该文件是在编译中会自动生成变更,所以需要在改文件变回 "visibility = [ ":" ]" 时,立刻将其改为"visibility = [ "" ]",以免影响后续编译。
错误2
ImportError: cannot import name ‘Mapping’ from ‘collections’ (/usr/lib/python3.10/collections/init.py)
上述错误,可参考 https://blog.csdn.net/NJU_Mf/article/details/128539786 修改 collections,引出 Map
错误3
../v8/src/compiler/branch-elimination.cc:266:7: error: use of bitwise '|' with boolean operands [-Werror,-Wbitwise-instead-of-logical]
if (reduced_.Set(node, true) | node_conditions_.Set(node, conditions)) {
^~~~~~~~~~~~~~~~~
||
../v8/src/compiler/branch-elimination.cc:266:7: note: cast one or both operands to int to silence this warning
1 error generated.
该错误可以在相关代码前屏蔽告警:
#ifdef GNUC
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wbitwise-instead-of-logical"
#endif