CentOS 6.5 で HHVM をビルドする
CentOS 6.5 で HHVM をソースコードからビルドしたので、ビルド手順を紹介します。
CentOS 用のバイナリパッケージは hop5 という非公式のリポジトリで公開されています。これは、以下のウェブページの手順で導入できます。
Naresh: Installing HHVM 3.0.1 on Centos 6.5 (64-bit)
ですが、このパッケージでインストールされるのは HHVM 本体だけで、Hack の型チェッカ (hh_client, hh_server) などは付属しません。これらを含むパッケージは現時点では見当たらず、ソースコードからビルドする必要がありそうです。
まず、CentOS 6.5 をセットアップします。今回は Docker を利用して環境を作ってみました。centos:6.4 のイメージを取得し、これを yum update して CentOS 6.5 にします*1。
$ sudo docker pull centos:6.4 $ sudo docker run -t -i centos:6.4 /bin/bash # yum update # cat /etc/redhat-release CentOS release 6.5 (Final)
必要なパッケージを揃えるために、EPEL と hop5 を yum リポジトリとして登録します。hop5 は、HHVM のほかにも gcc 4.8 など新しい開発環境を提供しています。HHVM のビルドには gcc 4.8 が必要です。これらの開発環境を一つ一つビルドするのはさすがに手間なので、今回は、HHVM 自体はソースコードからビルドしますが、ビルドに必要なコンパイラやライブラリは、パッケージを利用することにします。
$ sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm $ cd /etc/yum.repos.d $ sudo wget http://www.hop5.in/yum/el6/hop5.repo
HHVM のソースコードを取得します。手順は、以下のウェブページの "Downloading and building the HHVM source-code" の内容にしたがいました。CentOS 用のページもあるのですが、記述が少し古そうだったので、頻繁に更新されていそうな Ubuntu のページを参考にしました。ソースコードからのビルドなので、ディストリビューションが違っても同じ手順で大丈夫だと思います。
Building and installing HHVM on Ubuntu 13.10 · facebook/hhvm Wiki · GitHub
$ sudo yum install git $ mkdir ~/dev $ cd ~/dev $ export CMAKE_PREFIX_PATH=`pwd` $ git clone git://github.com/facebook/hhvm.git $ cd hhvm $ git submodule update --init --recursive
ここで、HHVM のビルドに必要なパッケージ群をインストールします。一つ一つ調べるのは大変なので、以下の方針としました。
- yum install hhvm を一度実行して、依存パッケージを調べる。確認したらキャンセルする (hhvm をインストールしない)
- 依存パッケージをすべて install または update する
- cmake をインストールする
- cmake を実行して、表示されるメッセージにしたがい、不足している *-devel パッケージをインストールする
yum install hhvm で表示される依存パッケージのインストールと更新は、以下のとおりです。
$ sudo yum install ConsoleKit ConsoleKit-libs GConf2 ImageMagick ImageMagick-libs ORBit2 \ OpenEXR-libs atk avahi-libs boost boost-atomic boost-chrono boost-context boost-date-time \ boost-filesystem boost-graph boost-iostreams boost-locale boost-log boost-math boost-program-options \ boost-python boost-random boost-regex boost-serialization boost-signals boost-system boost-test \ boost-thread boost-timer boost-wave cairo cpp cups-libs dbus eggdbus elfutils elfutils-libs fftw file \ fontconfig freetype gcc gcc-c++ gd gdb gdbm-devel ghostscript ghostscript-fonts glibc-devel \ glibc-headers glog gnutls gtk2 hicolor-icon-theme ilmbase jasper-libs jemalloc kernel-headers lcms2 \ libICE libIDL libSM libX11 libX11-common libXau libXcomposite libXcursor libXdamage libXext libXfixes \ libXfont libXft libXi libXinerama libXpm libXrandr libXrender libXt libc-client libcap-ng libcroco \ libdwarf libevent libfontenc libgomp libgsf libicu libjpeg-turbo libmcrypt libmemcached libmpc libpng \ librsvg2 libstdc++-devel libthai libtiff libtool-ltdl libunwind libwmf-lite libxcb libxslt mpfr mysql \ mysql-libs ncurses-devel ocaml ocaml-runtime oniguruma pango perl perl-Module-Pluggable \ perl-Pod-Escapes perl-Pod-Simple perl-libs perl-version pixman polkit rpm-build sgml-common tbb \ unixODBC unzip urw-fonts xorg-x11-font-utils xz xz-lzma-compat $ sudo yum update curl libcurl libgcc libstdc++
次に cmake をインストールします。CentOS 6.5 の公式の cmake はバージョンが古いので、EPEL から cmake 2.8 をインストールします。インストールされるコマンド名も cmake28 になります。
$ sudo yum install cmake28
~/dev/hhvm ディレクトリで cmake28 を実行し、出力されるメッセージを確認しながら、必要なパッケージをインストールしていきます。最終的に、以下のパッケージのインストールが必要でした。
$ sudo yum install chrpath boost-devel mysql-devel glog-devel libmemcached-devel pcre-devel \ libevent-devel libcurl-devel libxml2-devel unixODBC-devel libxslt-devel expat-devel tbb-devel \ libmcrypt-devel bzip2-devel oniguruma-devel openldap-devel readline-devel libedit-devel \ elfutils-devel libdwarf-devel libcap-devel binutils-devel jemalloc-devel ImageMagick-devel \ libpng-devel libyaml-devel
あとは HHVM をビルドすればよいはずですが、私が試した時点では、次の修正が必要でした。ヘッダファイルの場所が想定と異なっているようです。
$ diff hphp/runtime/vm/debug/dwarf.h{-,} 23,24c23,24 < #include <libdwarf.h> < #include <dwarf.h> --- > #include <libdwarf/libdwarf.h> > #include <libdwarf/dwarf.h>
これで、HHVM のビルドに成功しました。hhvm は /usr/local/bin にインストールされます。hh_client や hh_server は hphp/hack/bin ディレクトリに生成されます。
$ cmake . $ make $ sudo make install