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

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

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

_x000D_mkdir -p /opt/google_x000D_cd /opt/google_x000D_wget https://remontka.com/wp-content/uploads/blinux/v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz

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

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

Должно быть:

_x000D_5019edf488ace4c3a46449bf7cbb6e7b *v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz

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

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

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

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

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

_x000D_extension=v8js.so

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

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

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

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

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

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

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

_x000D_lxc-start test-ubuntu

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

_x000D_lxc-attach test-ubuntu

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

_x000D_apt update_x000D_apt install build-essential python python3 chrpath re2c git curl wget gcc-7 gcc-7-base libgcc-7-dev libglib2.0-dev -y_x000D__x000D_echo "mcgrathr:x:0:0:root:/root:/bin/bash" >> /etc/passwd_x000D_echo "thomasanderson:x:0:0:root:/root:/bin/bash" >> /etc/passwd_x000D_echo "eng:x:0:" >> /etc/group_x000D_echo "primarygroup:x:0:" >> /etc/group_x000D__x000D_# Установить depot_tools_x000D_mkdir -p /opt/google/src_x000D_cd /opt/google/src_x000D_git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git_x000D__x000D_# Включить инструменты depot_tools fetch and gclient_x000D_export PATH=/opt/google/src/depot_tools:"$PATH"_x000D__x000D_# Скачать v8_x000D_cd /opt/google/src_x000D_fetch v8_x000D_cd v8_x000D__x000D_# Остальные версии_x000D_# git checkout 5.6.326.12_x000D_# git checkout 6.4.388.18_x000D_# git checkout 7.5.288.23_x000D_# git checkout 7.9.335_x000D_# git checkout 8.4.49_x000D__x000D_# Рабочая версия_x000D_git checkout 6.4.388.18_x000D__x000D_gclient sync_x000D__x000D_# Компиляция_x000D_tools/dev/v8gen.py -vv x64.release -- is_component_build=true_x000D_ninja -C out.gn/x64.release libv8.so_x000D__x000D_# Прочие команды, которые не работают_x000D_# ./build/install-build-deps.sh_x000D_# tools/dev/gm.py x64.release_x000D_# ninja -C out/x64.release_x000D_# 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'_x000D_

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

_x000D_cd /opt/google/src/v8_x000D__x000D_mkdir -p /opt/google/v8/6.4/{lib,include}_x000D_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/_x000D_cp -vR include/* /opt/google/v8/6.4/include/

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

_x000D_cd /opt/google/v8_x000D_apt-get install patchelf _x000D_for A in /opt/google/v8/6.4/lib/*.so; do patchelf --set-rpath '$ORIGIN' $A;done

Компиляция v8js

_x000D_cd /opt/google/src_x000D__x000D_apt install php7.2-dev -y_x000D__x000D_git clone https://github.com/phpv8/v8js.git_x000D_cd v8js_x000D__x000D_# Версия для v8 6.4.388.18_x000D_git checkout 2.1.0_x000D__x000D_# Конфигурация_x000D_phpize_x000D_./configure --with-v8js=/opt/google/v8/6.4 LDFLAGS="-lstdc++"_x000D__x000D_# Компиляция и тестирование_x000D_make && make test_x000D__x000D_# Установка версии_x000D_make install

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

_x000D_extension=v8js.so

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

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

Выполните:

_x000D_pecl install v8js-2.1.0

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

_x000D_Please provide the installation prefix of libv8 [autodetect] :

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

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

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

_x000D_<?php_x000D__x000D_$v8 = new V8Js();_x000D__x000D_$JS = <<< EOT_x000D__x000D_ var s = 'Hello world';_x000D_ s;_x000D__x000D_EOT;_x000D__x000D_$r = $v8->executeString($JS);_x000D_var_dump($r);

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

_x000D_php test.php

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

_x000D_string(11) "Hello world"