Процесс компиляции 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 контейнере.
Контейнер нужен, чтобы не сломать хост систему. Лучше собирать в контейнере. И скопировать готовый результат в хост систему.
Создайте контейнер, если ранее он не был создан:
_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"