luaとtolua++をmingwビルド

自前でMakefileを作ったりなどしないで比較的きれいにビルドする方法。
環境は、


toolchainは/usr/local/bin/i686-mingw32-*
として用意済み。
http://d.hatena.ne.jp/ousttrue/20090702/1246549847


使い勝手をよくするためにシンボリックリンクと専用の環境を作ることにする。

cross用のシンボリックリンクを準備する

クロス用のシンボリックリンクを/usr/local/cross/i686-mingw32に配置することにする。

/usr/local/cross/cross_link.shを作成

#!/bin/sh

CROSS=i686-mingw32

mkdir -p $CROSS
for FILE in `ls /usr/local/bin/${CROSS}-*`; do
  LINKED=`basename ${FILE} | sed -e s/${CROSS}-//`
  echo ${FILE} ${CROSS}/${LINKED}
  #ln -s ${FILE} ${CROSS}/${LINKED}
done

実行。

$ cd /usr/local/cross
$ ./cross_link.sh
/usr/local/bin/i686-mingw32-addr2line.exe i686-mingw32/addr2line.exe
/usr/local/bin/i686-mingw32-ar.exe i686-mingw32/ar.exe
/usr/local/bin/i686-mingw32-as.exe i686-mingw32/as.exe
/usr/local/bin/i686-mingw32-c++.exe i686-mingw32/c++.exe
/usr/local/bin/i686-mingw32-c++filt.exe i686-mingw32/c++filt.exe
/usr/local/bin/i686-mingw32-cpp.exe i686-mingw32/cpp.exe
/usr/local/bin/i686-mingw32-dlltool.exe i686-mingw32/dlltool.exe
/usr/local/bin/i686-mingw32-dllwrap.exe i686-mingw32/dllwrap.exe
/usr/local/bin/i686-mingw32-g++.exe i686-mingw32/g++.exe
/usr/local/bin/i686-mingw32-gcc-4.4.0.exe i686-mingw32/gcc-4.4.0.exe
/usr/local/bin/i686-mingw32-gcc.exe i686-mingw32/gcc.exe
/usr/local/bin/i686-mingw32-gccbug i686-mingw32/gccbug
/usr/local/bin/i686-mingw32-gcov.exe i686-mingw32/gcov.exe
/usr/local/bin/i686-mingw32-gprof.exe i686-mingw32/gprof.exe
/usr/local/bin/i686-mingw32-ld.exe i686-mingw32/ld.exe
/usr/local/bin/i686-mingw32-nm.exe i686-mingw32/nm.exe
/usr/local/bin/i686-mingw32-objcopy.exe i686-mingw32/objcopy.exe
/usr/local/bin/i686-mingw32-objdump.exe i686-mingw32/objdump.exe
/usr/local/bin/i686-mingw32-ranlib.exe i686-mingw32/ranlib.exe
/usr/local/bin/i686-mingw32-readelf.exe i686-mingw32/readelf.exe
/usr/local/bin/i686-mingw32-size.exe i686-mingw32/size.exe
/usr/local/bin/i686-mingw32-strings.exe i686-mingw32/strings.exe
/usr/local/bin/i686-mingw32-strip.exe i686-mingw32/strip.exe
/usr/local/bin/i686-mingw32-windmc.exe i686-mingw32/windmc.exe
/usr/local/bin/i686-mingw32-windres.exe i686-mingw32/windres.exe

シンボリックリンクを用意したディレクトリがパスの先頭にくるようにする。

$ export PATH="/usr/local/cross/i686-mingw32:$PATH"

cross作業用環境をさくっと作るために以下のスクリプトを用意。


/usr/local/bin/mingw

#!/bin/sh
bash --rcfile /usr/local/cross/i686-mingw32/bashrc

/usr/local/cross/i686-mingw32/bashrc

# cross用シンボリックリンクにパスを通す
export PATH=/usr/local/cross/i686-mingw32:$PATH

# promptにcross用の印をつける
PS1='\[\033]0;\u@\h:\w\007\]mingw\$ '
$ mingw
mingw> 

これで単にgccを呼んだ場合はi686-mingw32-gccが実行される。
MSYSと同じような使い心地になったと思う。
準備完了。

lua-5.1.4のインストール

$ mingw
mingw> tar zxf lua-5.1.4.tar.gz
mingw> cd lua-5.1.4
mingw> make PLAT=mingw
mingw> make INSTALL_TOP=/usr/local/i686-mingw32 install

scons-1.2.0のインストール

前もってsetup.exeでpythonを導入。
さらにscons
http://www.scons.org/
をインストールしておく。

# cygwinに普通にインストールする
$ tar zxf scons-1.2.0.tar.gz
$ cd scons-1.2.0
$ python setup.py install

tolua++-1.0.93のインストール

sconsは外の環境変数を使わない(PATHに設定した/usr/local/cross/i686-mingw32が無視される)のに注意
http://www.scons.org/wiki/FrequentlyAskedQuestions#shell_env

$ tar jxf tolua++-1.0.93.tar.bz2
$ cd tolua++-1.0.93

custom.pyを作成

CCFLAGS = ['-O2', '-ansi']
LIBS = ['lua']
tolua_bin = 'tolua++'
tolua_lib = 'tolua++'
TOLUAPP = 'tolua++'
ENV={'PATH': ['/usr/local/cross/i686-mingw32/', '/bin', '/usr/bin']}
$ scons
$ scons prefix=/usr/local/i686-mingw32 install

以上で作業完了。
ちゃんとmingwなtolua++.exeができた。

$ ldd /usr/local/i686-mingw32/bin/tolua++.exe
        ntdll.dll => /cygdrive/c/WINDOWS/system32/ntdll.dll (0x7c940000)
        kernel32.dll => /cygdrive/c/WINDOWS/system32/kernel32.dll (0x7c800000)
        msvcrt.dll => /cygdrive/c/WINDOWS/system32/msvcrt.dll (0x77bc0000)

あとライブラリは
/usr/local/i686-mingw32/lib/liblua.a
/usr/local/i686-mingw32/lib/libtolua++.a