先日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になった。
ということでようやくビルド成功という感じです。