denoland/rusty_v8

Failed to build for `aarch64-linux-android`

secext2022 opened this issue · 13 comments

Build command:

V8_FROM_SOURCE=1 cargo build -vv --release --target aarch64-linux-android

got error:

[v8 0.74.1] The current directory is /home/runner/.cargo/registry/src/index.crates.io-6f17d22bba15001f/v8-0.74.1
[v8 0.74.1] gn gen --root=/home/runner/.cargo/registry/src/index.crates.io-6f17d22bba15001f/v8-0.74.1 /home/runner/work/v8-src/v8-src/target/aarch64-linux-android/release/gn_out
[v8 0.74.1] android/icudtl.dat
[v8 0.74.1] ERROR at //build/android/BUILD.gn:93:17: Could not read file.
[v8 0.74.1]   pydeps_file = "pylib/results/presentation/test_results_presentation.pydeps"
[v8 0.74.1]                 ^------------------------------------------------------------
[v8 0.74.1] I resolved this to "/home/runner/.cargo/registry/src/index.crates.io-6f17d22bba15001f/v8-0.74.1/build/android/pylib/results/presentation/test_results_presentation.pydeps".
[v8 0.74.1] See //build/android/BUILD.gn:92:1: whence it was called.
[v8 0.74.1] python_library("test_result_presentations_py") {
[v8 0.74.1] ^-----------------------------------------------
[v8 0.74.1] See //v8/tools/BUILD.gn:39:19: which caused the file to be included.
[v8 0.74.1]     data_deps = [ "//build/android:test_runner_py" ]
[v8 0.74.1]                   ^-------------------------------
[v8 0.74.1] thread 'main' panicked at 'assertion failed: Command::new(gn()).arg(format!(\"--root={}\",\n                                                dirs.root.display())).arg(format!(\"--script-executable={}\",\n                                            python())).arg(\"gen\").arg(&gn_out_dir).arg(\"--args=\".to_owned()\n                                +\n                                &args).stdout(Stdio::inherit()).stderr(Stdio::inherit()).envs(env::vars()).status().expect(\"Coud not run `gn`\").success()', /home/runner/.cargo/registry/src/index.crates.io-6f17d22bba15001f/v8-0.74.1/build.rs:717:5
[v8 0.74.1] note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
The following warnings were emitted during compilation:

warning: Not using sccache or ccache

error: failed to run custom build command for `v8 v0.74.1`

Caused by:
  process didn't exit successfully: `/home/runner/work/v8-src/v8-src/target/release/build/v8-c037bc55a0f012fb/build-script-build` (exit status: 101)

It seems that some files is missing at build/android/pylib

related issues: #480, #970

To build it, we have to checkout v8 source and copy missing files.
I use this github workflow file to build:

name: CI

on:
  push:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3

    - run: cargo fetch
    # symlink `v8_src` to rusty_v8
    - run: cargo metadata | node get_v8_path.js

    # FIXME: we have to checkout v8 source, because there is missing files in rusty_v8
    #### start checkout v8 source
    - run: git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git --single-branch --depth=1
    - run: export PATH=$(pwd)/depot_tools:$PATH && echo $PATH && mkdir v8

    # https://v8.dev/docs/source-code
    - run: export PATH=$(pwd)/depot_tools:$PATH && cd v8 && gclient
    - run: export PATH=$(pwd)/depot_tools:$PATH && cd v8 && fetch v8

    # https://v8.dev/docs/cross-compile-arm
    - run: echo "target_os = ['android']" >> v8/.gclient
    - run: cat v8/.gclient

    - run: export PATH=$(pwd)/depot_tools:$PATH && cd v8 && gclient sync
    #### done checkout v8 source

    # copy missing files
    - run: cp -rn v8/v8/build/android v8_src/build || true

    # build
    - run: cd v8_src && rustup target add aarch64-linux-android
    - run: cd v8_src && V8_FROM_SOURCE=1 cargo build -vv --release --target aarch64-linux-android

    - uses: actions/upload-artifact@v3
      with:
        name: librusty_v8_release_aarch64-linux-android.a
        path: v8_src/target/aarch64-linux-android/release/gn_out/obj/librusty_v8.a

Build command:

V8_FROM_SOURCE=1 cargo build -vv --release --target aarch64-linux-android

got error:

[v8 0.74.1] The current directory is /home/runner/.cargo/registry/src/index.crates.io-6f17d22bba15001f/v8-0.74.1
[v8 0.74.1] gn gen --root=/home/runner/.cargo/registry/src/index.crates.io-6f17d22bba15001f/v8-0.74.1 /home/runner/work/v8-src/v8-src/target/aarch64-linux-android/release/gn_out
[v8 0.74.1] android/icudtl.dat
[v8 0.74.1] ERROR at //build/android/BUILD.gn:93:17: Could not read file.
[v8 0.74.1]   pydeps_file = "pylib/results/presentation/test_results_presentation.pydeps"
[v8 0.74.1]                 ^------------------------------------------------------------
[v8 0.74.1] I resolved this to "/home/runner/.cargo/registry/src/index.crates.io-6f17d22bba15001f/v8-0.74.1/build/android/pylib/results/presentation/test_results_presentation.pydeps".
[v8 0.74.1] See //build/android/BUILD.gn:92:1: whence it was called.
[v8 0.74.1] python_library("test_result_presentations_py") {
[v8 0.74.1] ^-----------------------------------------------
[v8 0.74.1] See //v8/tools/BUILD.gn:39:19: which caused the file to be included.
[v8 0.74.1]     data_deps = [ "//build/android:test_runner_py" ]
[v8 0.74.1]                   ^-------------------------------
[v8 0.74.1] thread 'main' panicked at 'assertion failed: Command::new(gn()).arg(format!(\"--root={}\",\n                                                dirs.root.display())).arg(format!(\"--script-executable={}\",\n                                            python())).arg(\"gen\").arg(&gn_out_dir).arg(\"--args=\".to_owned()\n                                +\n                                &args).stdout(Stdio::inherit()).stderr(Stdio::inherit()).envs(env::vars()).status().expect(\"Coud not run `gn`\").success()', /home/runner/.cargo/registry/src/index.crates.io-6f17d22bba15001f/v8-0.74.1/build.rs:717:5
[v8 0.74.1] note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
The following warnings were emitted during compilation:

warning: Not using sccache or ccache

error: failed to run custom build command for `v8 v0.74.1`

Caused by:
  process didn't exit successfully: `/home/runner/work/v8-src/v8-src/target/release/build/v8-c037bc55a0f012fb/build-script-build` (exit status: 101)

It seems that some files is missing at build/android/pylib

Detail build log: https://github.com/fm-elpac/v8-src/actions/runs/5494146045/jobs/10012760135

@afalon44
Sorry, I don't understand what you say.

我尝试编译 v0.83.2 成功了,但是我在使用时遇到了一些问题,使用 deno_core 运行例子时会报空指针错误,请问你成功运行了吗

我尝试编译 v0.83.2 成功了,但是我在使用时遇到了一些问题,使用 deno_core 运行例子时会报空指针错误,请问你成功运行了吗

以前的版本是可以的, 最新的版本有点问题, 还没成功.

我尝试编译 v0.83.2 成功了,但是我在使用时遇到了一些问题,使用 deno_core 运行例子时会报空指针错误,请问你成功运行了吗

以前的版本是可以的, 最新的版本有点问题, 还没成功.

我还以为是我编译v8出现问题了呢,我现在在尝试重新编译了🤦‍♂️

我尝试编译 v0.83.2 成功了,但是我在使用时遇到了一些问题,使用 deno_core 运行例子时会报空指针错误,请问你成功运行了吗

以前的版本是可以的, 最新的版本有点问题, 还没成功.

以前的版本确实是可以的我也一直在用,我之前用的就是 v0.64.0,只是最近我想升级就挑了 v0.83.2,没想到就遇到一些麻烦了

我刚测试分别运行 v8 和 deno_core 的 hello_world 例子
结果是 v8 的例子可以运行但 deno_core 的例子会崩溃,这是不是说明 问题就出在 deno_core,似乎是在 JsRuntime 初始化过程中崩溃的

v8 运行结果

    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
./src/: 1 file pushed, 0 skipped. 0.5 MB/s (2615 bytes in 0.005s)
./target/aarch64-linux-android/debug/test_build_v8: 1 file pushed, 0 skipped. 75.1 MB/s (47282496 bytes in 0.600s)
Hello World!
3 + 4 = 7

deno_core 主机运行结果(预期结果)

    Finished dev [unoptimized + debuginfo] target(s) in 0.07s
     Running `target/debug/test_build_deno_core`
The sum of
1,2,3
is
6
Exception:
TypeError: serde_v8 error: invalid type; expected: array, got: Number

deno_core 运行结果(实际结果)

    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
./src/: 1 file pushed, 0 skipped. 0.5 MB/s (1582 bytes in 0.003s)
./target/aarch64-linux-android/debug/test_build_deno_core:...e pushed, 0 skipped. 96.0 MB/s (105099880 bytes in 1.045s)

crash log

********** Crash dump: **********                                                                                                                  [26/1976]Build fingerprint: 'Xiaomi/cepheus/cepheus:13/TQ3A.230901.001/1700048355:user/release-keys'
#00 0x00000000014d84e2 /data/local/tmp/deno_snapshot_builder/test_build_deno_core (offset 0x2586000)
                                                                                   v8__Isolate__PerformMicrotaskCheckpoint
                                                                                   ./../../../../src/binding.cc:222:12
#01 0x000000000151b780 /data/local/tmp/deno_snapshot_builder/test_build_deno_core
v8::String::NewExternalOneByte(v8::Isolate*, v8::String::ExternalOneByteStringResource*)
./../../../../v8/src/api/api.cc:7578:17
#02 0x0000000001306c7c /data/local/tmp/deno_snapshot_builder/test_build_deno_core
v8::string::_$LT$impl$u20$v8..data..String$GT$::new_from_onebyte_const::_$u7b$$u7b$closure$u7d$$u7d$::hc504783f0c9d33b9
/home/autsing/.cargo/registry/src/index.crates.io-6f17d22bba15001f/v8-0.83.2/src/string.rs:461:9
#03 0x0000000001157120 /data/local/tmp/deno_snapshot_builder/test_build_deno_core
v8::scope::HandleScope$LT$$LP$$RP$$GT$::cast_local::h1c5e242b54bec948
/home/autsing/.cargo/registry/src/index.crates.io-6f17d22bba15001f/v8-0.83.2/src/scope.rs:239:21
v8::string::_$LT$impl$u20$v8..data..String$GT$::new_from_onebyte_const::h92a7fb1d6c9d0d8f
/home/autsing/.cargo/registry/src/index.crates.io-6f17d22bba15001f/v8-0.83.2/src/string.rs:460:7
deno_core::runtime::bindings::v8_static_strings::new::h1a380defbc8a9ceb
/home/autsing/.cargo/registry/src/index.crates.io-6f17d22bba15001f/deno_core-0.262.0/runtime/bindings.rs:139:5
#04 0x00000000010eb448 /data/local/tmp/deno_snapshot_builder/test_build_deno_core
deno_core::runtime::bindings::initialize_deno_core_namespace::hd0800f7cd14c4254
/home/autsing/.cargo/registry/src/index.crates.io-6f17d22bba15001f/deno_core-0.262.0/runtime/bindings.rs:199:18
#05 0x00000000011327e8 /data/local/tmp/deno_snapshot_builder/test_build_deno_core
deno_core::runtime::jsruntime::JsRuntime::new_inner::h83c4a100d15d3fd3
/home/autsing/.cargo/registry/src/index.crates.io-6f17d22bba15001f/deno_core-0.262.0/runtime/jsruntime.rs:754:7
#06 0x0000000001130b98 /data/local/tmp/deno_snapshot_builder/test_build_deno_core
deno_core::runtime::jsruntime::JsRuntime::new::h76d74b1ab1866c2a
/home/autsing/.cargo/registry/src/index.crates.io-6f17d22bba15001f/deno_core-0.262.0/runtime/jsruntime.rs:568:11
#07 0x00000000010b6ad8 /data/local/tmp/deno_snapshot_builder/test_build_deno_core
test_build_deno_core::main::he56560a423cd102f
/home/autsing/Gits/test_build_deno_core/src/main.rs:26:23
#08 0x00000000010bd024 /data/local/tmp/deno_snapshot_builder/test_build_deno_core
core::ops::function::FnOnce::call_once::h6e4d1f2aabaaef94
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/ops/function.rs:250:5
#09 0x00000000010b63dc /data/local/tmp/deno_snapshot_builder/test_build_deno_core
std::sys_common::backtrace::__rust_begin_short_backtrace::h98fe2dc7d443d20b
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/sys_common/backtrace.rs:155:18
#10 0x00000000010b6480 /data/local/tmp/deno_snapshot_builder/test_build_deno_core
std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hf8933a5d837627f6
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/rt.rs:166:18
#11 0x000000000255b9f0 /data/local/tmp/deno_snapshot_builder/test_build_deno_core
core::ops::function::impls::_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$F$GT$::call_once::h9983aae1f0c22e8a
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/ops/function.rs:284:13
std::panicking::try::do_call::h066238e64a26bede
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/panicking.rs:552:40
std::panicking::try::h33c132dbcd21b2c1
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/panicking.rs:516:19
std::panic::catch_unwind::h105dc9d93356acbb
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/panic.rs:142:14
std::rt::lang_start_internal::_$u7b$$u7b$closure$u7d$$u7d$::h541039ddd50eb0d5
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/rt.rs:148:48
std::panicking::try::do_call::h6d067e65329ff03d
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/panicking.rs:552:40
std::panicking::try::h68073e7dd5111ae0
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/panicking.rs:516:19
std::panic::catch_unwind::h6d258ee41ea7e92f
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/panic.rs:142:14
std::rt::lang_start_internal::h71c6fdbbf3980bb9
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/rt.rs:148:20
#12 0x00000000010b6450 /data/local/tmp/deno_snapshot_builder/test_build_deno_core
std::rt::lang_start::ha150faaacc9fba53
/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/rt.rs:165:17
#13 0x00000000010bacd8 /data/local/tmp/deno_snapshot_builder/test_build_deno_core
main
??:0:0
#14 0x000000000004a320 /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+96) (BuildId: feb08ab3b0daed1a79b081a68ee9fbfd)
Crash dump is completed

个人对v8研究不是特别深入,看字面意思似乎是字符串相关问题导致的?看来只能换个版本了

最新版 deno (aarch64-linux-gnu) 使用 proot 是可以在 Android 正常运行的, 所以这确实是个奇怪的 BUG.

最新版 deno (aarch64-linux-gnu) 使用 proot 是可以在 Android 正常运行的, 所以这确实是个奇怪的 BUG.

根据堆栈信息我翻看了一下 deno_core 源码

bindings.rs

pub(crate) fn initialize_deno_core_namespace<'s>(
  scope: &mut v8::HandleScope<'s>,
  context: v8::Local<'s, v8::Context>,
  init_mode: InitMode,
) {
  let global = context.global(scope);
  let deno_str = v8_static_strings::new(scope, &v8_static_strings::DENO);

  let maybe_deno_obj_val = global.get(scope, deno_str.into());

  // If `Deno.core` is already set up, let's exit early.
  if let Some(deno_obj_val) = maybe_deno_obj_val {
    if !deno_obj_val.is_undefined() {
      return;
    }
  }
...

&v8_static_strings::DENO 似乎是这个导致的?

bindings.rs

pub mod v8_static_strings {
  pub fn new<'s>(
    scope: &mut v8::HandleScope<'s>,
    str_: &'static v8::OneByteConst,
  ) -> v8::Local<'s, v8::String> {
    v8::String::new_from_onebyte_const(scope, str_).unwrap()
  }

  pub fn new_from_static_str<'s>(
    scope: &mut v8::HandleScope<'s>,
    str_: &'static [u8],
  ) -> v8::Local<'s, v8::String> {
    v8::String::new_external_onebyte_static(scope, str_).unwrap()
  }

  macro_rules! onebyte_const {
    ($ident:ident, $str_:literal) => {
      pub static $ident: v8::OneByteConst =
        v8::String::create_external_onebyte_const($str_.as_bytes());
    };
  }

  onebyte_const!(DENO, "Deno");
  onebyte_const!(CORE, "core");
  onebyte_const!(OPS, "ops");
