Kyoto Tycoon用最強LuaJIT拡張用パッチ again

以前,Kyoto TycoonをLuaJITに対応させるパッチを書いてみたのですが,
KyotoTycoon+LuaJIT-2.0にハマる - なぜか数学者にはワイン好きが多い
どうも環境が変わるとすぐうまくいかなくなるし,Lua5.2(LuaJITじゃなくてオリジナルのLua)と同居させようと思うと確実に失敗するので,パッチを作りなおしてみました.

ついでに,インストールの方法も改めてまとめてみました.

Lua-5.2のインストール

> set path=(~/bin $path)
> wget http://www.lua.org/ftp/lua-5.2.1.tar.gz
> tar xvf lua-5.2.1.tar.gz
> cd lua-5.2.1
> make freebsd
> lua -v
lua: Command not found.
> make install INSTALL_TOP=~
> rehash
> lua -v
Lua 5.2.1  Copyright (C) 1994-2012 Lua.org, PUC-Rio

LuaJIT-2.0.0のインストール

> wget http://luajit.org/download/LuaJIT-2.0.0.tar.gz
> tar xvf LuaJIT-2.0.0.tar.gz
> cd LuaJIT-2.0.0
> gmake PREFIX=~
> luajit -v
luajit: Command not found.
> gmake install PREFIX=~
> luajit -v
LuaJIT 2.0.0 -- Copyright (C) 2005-2012 Mike Pall. http://luajit.org/

Kyoto Cabinetのインストール

> wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.76.tar.gz
> tar xvf kyotocabinet-1.2.76.tar.gz
> cd kyotocabinet-1.2.76
> ./configure --prefix=~
> ./configure --prefix=`echo $HOME`
> gmake
> gmake install

Kyoto Tycoonのインストール

> wget http://fallabs.com/kyototycoon/pkg/kyototycoon-0.9.56.tar.gz
> tar xvf kyototycoon-0.9.56.tar.gz 
> cd kyototycoon-0.9.56
  
> patch -p0 < configure.patch
Hmm...  Looks like a new-style context diff to me...
The text leading up to this was:
--------------------------
|*** configure.orig     2012-05-02 22:04:11.000000000 +0900
|--- configure  2012-12-04 12:39:27.000000000 +0900
--------------------------
Patching file configure using Plan A...
Hunk #1 succeeded at 2248.
Hunk #2 succeeded at 3994.
Hunk #3 succeeded at 4025.
Hunk #4 succeeded at 4061.
Hmm...  The next patch looks like a new-style context diff to me...
The text leading up to this was:
--------------------------
|*** myscript.cc.orig   2012-12-04 11:16:59.000000000 +0900
|--- myscript.cc        2012-12-04 11:17:33.000000000 +0900
--------------------------
Patching file myscript.cc using Plan A...
Hunk #1 succeeded at 21.
done
> gmake
> gmake install

パッチconfigure.patchはこんな感じです.
これをコピーして,cat > configure.patchとかコマンドを打ってからペーストして,CTRL-Dで抜けてファイルを作って下さい.

*** configure.orig      2012-05-02 22:04:11.000000000 +0900
--- configure   2012-12-04 12:39:27.000000000 +0900
***************
*** 2248,2265 ****
  
  if test "$enable_lua" = "yes"
  then
!   luaver=`lua -e 'v = string.gsub(_VERSION, ".* ", ""); print(v)'`
    MYCPPFLAGS="$MYCPPFLAGS -D_MYLUA"
!   MYCPPFLAGS="$MYCPPFLAGS -I/usr/include/lua$luaver -I/usr/local/include/lua$luaver"
!   MYCPPFLAGS="$MYCPPFLAGS -I/usr/include/lua -I/usr/local/include/lua"
    MYLDFLAGS="$MYLDFLAGS -L/usr/lib/lua$luaver -L/usr/local/lib/lua$luaver"
!   MYLDFLAGS="$MYLDFLAGS -L/usr/lib/lua -L/usr/local/lib/lua"
    LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib/lua$luaver:/usr/local/lib/lua$luaver"
