Apache Arrowのビルド

先日OSS Gate東京ミートアップ for Red Data Tools in Speeeに参加して、Apache Arrowの開発にデビューしました。自分の専門でない分野に一人で飛び込むのはなかなか大変なので、こういうイベントがあるのは助かります。

と言っても2時間の中でできたのは、公式サイトのミスの修正案のPullRequestを送ったくらいで(無事マージされました)、その後Arrowをビルドにトライし、cpp (Arrow C++) はすぐにできたものの、c_glib (Arrow C++のglibラッパー) ビルドの途中でいくつかエラーがあり、時間切れという感じでした。

その後家で続きをやったのでまとめ。試したのはUbuntu-16.04とmacOS Sierraで、Arrowはそのときgithubから持ってきたもの(5cda6934999f9f79368f3fc3f68895fc0f4e0b24)です。

Ubuntu-16.04

cpp

cppのビルドはcpp/README.mdの手順通りで問題なし。ただし、ビルドだけでなくsudo make installしておかないとc_glibのビルドに失敗する。また、初めてインストールしたときはsudo ldconfigしておかないとやはりc_glibのビルドに失敗する。

% git clone https://github.com/apache/arrow.git
% cd arrow/cpp
% mkdir debug
% cd debug
% cmake ..
% make unittest
% sudo make install
% sudo ldconfig

c_glib

ビルド手順はc_glib/README.mdに載っている。今回はgithubから取ってきたソースなので、「How to build by users」ではなく「How to build by developers」に従ってビルドする。
c_glibのビルドもほぼc_glib/README.mdの手順通り。

% cd c_glib
% ./autogen.sh
% ./configure
% make
% sudo make install

なお、以下のようなエラーが出た場合は多分cppビルド後のmake install, ldconfigができていない。

make[3]: ディレクトリ '/home/wagavulin/arrow/c_glib/arrow-glib' に入ります
  GISCAN   Arrow-1.0.gir
/home/wagavulin/arrow/c_glib/arrow-glib/tmp-introspectxbzARl/.libs/lt-Arrow-1.0: error while loading share$
 libraries: libarrow.so.0: cannot open shared object file: No such file or directory

macOS Sierra

cpp

cpp/README.mdの通りだが、ビルド後にsudo make installする。なお、Linuxとは異なりldconfigは必要ない(macOSにはldocnfig自体ない)。

c_glib

基本的にはc_glib/REAMDE.mdの「How to build by developers」に従ってビルドするが、いくつかトラブった。

AX_CXX_COMPILE_STDCXX_11マクロの問題

configureを実行したところ途中で失敗。原因はAX_CXX_COMPILE_STDCXX_11マクロに関するもの。調べてみると、このマクロを使用するにはautoconf-archiveを入れる必要があるらしいが、すでに手元のマシンには入っている。試しにアンインストールしてもう一度インストールしたら以下のようなメッセージが出ていた。

$ brew install autoconf-archive
Warning: autoconf-archive 2017.03.21 is already installed, it's just not linked.
You can use `brew link autoconf-archive` to link this version.

どうやらインストールはされたもののリンクが作られていないため見つけられない状態のようだ。メッセージに従ってbrew link autoconf-archiveすると今度は以下のようになった。

$ brew link autoconf-archive
Linking /usr/local/Cellar/autoconf-archive/2017.03.21... 
Error: Could not symlink share/aclocal/ax_check_enable_debug.m4
Target /usr/local/share/aclocal/ax_check_enable_debug.m4
is a symlink belonging to gnome-common. You can unlink it:
  brew unlink gnome-common

To force the link and overwrite all conflicting files:
  brew link --overwrite autoconf-archive

To list all files that would be deleted:
  brew link --overwrite --dry-run autoconf-archive

リンクが作られていないのはgnome-commonというパッケージと衝突するかららしい。仕方ないのでbrew unlink gnome-commonした後brew link autoconf-archiveしたら成功し、AX_CXX_COMPILE_STDCXX_11マクロに関するエラーも解決した。

なお、gnome-commonを入れてなければautoconf-archiveインストール時に自動的にリンクが作られているので、この問題に遭遇することはなさそう。

libffiの問題

AX_CXX_COMPILE_STDCXX_11のエラーは解決したが、今度はgobject-introspectionがないと言われた。

checking for gobject-introspection... configure: error: gobject-introspection-1.0 is not installed

gobject-introspectionは入ってるはずなんだが...。config.logを見てみると、gobject-introspectionが見つからないのではなく、libffiが見つからないのが原因のようだ。

configure:16847: checking for gobject-introspection
configure:16856: $PKG_CONFIG --exists --print-errors "gobject-introspection-1.0"
Package libffi was not found in the pkg-config search path.
Perhaps you should add the directory containing `libffi.pc'
to the PKG_CONFIG_PATH environment variable
Package 'libffi', required by 'gobject-introspection-1.0', not found
configure:16859: $? = 1
configure:16863: error: gobject-introspection-1.0 is not installed

libffiはkeg onlyというやつで、インストールしてもリンクが作られないためpkg-configが見つけられない。brew linkに--forceを付けて強制的にリンクすることもできるようだが、どういう副作用があるか分からない。pkg-configの探索パスに追加するだけでも回避できるようなのでその方向でやろう。

$ export PKG_CONFIG_PATH="/usr/local/Cellar/libffi/3.2.1/lib/pkgconfig"
$ ./configure

これでビルドできた。ただし、ビルドの途中で以下のようなエラーがずらずらと出てきた。

  GISCAN   Arrow-1.0.gir
/usr/include/signal.h:79: syntax error, unexpected identifier, expecting ')' in 'void (* _Nullable bsd_signal(int, void (* _Nullable)(int)))(int);' at 'bsd_signal'
/usr/include/signal.h:79: syntax error, unexpected ')', expecting ',' or ';' in 'void (* _Nullable bsd_signal(int, void (* _Nullable)(int)))(int);' at ')'
以下略

@kouさんによると問題なさそうで、test/run-test.shが動けばよさそう。やってみたところ100% passedになった。

ということでようやくビルド成功という感じです。