Build Javet from Scratch#
Build V8#
Please follow the official guide to build V8. If you face any issues, you may contact @sjtucaocao.
Prepare V8#
Clone the source code.
Checkout a proper version.
Also, please make sure args.gn
file looks like the following.
; arm64
is_debug = false
target_cpu = "arm64"
v8_monolithic = true
v8_use_external_startup_data = false
is_component_build = false
v8_enable_i18n_support = false
v8_enable_pointer_compression = false
v8_static_library = true
symbol_level = 0
use_custom_libcxx = false
v8_enable_sandbox=false
; x86_64
is_debug = false
target_cpu = "x64"
v8_monolithic = true
v8_use_external_startup_data = false
is_component_build = false
v8_enable_i18n_support = false
v8_enable_pointer_compression = false
v8_static_library = true
symbol_level = 0
use_custom_libcxx = false
v8_enable_sandbox=false
Note
To enable i18n support, please set
v8_enable_i18n_support = true
.
Build V8 for Linux arm64#
export PATH=${DEPOT_TOOLS_HOME}:$PATH
cd ${V8_HOME}
ninja -C out.gn/arm64.release v8_monolith
python3 ${JAVET_HOME}/scripts/python/patch_v8_build.py -p ./
ninja -C out.gn/arm64.release v8_monolith
Build V8 for Linux x86_64#
export PATH=${DEPOT_TOOLS_HOME}:$PATH
cd ${V8_HOME}
ninja -C out.gn/x64.release v8_monolith
python3 ${JAVET_HOME}/scripts/python/patch_v8_build.py -p ./
ninja -C out.gn/x64.release v8_monolith
Build V8 for Mac OS arm64#
export PATH=${DEPOT_TOOLS_HOME}:$PATH
cd ${V8_HOME}
ninja -C out.gn/arm64.release v8_monolith
Build V8 for Mac OS x86_64#
export PATH=${DEPOT_TOOLS_HOME}:$PATH
cd ${V8_HOME}
ninja -C out.gn/x64.release v8_monolith
Build V8 for Windows#
Caution
The patch script requires Python 3.
set PATH=%DEPOT_TOOLS_HOME%;%PATH%
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
cd %V8_HOME%
ninja -C out.gn/x64.release v8_monolith
python %JAVET_HOME%\scripts\python\patch_v8_build.py -p .\
ninja -C out.gn/x64.release v8_monolith
gn gen --ide=vs out.gn\x64.solution
Build V8 for Android#
export PATH=${DEPOT_TOOLS_HOME}:$PATH
cd ${V8_HOME}
python3 tools/dev/v8gen.py arm.release -- 'target_os="android"' 'target_cpu="arm"' 'v8_target_cpu="arm"' v8_monolithic=true v8_use_external_startup_data=false is_component_build=false v8_enable_i18n_support=false v8_enable_pointer_compression=false v8_static_library=true symbol_level=0 use_custom_libcxx=false v8_enable_sandbox=false
ninja -C out.gn/arm.release v8_monolith
python3 ${JAVET_HOME}/scripts/python/patch_v8_build.py -p ./
ninja -C out.gn/arm.release v8_monolith
python3 tools/dev/v8gen.py arm64.release -- 'target_os="android"' 'target_cpu="arm64"' 'v8_target_cpu="arm64"' v8_monolithic=true v8_use_external_startup_data=false is_component_build=false v8_enable_i18n_support=false v8_enable_pointer_compression=false v8_static_library=true symbol_level=0 use_custom_libcxx=false v8_enable_sandbox=false
ninja -C out.gn/arm64.release v8_monolith
python3 ${JAVET_HOME}/scripts/python/patch_v8_build.py -p ./
ninja -C out.gn/arm64.release v8_monolith
python3 tools/dev/v8gen.py ia32.release -- 'target_os="android"' 'target_cpu="x86"' 'v8_target_cpu="x86"' v8_monolithic=true v8_use_external_startup_data=false is_component_build=false v8_enable_i18n_support=false v8_enable_pointer_compression=false v8_static_library=true symbol_level=0 use_custom_libcxx=false v8_enable_sandbox=false
ninja -C out.gn/ia32.release v8_monolith
python3 ${JAVET_HOME}/scripts/python/patch_v8_build.py -p ./
ninja -C out.gn/ia32.release v8_monolith
python3 tools/dev/v8gen.py x64.release -- 'target_os="android"' 'target_cpu="x64"' 'v8_target_cpu="x64"' v8_monolithic=true v8_use_external_startup_data=false is_component_build=false v8_enable_i18n_support=false v8_enable_pointer_compression=false v8_static_library=true symbol_level=0 use_custom_libcxx=false v8_enable_sandbox=false
ninja -C out.gn/x64.release v8_monolith
python3 ${JAVET_HOME}/scripts/python/patch_v8_build.py -p ./
ninja -C out.gn/x64.release v8_monolith
Why Patching V8?#
A few ninja files set certain warnings as errors so that MSVC stops compilation. The patch is to turn off those errors.
Build Node.js#
Please follow Building Node.js to build the static and LTS version of Node.js libraries.
Prepare Node.js#
Clone the source code.
Checkout a proper version.
Build Node.js on Linux#
Caution
The patch script requires Python 3.
cd ${NODE_HOME}
python3 ${JAVET_HOME}/scripts/python/patch_node_build.py -p ${NODE_HOME}
./configure --enable-static --without-intl
python3 ${JAVET_HOME}/scripts/python/patch_node_build.py -p ${NODE_HOME}
make -j4
Why Patching Node.js?#
First patch: All static node libraries are
<thin>
libraries. The patch is to disable<thin>
.Second patch: Many static node libraries are not compiled to position independent code and link phase is broken with the following error. The patch is to set
-fPIC
to those make files./usr/bin/ld: /....../out/Release/libnode.a(node_binding.o): relocation R_X86_64_TPOFF32 against
_ZN4nodeL23thread_local_modpendingE
can not be used when making a shared object; recompile with -fPIC
Build Node.js on Mac OS#
cd ${NODE_HOME}
./configure --enable-static --without-intl
make -j4
Build Node.js on Windows#
cd %NODE_HOME%
vcbuild.bat static without-intl vs2022
Build Javet#
Once Node.js and V8 are ready, please navigate to ${JAVET_HOME}/cpp
, make sure CMake is accessible and execute corresponding build script.
OS |
Node.js Command |
V8 Command |
---|---|---|
Linux arm64 |
|
|
Linux x86_64 |
|
|
Mac OS |
|
|
Windows |
|
|
After a while, the following libraries will be placed in folder ${JAVET_HOME}/src/main/resources
.
OS |
Node.js Library |
V8 Library |
---|---|---|
Linux arm64 |
|
|
Linux x86_64 |
|
|
Mac OS arm64 |
|
|
Mac OS x86_64 |
|
|
Windows |
|
|
Build Javet JNI Library for Android#
Once V8 are ready, please navigate to ./cpp
, make sure CMake is accessible and execute corresponding build script.
Arch |
Command |
---|---|
arm |
|
arm64 |
|
x86 |
|
x86_64 |
|
After a while, the following libraries will be placed in folder ${JAVET_HOME}/android/javet-android/src/main/jniLibs
.
Arch |
Library |
---|---|
arm |
|
arm64 |
|
x86 |
|
x86_64 |
|
Note
To enable i18n support for V8 mode, please append
-DENABLE_I18N
to the command.
Build Javet#
Build Javet for Linux, Mac OS and Windows#
cd ${JAVET_HOME}
gradle build test
After a while, javet-*.*.*.jar
will be placed in folder ${JAVET_HOME}/build/libs
.
Build Javet for Android#
cd ${JAVET_HOME}/android
gradle build
After a while, javet-android-*.*.*-release.aar
will be placed in folder ${JAVET_HOME}/android/javet-android/build/outputs/aar
.