All Projects → denoland → Rusty_v8

denoland / Rusty_v8

Licence: mit
V8 javascript bindings for Rust

Programming Languages

rust
11053 projects
C++
36643 projects - #6 most used programming language
python
139335 projects - #7 most used programming language

Labels

Projects that are alternatives of or similar to Rusty v8

V8.dev
The source code of v8.dev, the official website of the V8 project.
Stars: ✭ 567 (-71.96%)
Mutual labels:  v8
V8 Source Read
V8 探秘
Stars: ✭ 43 (-97.87%)
Mutual labels:  v8
Flamebearer
Blazing fast flame graph tool for V8 and Node 🔥
Stars: ✭ 1,485 (-26.56%)
Mutual labels:  v8
Cef4delphi
CEF4Delphi is an open source project to embed Chromium-based browsers in applications made with Delphi or Lazarus/FPC for Windows, Linux and MacOS.
Stars: ✭ 785 (-61.18%)
Mutual labels:  v8
Rust V8worker2
Minimal Rust binding to V8 (based on ry/libv8worker2)
Stars: ✭ 33 (-98.37%)
Mutual labels:  v8
Puerts
Write your game with TypeScript in UE4 or Unity. Puerts can be read as pu-erh TS(普洱TS)
Stars: ✭ 1,139 (-43.67%)
Mutual labels:  v8
React Native V8
Opt-in V8 runtime for React Native Android
Stars: ✭ 514 (-74.58%)
Mutual labels:  v8
Learn Javascript
《前端基础漫游指南》深入的、系统的学习 javascript 基础,喜欢点 Star
Stars: ✭ 128 (-93.67%)
Mutual labels:  v8
Bytenode
A minimalist bytecode compiler for Node.js
Stars: ✭ 1,012 (-49.95%)
Mutual labels:  v8
Profiling Nodejs
🌌 Collection of articles and tools to efficiently profile Node.js
Stars: ✭ 93 (-95.4%)
Mutual labels:  v8
V8 Bailout Reasons
🔧 A list of Crankshaft bailout reasons with examples
Stars: ✭ 861 (-57.42%)
Mutual labels:  v8
V8 Cffi
Embed the V8 Javascript Interpreter into Python
Stars: ✭ 31 (-98.47%)
Mutual labels:  v8
Deep Into Code
Node.js / Libuv / V8 引擎源代码学习笔记
Stars: ✭ 66 (-96.74%)
Mutual labels:  v8
Liquidcore
Node.js virtual machine for Android and iOS
Stars: ✭ 765 (-62.17%)
Mutual labels:  v8
Bacardi
Bacardi project is an effort to provide multi-language binding for Node.js native layer.
Stars: ✭ 115 (-94.31%)
Mutual labels:  v8
Type Profile
Collect runtime type information 😻 of your JavaScript code.
Stars: ✭ 518 (-74.38%)
Mutual labels:  v8
V8 Javascript Memory
V8 JavaScript 内存占用分析
Stars: ✭ 46 (-97.73%)
Mutual labels:  v8
Llvm Node
Node LLVM 4.0+ Bindings
Stars: ✭ 127 (-93.72%)
Mutual labels:  v8
V8js
V8 Javascript Engine for PHP — This PHP extension embeds the Google V8 Javascript Engine
Stars: ✭ 1,659 (-17.95%)
Mutual labels:  v8
V8go
Execute JavaScript from Go
Stars: ✭ 1,205 (-40.41%)
Mutual labels:  v8

Rusty V8 Binding

V8 Version: 9.8.177.2

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 V8_FORCE_DEBUG environment variable

By default rusty_v8 will link against release builds of v8, if you want to use a debug build of v8 set V8_FORCE_DEBUG=true.

We default to release builds of v8 due to performance & CI reasons in deno.

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.13.0 v0.12.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 $RUSTY_V8_MIRROR/$REL/$FILE \
        https://github.com/denoland/rusty_v8/releases/download/$REL/$FILE
    fi
  done
done

The RUSTY_V8_ARCHIVE environment variable

Tell the build script to use a specific v8 library. This can be an URL or a path. This is useful when you have a prebuilt archive somewhere:

export RUSTY_V8_ARCHIVE=/path/to/custom_archive.a
cargo build

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 clang. The tools will automatically be downloaded, if they are not detected in the environment.

Specifying the $GN and $NINJA environmental variables can be used to skip the download of gn and ninja. The clang download can be skipped by setting $CLANG_BASE_PATH to the directory containing a llvm/clang installation. V8 is known to rely on bleeding edge features, so LLVM v8.0+ or Apple clang 11.0+ is recommended.

Arguments can be passed 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

C++ IDE integration

rusty_v8 supports IDE integration for the C++ bindings through the use of the clangd language server, bringing features such as diagnostics, code completion and code navigations to your editor. See the instructions for how to set it up with your favorite editor.

Before you can use clangd with rusty_v8, you must first generate the compilation database:

V8_FROM_SOURCE=1 GENERATE_COMPDB= cargo build

This will write the clang compilation database as the compile_commands.json file at the root of the project repository. You can pass a path to the GENERATE_COMPDB environment variable to change the location where the compilation database will be written.

You must pass the GENERATE_COMPDB environment variable to regenerate the compilation database, it will not be regenerated automatically.

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.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].