rusty_v8

V8 javascript bindings for Rust

  • 所有者: denoland/rusty_v8
  • 平台:
  • 許可證: MIT License
  • 分類:
  • 主題:
  • 喜歡:
    0
      比較:

Github星跟蹤圖

Rusty V8 Binding

V8 Version: 8.7.220.3

ci
crates
docs

Goals

  1. Provide high quality Rust bindings to V8's C++
    API
    . The API should
    match the original API as closely as possible.

  2. Do not introduce additional call overhead. (For example, previous attempts at
    Rust V8 bindings forced the use of Persistent handles.)

  3. Do not rely on a binary libv8.a built outside of cargo. V8 is a very large
    project (over 600,000 lines of C++) which often takes 30 minutes to compile.
    Furthermore, V8 relies on Chromium's bespoke build system (gn + ninja) which is
    not easy to use outside of Chromium. For this reason many attempts to bind to V8
    rely on pre-built binaries that are built separately from the binding itself.
    While this is simple, it makes upgrading V8 difficult, it makes CI difficult, it
    makes producing builds with different configurations difficult, and it is a
    security concern since binary blobs can hide malicious code. For this reason we
    believe it is imperative to build V8 from source code during "cargo build".

  4. Publish the crate on crates.io and allow docs.rs to generate documentation.
    Due to the complexity and size of V8's build, this is nontrivial. For example
    the crate size must be kept under 10 MiB in order to publish.

Binary Build

V8 is very large and takes a long time to compile. Many users will prefer to use
a prebuilt version of V8. We publish static libs for every version of rusty v8
on Github.

Binaries builds are turned on by default: cargo build will initiate a download
from github to get the static lib. To disable this build using the
V8_FROM_SOURCE environmental variable.

When making changes to rusty_v8 itself, it should be tested by build from
source. The CI always builds from source.

The RUSTY_V8_MIRROR environment variable

Tells the build script where to get binary builds from. Understands
http:// and https:// URLs, and file paths. The default is
https://github.com/denoland/rusty_v8/releases/download.

File-based mirrors are good for using cached downloads. First, point
the environment variable to a suitable location:

# you might want to add this to your .bashrc
$ export RUSTY_V8_MIRROR=$HOME/.cache/rusty_v8

Then populate the cache:

#!/bin/bash

# see https://github.com/denoland/rusty_v8/releases

for REL in v0.9.0 v0.10.0; do
  mkdir -p $RUSTY_V8_MIRROR/$REL
  for FILE in \
    librusty_v8_debug_x86_64-unknown-linux-gnu.a \
    librusty_v8_release_x86_64-unknown-linux-gnu.a \
  ; do
    if [ ! -f $RUSTY_V8_MIRROR/$REL/$FILE ]; then
      wget -O $CACHE_DIR/$REL/$FILE \
        https://github.com/denoland/rusty_v8/releases/download/$REL/$FILE
    fi
  done
done

Build V8 from Source

Use V8_FROM_SOURCE=1 cargo build -vv to build the crate completely from
source.

The build scripts on Python 2.7, not Python 3. Do not open issues with us
regarding Python 3; it is a non-trivial problem that must be fixed in
Chromium.
.

For linux builds: glib-2.0 development files need to be installed such that
pkg-config can find them. On Ubuntu, run sudo apt install libglib2.0-dev to
install them.

For Windows builds: the 64-bit toolchain needs to be used. 32-bit targets are
not supported.

The build depends on several binary tools: gn, ninja and a recent version
of clang (V8 relies on bleeding edge features). Because these are not
generally available they are automatically downloaded during the build by default.
It should be possible to opt out of the gn and ninja download by specifying the
$GN and $NINJA environmental variables. The clang download can be skipped by
providing a $CLANG_BASE_PATH environmental variable pointing to a recent
llvm/clang installation (currently LLVM v8.0+ or Apple clang v11.0+).
You could also pass in additional arguments to gn by setting the $GN_ARGS
environmental variable.

Env vars used in when building from source: SCCACHE, CCACHE, GN, NINJA,
CLANG_BASE_PATH, GN_ARGS

FAQ

Building V8 takes over 30 minutes, this is too slow for me to use this crate.
What should I do?

Install sccache or
ccache. Our build scripts will detect and use them. Set
the $SCCACHE or $CCACHE environmental variable if it's not in your path.

What are all these random directories for like build and buildtools are
these really necessary?

In order to build V8 from source code, we must provide a certain directory
structure with some git submodules from Chromium. We welcome any simplifications
to the code base, but this is a structure we have found after many failed
attempts that carefully balances the requirements of cargo crates and
GN/Ninja.

V8 has a very large API with hundreds of methods. Why don't you automate the
generation of this binding code?

In the limit we would like to auto-generate bindings. We have actually started
down this route several times, however due to many eccentric features of the V8
API, this has not proven successful. Therefore we are proceeding in a
brute-force fashion for now, focusing on solving our stated goals first. We hope
to auto-generate bindings in the future.

Why are you building this?

This is to support the Deno project. We previously have
gotten away with a simpler high-level Rust binding to V8 called
libdeno.
But as Deno has matured we've found ourselves continually needing access to an
increasing amount of V8's API in Rust.

When building I get unknown argument: '-gno-inline-line-tables'

Use export GN_ARGS="no_inline_line_tables=false" during build.

主要指標

概覽
名稱與所有者denoland/rusty_v8
主編程語言Rust
編程語言Rust (語言數: 6)
平台
許可證MIT License
所有者活动
創建於2019-10-31 22:36:03
推送於2025-04-19 10:27:19
最后一次提交
發布數208
最新版本名稱v136.0.0 (發布於 )
第一版名稱v0.0.6 (發布於 )
用户参与
星數3.6k
關注者數54
派生數327
提交數1.4k
已啟用問題?
問題數312
打開的問題數61
拉請求數1224
打開的拉請求數17
關閉的拉請求數207
项目设置
已啟用Wiki?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?