...

onebyte_const!(DENO, "Deno"); 会生成一个 OneByteConst

v8/string.rs

  // Creates a v8::String from a `&'static [u8]`,
  // must be Latin-1 or ASCII, not UTF-8 !
  #[inline(always)]
  pub fn new_external_onebyte_static<'s>(
    scope: &mut HandleScope<'s, ()>,
    buffer: &'static [u8],
  ) -> Option<Local<'s, String>> {
    let buffer_len = buffer.len().try_into().ok()?;
    unsafe {
      scope.cast_local(|sd| {
        v8__String__NewExternalOneByteStatic(
          sd.get_isolate_ptr(),
          buffer.as_ptr() as *const char,
          buffer_len,
        )
      })
    }
  }

然后在 v8 会使用这个 v8__String__NewExternalOneByteStatic 在往下就是 v8 的 c源码了
估计是这里引用了空指针了吧,似乎是因为没对齐导致的?(没有那么了解)

Sorry for bumbling into this thread but the timing seemed serendipitous, since I was also trying to get some Android Deno builds off the ground.

I ran exactly into the:

[v8 0.74.1] ERROR at //build/android/BUILD.gn:93:17: Could not read file.
[v8 0.74.1]   pydeps_file = "pylib/results/presentation/test_results_presentation.pydeps"
[v8 0.74.1]                 ^------------------------------------------------------------

I'm not sure if you folks already have a plan of action but wouldn't it be possible to tweak the "gn gen" incantation to exclude all the testonly targets? Presumably we don't care about test targets for rusty_v8 or Deno. Ideally, this wouldn't only solve the issue at hand but also slim builds?