2015-03-09 12:43:58 +00:00
|
|
|
V8Js on GNU/Linux
|
|
|
|
=================
|
|
|
|
|
|
|
|
Installation of V8Js on GNU/Linux is pretty much straight forward.
|
|
|
|
|
2017-11-12 13:52:04 +00:00
|
|
|
The biggest hurdle actually is that you need a rather new V8 library.
|
|
|
|
However many distributions still ship the rusty version 3.14, published
|
|
|
|
years ago.
|
2015-03-09 12:43:58 +00:00
|
|
|
|
2017-11-12 13:52:04 +00:00
|
|
|
This means that you usually need to compile V8 on your own before
|
|
|
|
you can start to compile & install V8Js itself.
|
2015-03-09 12:43:58 +00:00
|
|
|
|
2016-12-05 16:46:17 +00:00
|
|
|
It is recommended to install the V8 version for V8Js off your system's
|
|
|
|
load path, so it doesn't interfere with the V8 library shipped with your
|
|
|
|
system's distribution.
|
|
|
|
|
|
|
|
|
2016-03-05 16:09:34 +00:00
|
|
|
Snapshots
|
|
|
|
---------
|
|
|
|
|
|
|
|
V8 has (optional) support for so-called snapshots which speed up startup
|
|
|
|
performance drastically. Hence they are generally recommended for use.
|
|
|
|
|
|
|
|
There are two flavours of snapshots: internal & external.
|
|
|
|
|
|
|
|
Internal snapshots are built right into the V8 library (libv8.so file),
|
|
|
|
so there's no need to handle them specially.
|
|
|
|
|
|
|
|
Besides there are external snapshots (which are enabled unless configured
|
|
|
|
otherwise). If V8 is compiled with these, then V8Js needs to provide two
|
|
|
|
"binary blobs" to V8, named `natives_blob.bin` and `snapshot_blob.bin`.
|
2016-12-05 16:46:17 +00:00
|
|
|
In that case copy those two files to the same directory `libv8.so` was
|
|
|
|
installed to.
|
2016-03-05 16:09:34 +00:00
|
|
|
|
2016-12-05 16:46:17 +00:00
|
|
|
|
2020-08-21 07:48:02 +00:00
|
|
|
Pointer Compression
|
|
|
|
-------------------
|
|
|
|
|
|
|
|
V8 versions 8.0 and higher enable pointer compression by default.
|
|
|
|
See [the design document](https://docs.google.com/document/d/10qh2-b4C5OtSg-xLwyZpEI5ZihVBPtn1xwKBbQC26yI/edit)
|
|
|
|
for details.
|
|
|
|
|
|
|
|
Hence if you use one of the recent version (which you really should),
|
|
|
|
then you
|
|
|
|
|
|
|
|
a) either need to manually disable pointer compression during
|
|
|
|
the build of the library by passing the
|
|
|
|
`v8_enable_pointer_compression=false` flag to `v8gen.py`
|
|
|
|
|
|
|
|
b) or compile php-v8js with pointer compression as well, by adding
|
|
|
|
`CPPFLAGS="-DV8_COMPRESS_POINTERS"` to the `./configure` call.
|
|
|
|
|
|
|
|
|
2016-12-05 16:46:17 +00:00
|
|
|
Compile V8 5.6 and newer (using GN)
|
|
|
|
-----------------------------------
|
|
|
|
|
|
|
|
```
|
|
|
|
# Install required dependencies
|
2017-11-12 13:50:16 +00:00
|
|
|
sudo apt-get install build-essential curl git python libglib2.0-dev
|
2016-12-05 16:46:17 +00:00
|
|
|
|
|
|
|
cd /tmp
|
|
|
|
|
|
|
|
# Install depot_tools first (needed for source checkout)
|
|
|
|
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
|
|
|
export PATH=`pwd`/depot_tools:"$PATH"
|
|
|
|
|
|
|
|
# Download v8
|
|
|
|
fetch v8
|
|
|
|
cd v8
|
|
|
|
|
|
|
|
# (optional) If you'd like to build a certain version:
|
2020-08-21 07:48:02 +00:00
|
|
|
git checkout 8.0.426.30
|
2016-12-05 16:46:17 +00:00
|
|
|
gclient sync
|
|
|
|
|
|
|
|
# Setup GN
|
2019-05-10 14:32:06 +00:00
|
|
|
tools/dev/v8gen.py -vv x64.release -- is_component_build=true use_custom_libcxx=false
|
2016-12-05 16:46:17 +00:00
|
|
|
|
|
|
|
# Build
|
|
|
|
ninja -C out.gn/x64.release/
|
|
|
|
|
|
|
|
# Install to /opt/v8/
|
|
|
|
sudo mkdir -p /opt/v8/{lib,include}
|
2017-04-23 19:44:51 +00:00
|
|
|
sudo cp out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin \
|
|
|
|
out.gn/x64.release/icudtl.dat /opt/v8/lib/
|
2016-12-05 16:46:17 +00:00
|
|
|
sudo cp -R include/* /opt/v8/include/
|
|
|
|
```
|
|
|
|
|
2018-01-06 15:58:06 +00:00
|
|
|
On Debian Stretch you need to set RPATH on the installed libraries,
|
|
|
|
so the library loader finds the dependencies:
|
|
|
|
|
|
|
|
```
|
|
|
|
sudo apt-get install patchelf
|
|
|
|
for A in /opt/v8/lib/*.so; do sudo patchelf --set-rpath '$ORIGIN' $A; done
|
|
|
|
```
|
2016-12-05 16:46:17 +00:00
|
|
|
|
2015-03-09 12:43:58 +00:00
|
|
|
Compile php-v8js itself
|
|
|
|
-----------------------
|
|
|
|
|
|
|
|
```
|
|
|
|
cd /tmp
|
2016-03-05 16:09:34 +00:00
|
|
|
git clone https://github.com/phpv8/v8js.git
|
2015-03-09 12:43:58 +00:00
|
|
|
cd v8js
|
|
|
|
phpize
|
2020-08-21 07:48:02 +00:00
|
|
|
./configure --with-v8js=/opt/v8 LDFLAGS="-lstdc++" CPPFLAGS="-DV8_COMPRESS_POINTERS"
|
2015-03-09 12:43:58 +00:00
|
|
|
make
|
|
|
|
make test
|
|
|
|
sudo make install
|
|
|
|
```
|
2016-03-10 09:58:53 +00:00
|
|
|
|
|
|
|
Then add `extension=v8js.so` to your php.ini file. If you have a separate configuration for CLI, add it there also.
|
2017-04-23 19:44:51 +00:00
|
|
|
|
|
|
|
V8Js' build system assumes that the `icudtl.dat` file is located next to the `libv8.so`
|
|
|
|
library file and compiles the path into the library itself. If for whatever reason the
|
|
|
|
`icudtl.dat` file is stored at a different place during runtime, you need to set the
|
|
|
|
php.ini variable `v8js.icudtl_dat_path` to point to the file. Otherwise locale-aware
|
|
|
|
features of V8 will not work as expected.
|