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が呼ばれているということです.