树莓派下编译 PyMiniRacer

文/fasiondog

因需要在树莓派(及其其他各类派)下使用 akshare,但 akshare 的依赖库 PyMiniRacer 缺少 arm64 架构的包(该包已经不再维护),故在此记录下在 linux arm64 架构下编译 PyMiniRacer 的过程。有需要者可以参考,也可以从下面的链接直接下载已经编译好的 PyMiniRacer arm64 包(注:仅在 ubuntu 20.04 和 Ubuntu 22.04 下验证过):

https://gitee.com/fasiondog/hikyuu_extern_libs/releases/download/1.0.0/py_mini_racer-0.6.0-py3-none-linux_aarch64.whl

编译前准备

编译前需要安装 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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注