Ubuntu 14.04でruby-2.1.1をソースからビルドする

Ubuntu 14.04でruby-2.1.1をソースからビルドして動かしてみようとしたのですが、ちょっと引っかかったことがあったのでここにメモします。

本家のサイトからソースアーカイブをダウンロードしてきて、Ubuntu 14.04 (x86_64)でビルドしてみました。

$ tar xf ruby-2.1.1.tar.gz
$ mkdir obj
$ cd obj
$ ../ruby-2.1.1/configure
$ make

すると一カ所だけコンパイルエラーになってしまうところがありました。

make[2]: Entering directory `/home/koba/ruby/obj/ext/readline'
compiling ../../../ruby-2.1.1/ext/readline/readline.c
../../../ruby-2.1.1/ext/readline/readline.c: In function ‘Init_readline’:
../../../ruby-2.1.1/ext/readline/readline.c:1977:26: error: ‘Function’ undeclared (first use in this function)
     rl_pre_input_hook = (Function *)readline_pre_input_hook;
                          ^
../../../ruby-2.1.1/ext/readline/readline.c:1977:26: note: each undeclared identifier is reported only once for each function it appears in
../../../ruby-2.1.1/ext/readline/readline.c:1977:36: error: expected expression before ‘)’ token
     rl_pre_input_hook = (Function *)readline_pre_input_hook;
                                    ^
../../../ruby-2.1.1/ext/readline/readline.c: At top level:
../../../ruby-2.1.1/ext/readline/readline.c:634:1: warning: ‘readline_pre_input_hook’ defined but not used [-Wunused-function]
 readline_pre_input_hook(void)
 ^
make[2]: *** [readline.o] Error 1
make[2]: Leaving directory `/home/koba/ruby/obj/ext/readline'
make[1]: *** [ext/readline/all] Error 2
make[1]: Leaving directory `/home/koba/ruby/obj'
make: *** [build-ext] Error 2

調べてみると、どうもlibreadlineのバージョンが上がって型の定義が変更になったようです。とりあえず以下の一カ所の修正でビルドできるようになりました。

 --- ruby-2.1.1/ext/readline/readline.c.org	2014-04-25 16:20:34.178381831 +0900
 +++ ruby-2.1.1/ext/readline/readline.c	2014-04-25 16:20:13.634382412 +0900
 @@ -1974,7 +1974,7 @@
  
      rl_attempted_completion_function = readline_attempted_completion_function;
  #if defined(HAVE_RL_PRE_INPUT_HOOK)
 -    rl_pre_input_hook = (Function *)readline_pre_input_hook;
 +    rl_pre_input_hook = (rl_hook_func_t *)readline_pre_input_hook;
  #endif
  #ifdef HAVE_RL_CATCH_SIGNALS
      rl_catch_signals = 0;

せっかくなので、バグ報告をしてみようと思いました。まず開発中のtrunkのソースの該当箇所を調べたのですが、すでに修正済みでした。なので次のリリースでは問題なくなります。

そのコミット
そのバグ報告

2014/5/9 追記

Ruby 2.1.2 がリリースされて、このバグが修正されています。