CentOS 7 で HHVM をビルドする
CentOS 7 がリリースされたので、HHVM をビルドしてみました。CentOS 7 では、hop5 リポジトリのパッケージに頼らず、公式リポジトリと EPEL だけで HHVM をビルドできました。この手順を紹介します。なお、今回の記事は、HHVM をビルドしてコマンドラインから動かせるところまでを確認したものです。ウェブサーバと連携させた動作確認はしていませんので、注意してください。(追記: CentOS 7 のパッケージで提供される Apache 2.4 と連携して動作を確認しました)
まず、git や make といった、基本的な開発環境をインストールしておきます*1。必要なものを一つ一つインストールしてもよいのですが、私はいつも、yum の groupinstall コマンドを使って Development Tools を丸ごとインストールしています。
$ sudo yum groupinstall 'Development Tools'
HHVM のソースコードを取得します。下記の Ubuntu のページの内容にしたがって、GitHub からソースコードを取得します*2。
Building and installing HHVM on Ubuntu 13.10 · facebook/hhvm Wiki · GitHub
$ 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 のビルドには CMake が必要なので、インストールします。
$ sudo yum install cmake
依存するパッケージをインストールします。以下は CentOS 7 の公式リポジトリで提供されているものです。
$ sudo yum install \ boost boost-devel \ mariadb mariadb-devel \ libmemcached libmemcached-devel \ libevent libevent-devel \ libcurl libcurl-devel \ libxml2 libxml2-devel \ libxslt libxslt-devel \ libicu libicu-devel \ libcap libcap-devel \ libedit libedit-devel \ libjpeg-turbo libjpeg-turbo-devel \ libpng libpng-devel \ libyaml libyaml-devel \ unixODBC unixODBC-devel \ sqlite sqlite-devel \ expat expat-devel \ tbb tbb-devel \ bzip2 bzip2-devel \ openldap openldap-devel \ readline readline-devel \ elfutils-libelf elfutils-libelf-devel \ binutils binutils-devel \ freetype freetype-devel \ ImageMagick ImageMagick-devel
いくつかのパッケージは、公式リポジトリで提供されていないので、EPEL からインストールします。
$ sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/beta/7/x86_64/epel-release-7-0.2.noarch.rpm $ sudo yum --enablerepo=epel install \ libmcrypt libmcrypt-devel \ gperftools gperftools-devel
また、HHVM は glog に依存しますが、これは公式リポジトリでも EPEL でも提供されていないので、ソースコードを取得してビルドします。
$ cd ~/dev $ curl https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz | tar zxf - $ cd glog-0.3.3 $ ./configure $ make $ sudo make install
同様に、鬼車のソースコードを取得してビルドします。
$ cd ~/dev $ curl http://www.geocities.jp/kosako3/oniguruma/archive/onig-5.9.5.tar.gz | tar zxf - $ cd onig-5.9.5 $ ./configure $ make $ sudo make install
libdwarf のソースコードを取得してビルドします*3。なお、libdwarf には make install がありません。README を読んだところ、必要な場合は make した後に自分で /usr/local 以下などにコピーするようです。今回は、コピーせずに make した状態のまま利用することにします。
$ cd ~/dev $ curl http://www.prevanders.net/libdwarf-20140519.tar.gz | tar zxf - $ cd dwarf-20140519 $ ./configure $ make
hh_server, hh_client を使いたい場合は、OCaml をインストールします。実行環境として HHVM だけをセットアップするのであれば、不要です。
$ sudo yum install ocaml
これで、HHVM をビルドする準備が整いました。以下のようにして HHVM をビルドできます。cmake 実行時に PATH を追加しています。これは、libdwarf のヘッダファイルとライブラリファイルが存在するパスを認識させるためです。PATH の値は libdwarf をビルドした環境に合わせて変更してください。
$ cd ~/dev/hhvm $ PATH=/home/y-uti/dev/dwarf-20140519/libdwarf:$PATH cmake . $ make $ sudo make install
hh_server と hh_client は、hphp/hack/bin ディレクトリにバイナリが生成されます。これらは、自分で /usr/local/bin などにコピーして使います。
なお、今回の手順では、依存するライブラリのうち以下のものはインストールしませんでした。これらのライブラリは、システムにインストール済みであればそれを使いますが、インストールされていなければ、HHVM の third-party ディレクトリに同梱されているソースコードからビルドして使うようになっています。
- libzip
- lz4
- double-conversion
libzip は、CentOS 7 の公式リポジトリからインストールできるのですが、HHVM は 0.11 を必要としているのに対してリポジトリのものは 0.10 なので、公式リポジトリからインストールしてしまうとビルドに失敗します*4。また、lz4 と double-conversion は、いずれも CentOS 7 用のパッケージが存在していないようで、自分でインストールする場合はソースコードからビルドする必要があります。