Установка v8js в Ubuntu 18.04

Процесс компиляции v8js для Ubuntu 18.04

Скомпилированная версия

Скачайте архив и разархивируйте его в /opt/google. Архив содержит библиотеку v8 и расширение v8js.so для php7.2.

mkdir -p /opt/google
cd /opt/google
wget https://blog.bayrell.org/media/files/archives/v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz

Проверьте скачанный архив:

md5sum -b v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz

Должно быть:

5019edf488ace4c3a46449bf7cbb6e7b *v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz

Распакуйте архив

tar xvf v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz

В папке будет v8js.so его нужно скопировать в /usr/lib/php/20170718 и прописать в конфиге php:

cp /opt/google/v8/6.4/v8js.so /usr/lib/php/20170718

Например, nano /etc/php/7.2/cli/conf.d/50-v8js.ini

extension=v8js.so

Процесс компиляции

Выполнять компиляцию только в безопасном отдельном LXC контейнере.

Контейнер нужен, чтобы не сломать хост систему. Лучше собирать в контейнере. И скопировать готовый результат в хост систему.

Установите LXC.

Создайте контейнер, если ранее он не был создан:

lxc-create -t download -n test-ubuntu -- --dist ubuntu --release bionic --arch amd64

Запустите контейнер:

lxc-start test-ubuntu

Подключитесь к контейнеру:

lxc-attach test-ubuntu

Установка libv8 в контейнере:

apt update
apt install build-essential python python3 chrpath re2c git curl wget gcc-7 gcc-7-base libgcc-7-dev libglib2.0-dev -y

echo "mcgrathr:x:0:0:root:/root:/bin/bash" >> /etc/passwd
echo "thomasanderson:x:0:0:root:/root:/bin/bash" >> /etc/passwd
echo "eng:x:0:" >> /etc/group
echo "primarygroup:x:0:" >> /etc/group

# Установить depot_tools
mkdir -p /opt/google/src
cd /opt/google/src
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

# Включить инструменты depot_tools fetch and gclient
export PATH=/opt/google/src/depot_tools:"$PATH"

# Скачать v8
cd /opt/google/src
fetch v8
cd v8

# Остальные версии
# git checkout 5.6.326.12
# git checkout 6.4.388.18
# git checkout 7.5.288.23
# git checkout 7.9.335
# git checkout 8.4.49

# Рабочая версия
git checkout 6.4.388.18

gclient sync

# Компиляция
tools/dev/v8gen.py -vv x64.release -- is_component_build=true
ninja -C out.gn/x64.release libv8.so

# Прочие команды, которые не работают
# ./build/install-build-deps.sh
# tools/dev/gm.py x64.release
# ninja -C out/x64.release
# gn gen out.v8/x64 --args='use_custom_libcxx=false is_component_build=true is_debug=false target_cpu="x64" use_goma=false goma_dir="None" v8_enable_backtrace=true v8_enable_disassembler=true v8_enable_object_print=true v8_enable_verify_heap=true'

Скопируйте в /opt/google/src/v8 файлы:

cd /opt/google/src/v8

mkdir -p /opt/google/v8/6.4/{lib,include}
cp -v out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin out.gn/x64.release/icudtl.dat /opt/google/v8/6.4/lib/
cp -vR include/* /opt/google/v8/6.4/include/

Сделайте патч библиотек. Это команда патчит пути поиска библиотек.

cd /opt/google/v8
apt-get install patchelf 
for A in /opt/google/v8/6.4/lib/*.so; do patchelf --set-rpath '$ORIGIN' $A;done

Компиляция v8js

cd /opt/google/src

apt install php7.2-dev -y

git clone https://github.com/phpv8/v8js.git
cd v8js

# Версия для v8 6.4.388.18
git checkout 2.1.0

# Конфигурация
phpize
./configure --with-v8js=/opt/google/v8/6.4 LDFLAGS="-lstdc++"

# Компиляция и тестирование
make && make test

# Установка версии
make install

Далее нужно прописать в конфиге php nano /etc/php/7.2/cli/conf.d/50-v8js.ini

extension=v8js.so

Установка v8js через pecl

Данный способ не рекомендуется. Компилируйте через git, как указано выше

Выполните:

pecl install v8js-2.1.0

На вопрос где лежит libv8:

Please provide the installation prefix of libv8 [autodetect] :

укажите папку /opt/google/v8/6.4

Тестирование

Создайте файл test.php

<?php

$v8 = new V8Js();

$JS = <<< EOT

  var s = 'Hello world';
  s;

EOT;

$r = $v8->executeString($JS);
var_dump($r);

Запустите этот файл:

php test.php

Должно вывести:

string(11) "Hello world"

Материалы

  1. Документация по компиляции php v8js
  2. Установка на Centos