寫一篇博客紀念我今天的辛苦工作,雖然最後也不完美,但是這一點工作也許能給大家一點幫助,省得大家再重複走路了。
最近用總用Lua和Cygwin,但Lua用的是LuaForWindows,因此不是原生態的cygwin的東西,其實我很想用cygwin中的Lua,但是cygwin中的lua沒有模塊啊,都要自己整,想想都覺得費勁。總希望有個人來做這件事,但是今天我終於忍不了了。整了一天,也沒有把tecgraf的IUP/IM/CD給整上去,太菜了,沒辦法,先把整了的東西放上來吧。
安裝Cygwin
安裝時必須保證安裝如下模塊:
lua autoconf automake autobuild gcc4 gcc4-g++ wget curl unzip make cmake git libzzip-devel libxml2-devel diff patch libgd-devel libgd2 pkg-config libcurl4 libcurl-devel libsqlite3-devel
安裝Lua的模塊們
安裝瞭如下模塊:
luarocks luazip luaxml lunit luasocket luafilesystem lualogging luadoc md5 date bit32 lpeg luacurl luasql-sqlite3 stdlib lbase64 lpack luaprofiler luagd luacom
安裝的步驟有很多,寫了3個腳本,生成了一個patch,把這它們下載下來,放到一個文件夾中,切換到那個文件夾,執行 ./install.sh 即可
install.sh
#!/bin/sh
START_DIR=$PWD # gd.patch MUST be here
LUA_CLIB_DIR=/usr/local/lib/lua/5.1
LUA_LLIB_DIR=/usr/local/share/lua/5.1
RUN_DIR=~/tmp/luainstall
# run in ~/tmp
mkdir -p $RUN_DIR
cd $RUN_DIR
# install luarocks
echo "####################### Installing luarocks #################"
wget "http://luarocks.org/releases/luarocks-2.0.10.tar.gz"
tar xzf luarocks-2.0.10.tar.gz
cd luarocks-2.0.10
./configure
make
make install
cd $RUN_DIR
# install lua modules by luarocks
MODULES="luazip luaxml lunit luasocket luafilesystem lualogging luadoc md5 date bit32 lpeg luacurl luasql-sqlite3 stdlib lbase64 lpack luaprofiler"
for mod in $MODULES ; do
echo "############### Installing $mod #####################"
luarocks install $mod
done
# install lua modules that cannot by luarocks
echo "##################### Installing luagd #######################"
wget "http://files.luaforge.net/releases/lua-gd/lua-gd/lua-gd-2.0.33r2forLua5.1/lua-gd-2.0.33r2.tar.gz"
tar xzf lua-gd-2.0.33r2.tar.gz
cd lua-gd-2.0.33r2
patch < $START_DIR/gd.patch # the script must run at the $RUNDIR
make
cp -f gd.so $LUA_CLIB_DIR/
cd $RUN_DIR
# install luacom
echo "####################### Installing luacom #####################"
rm -rf luacom #enable run more than once
git clone https://github.com/davidm/luacom.git
cd luacom
mkdir -p build
cd build
cmake ..
make
cp luacom.dll $LUA_CLIB_DIR/
cd $RUN_DIR
# change the default lua path
echo "###################### Changing the default lua path/cpath ######################"
# enable run more than once
CHANGED=$(cat ~/.bashrc | grep "# CYGWIN LUA INSTALL")
if [[ -z $CHANGED ]] ; then
echo "# CYGWIN LUA INSTALL" >> ~/.bashrc
echo "export LUA_PATH=\"./?.lua;$LUA_LLIB_DIR/?.lua;$LUA_LLIB_DIR/?/init.lua;$LUA_LLIB_DIR/?.lua;$LUA_LLIB_DIR/?/init.lua\"" >> ~/.bashrc
echo "export LUA_CPATH=\"./?.so;$LUA_CLIB_DIR/?.so;./?.dll;$LUA_CLIB_DIR/?.dll\"" >> ~/.bashrc
echo "Lua path/cpath changed"
else
echo "Previous changed detected, cancelled"
fi
# do it now
export LUA_PATH="./?.lua;$LUA_LLIB_DIR/?.lua;$LUA_LLIB_DIR/?/init.lua;$LUA_LLIB_DIR/?.lua;$LUA_LLIB_DIR/?/init.lua"
export LUA_CPATH="./?.so;$LUA_CLIB_DIR/?.so;./?.dll;$LUA_CLIB_DIR/?.dll"
# test lua install
echo "############### Testing using require #################"
lua $START_DIR/test_require.lua
echo ""
echo "Enjoy Lua!"
uninstall.sh
#!/bin/sh
LUALOCAL=/usr/local
# dirs
LUAROCKS_CONFIG_DIR=$LUALOCAL/etc/luarocks
LUAROCKS_ROCK_DIR=$LUALOCAL/lib/luarocks
LUA_CLIB_DIR=$LUALOCAL/lib/lua
LUA_LLIB_DIR=$LUALOCAL/share/lua
rm -rf $LUAROCKS_CONFIG_DIR $LUAROCKS_ROCK_DIR $LUA_CLIB_DIR $LUA_LLIB_DIR
# bin files
LUAROCKS=$LUALOCAL/bin/luarocks
LUAROCKS_ADMIN=$LUALOCAL/bin/luarocks-admin
LUADOC=$LUALOCAL/bin/luadoc
LUAUNIT=$LUALOCAL/bin/lunit
rm -f $LUAROCKS $LUAROCKS_ADMIN $LUADOC $LUAUNIT
echo "Please manually remove LUA_PATH and LUA_CPATH in your .bashrc file"
gd.patch
--- Makefile 2006-05-04 09:03:48.000000000 +0800
+++ Makefile.update 2012-07-29 22:08:03.546875000 +0800
@@ -33,7 +33,7 @@
# change the next ones.
# Name of .pc file. "lua5.1" on Debian/Ubuntu
-LUAPKG=lua5.1
+LUAPKG=lua
OUTFILE=gd.so
CFLAGS=`gdlib-config --cflags` `pkg-config $(LUAPKG) --cflags` -O3 -Wall
GDFEATURES=`gdlib-config --features |sed -e "s/GD_/-DGD_/g"`
@@ -67,11 +67,7 @@
all: $(OUTFILE)
$(OUTFILE): luagd.c
- $(CC) -o $(OUTFILE) $(GDFEATURES) $(CFLAGS) $(LFLAGS) luagd.c
- lua test_features.lua
-
-install: $(OUTFILE)
- install -s $(OUTFILE) $(INSTALL_PATH)
+ $(CC) -o $(OUTFILE) $(GDFEATURES) $(CFLAGS) luagd.c $(LFLAGS)
clean:
rm -f $(OUTFILE) *.o
test_require.lua
#!/usr/bin/lua
local modules = {
"zip",
"luaXML",
"lunit",
"socket",
"lfs",
"logging",
"luadoc",
"md5",
"date",
"bit32",
"lpeg",
"luacurl",
"luasql.sqlite3",
"base64",
"pack",
"profiler",
"gd",
"luacom",
}
for _,mod in ipairs(modules) do
require(mod)
end
print "########## all passed #########"
遇到的問題解釋
庫路徑
cygwin默認安裝的Lua,庫路徑是 /usr/share/lua/5.1 和 /usr/lib/lua/5.1,luarocks編譯時應該配置爲 ./configure --prefix=/usr
但是在我的電腦上,如果這樣做,luarocks在安裝其他模塊時會提示:
Error: Your user does not have write permissions in /
-- you may want to run as a privileged user or use your local tree with --local.
於是我只好接受默認的/usr/local,這就帶來了問題,即後面要修改 LUA_PATH 和 LUA_CPATH,另外cygwin中有些庫是.so,有些是.dll,所以cpath比較特殊
luagd Makefile
luagd的Makefile默認是編譯不過去的。是因爲debian和cygwin的差別造成的。大家看看gd.patch就知道哪裏需要改了
卸載
安裝完之後要卸載就運行 ./uninstall 即可
臨時文件夾
安裝時使用了 ~/tmp/luainstall 作爲臨時文件夾,安裝完後並沒有刪除,如果不想再看到它,請有空刪除即可
運行
我只能保證安裝沒有問題,具體是否能運行,還不知^_^
TODO
IUP或wxLua
Patch:整不明白GUI了,轉戰 MinGW,參見我的下一篇文章