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 JNI Library¶
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 |
|
Build Javet JNI Library with i18n¶
To enable i18n support, please append -DENABLE_I18N=1
to the command.
Build Javet Jar¶
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
.