y_uti のブログ

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

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 用のパッケージが存在していないようで、自分でインストールする場合はソースコードからビルドする必要があります。

*1:もちろん、すでに開発環境がインストールされている環境であれば、この手順は不要です。

*2:以前の記事で CentOS 6.5 に導入したときと同様です。

*3:libdwarf は CentOS 7 の公式リポジトリにパッケージがあるのですが、パッケージをインストールして HHVM をビルドしたところ、dwarf_producer_init_c 関数で型エラーが発生して、ビルドに失敗しました。

*4:zip_discard 関数が見つからないというエラーになります。