y_uti のブログ

統計、機械学習、自然言語処理などに興味を持つエンジニアの技術ブログです

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 のビルドに必要なパッケージ群をインストールします。一つ一つ調べるのは大変なので、以下の方針としました。

  1. yum install hhvm を一度実行して、依存パッケージを調べる。確認したらキャンセルする (hhvm をインストールしない)
  2. 依存パッケージをすべて install または update する
  3. cmake をインストールする
  4. 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

*1:これは、現時点で centos:6.5 がなかったためです。centos:latest が CentOS 6.5 だったのですが、これは、yum を確認したところ udev の依存関係が壊れているようだったので使わないことにしました。