!   LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib/lua:/usr/local/lib/lua"
    LIBRARY_PATH="$LIBRARY_PATH:/usr/lib/lua$luaver:/usr/local/lib/lua$luaver"
!   LIBRARY_PATH="$LIBRARY_PATH:/usr/lib/lua:/usr/local/lib/lua"
!   CPATH="$CPATH:/usr/include/lua$luaver:/usr/local/include/lua$luaver"
!   CPATH="$CPATH:/usr/include/lua:/usr/local/include/lua"
    enables="$enables (lua)"
  fi
  
--- 2248,2266 ----
  
  if test "$enable_lua" = "yes"
  then
!   luaver=-`luajit -e 'v = string.gsub(_VERSION, ".* ", ""); print(v)'`
!   luajitver=-`luajit -v | cut -b 8-10`
    MYCPPFLAGS="$MYCPPFLAGS -D_MYLUA"
!   MYCPPFLAGS="$MYCPPFLAGS -I/usr/include/luajit$luajitver -I/usr/local/include/lua$luajitver"
! #  MYCPPFLAGS="$MYCPPFLAGS -I/usr/include/lua -I/usr/local/include/lua"
    MYLDFLAGS="$MYLDFLAGS -L/usr/lib/lua$luaver -L/usr/local/lib/lua$luaver"
! #  MYLDFLAGS="$MYLDFLAGS -L/usr/lib/lua -L/usr/local/lib/lua"
    LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib/lua$luaver:/usr/local/lib/lua$luaver"
! #  LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib/lua:/usr/local/lib/lua"
    LIBRARY_PATH="$LIBRARY_PATH:/usr/lib/lua$luaver:/usr/local/lib/lua$luaver"
! #  LIBRARY_PATH="$LIBRARY_PATH:/usr/lib/lua:/usr/local/lib/lua"
!   CPATH="$CPATH:/usr/include/luajit$luajitver:/usr/local/include/luajit$luajitver"
! #  CPATH="$CPATH:/usr/include/lua:/usr/local/include/lua"
    enables="$enables (lua)"
  fi
  
***************
*** 3993,4005 ****
  
  if test "$enable_lua" = "yes"
  then
!   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -llua" >&5
! $as_echo_n "checking for main in -llua... " >&6; }
  if ${ac_cv_lib_lua_main+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    ac_check_lib_save_LIBS=$LIBS
! LIBS="-llua  $LIBS"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
  /* end confdefs.h.  */
  
--- 3994,4006 ----
  
  if test "$enable_lua" = "yes"
  then
!   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lluajit" >&5
! $as_echo_n "checking for main in -lluajit... " >&6; }
  if ${ac_cv_lib_lua_main+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    ac_check_lib_save_LIBS=$LIBS
! LIBS="-lluajit$luaver  $LIBS"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
  /* end confdefs.h.  */
  
***************
*** 4024,4040 ****

確認

こんなファイルを作ります.

> cat version.lua 
function version()
  print(_VERSION)
end

そしてこれをLuaスクリプティング拡張としてKyotoTycoonを立ちあげます.

> ktserver -li -scr version.lua
2012-12-09T23:41:03.735805+09:00: [SYSTEM]: ================ [START]: pid=32201
2012-12-09T23:41:03.737417+09:00: [SYSTEM]: opening a database: path=:
2012-12-09T23:41:03.738487+09:00: [SYSTEM]: loading a script file: path=version.lua
2012-12-09T23:41:03.750375+09:00: [SYSTEM]: starting the server: expr=:1978
2012-12-09T23:41:03.751239+09:00: [SYSTEM]: server socket opened: expr=:1978 timeout=30.0
2012-12-09T23:41:03.751364+09:00: [SYSTEM]: listening server socket started: fd=3

別なターミナルから同じマシンに入って,次のようなコマンドでLua関数を呼び出します.

> ktremotemgr script version

あえてバックグラウンドにしなかった元のターミナルでは,KyotoTycoonが次のようなログを吐いているはずです.

Lua 5.1

Lua自体は5.2を入れたのに,5.1と出ているということは,これはLuaインタプリタじゃなくてLuaJITが呼ばれているということです.