読者です 読者をやめる 読者になる 読者になる

はちゅにっき

こっちのブログはまったり更新

Lua を一般ユーザでソースコードからインストールする

ただし、readline も ncurses も一般ユーザでソースコードからインストールしている場合の方法。
そんな奇特な人はそんなにいないと思うけれど、自分のためにメモ。

各ソフトウェアのバージョン等は以下の通りです。

  • Lua (5.2.3)
    • ${HOME}/local/lua にインストールしたい
  • readline (6.3)
    • ${HOME}/local/readline にインストール済
  • ncurses (5.9)
    • ${HOME}/local/ncurses にインストール済


とりあえずダウンロード & 展開して

$ wget "http://www.lua.org/ftp/lua-5.2.3.tar.gz"
$ tar zxvf lua-5.2.3.tar.gz
$ cd lua-5.2.3

普通にコンパイルしてみると

$ make linux
cd src && make linux
### ... (中略) ... ###
gcc -O2 -Wall -DLUA_COMPAT_ALL -DLUA_USE_LINUX    -c -o lua.o lua.c
lua.c:67:31: error: readline/readline.h: そのようなファイルやディレクトリはありません
lua.c:68:30: error: readline/history.h: そのようなファイルやディレクトリはありません
### ... (中略) ... ###
make: *** [linux] エラー 2

readline のヘッダが見つからないためコンパイルできないので、環境変数 MYCFLAGS と MYLDFLAGS に readline へのパスを指定してコンパイルしてみる。

$ make linux MYCFLAGS="-I${HOME}/local/readline/include" MYLDFLAGS="-L${HOME}/local/readline/lib"
cd src && make linux
### ... (中略) ... ###
gcc -o lua  -L/home/hatyuki/local/readline/lib lua.o liblua.a -lm -Wl,-E -ldl -lreadline
/home/hatyuki/local/readline/lib/libreadline.so: undefined reference to `PC'
/home/hatyuki/local/readline/lib/libreadline.so: undefined reference to `tgetflag'
/home/hatyuki/local/readline/lib/libreadline.so: undefined reference to `tgetent'
/home/hatyuki/local/readline/lib/libreadline.so: undefined reference to `UP'
/home/hatyuki/local/readline/lib/libreadline.so: undefined reference to `tputs'
/home/hatyuki/local/readline/lib/libreadline.so: undefined reference to `tgoto'
/home/hatyuki/local/readline/lib/libreadline.so: undefined reference to `tgetnum'
/home/hatyuki/local/readline/lib/libreadline.so: undefined reference to `BC'
/home/hatyuki/local/readline/lib/libreadline.so: undefined reference to `tgetstr'
### ... (中略) ... ###
make: *** [linux] エラー 2

エラーの内容としては、以下のページの情報がビンゴでした。

Lua対応Vimをインストール
http://rcmdnk.github.io/blog/2013/08/07/computer-vim/

上記ページを参考に、今回は termcap に ncurses を利用しているので MYLDFLAGS と MYLIBS に ncurses へのパスを指定して、再度コンパイル

$ make linux MYCFLAGS="-I${HOME}/local/readline/include" MYLDFLAGS="-L${HOME}/local/readline/lib -L${HOME}/local/ncurses/lib" MYLIBS="-lncursesw"

無事にコンパイルできました。
ということで、あとは INSTALL_TOP を指定し、インストールをします。

$ make install INSTALL_TOP=$HOME/local/lua

これでインストール完了。
ちなみに、ログイン時に ${HOME}/local 以下の bin ディレクトリを見つけて、勝手に PATH を設定するよう、.zshrc には以下のように書いてあります。

if [ -d $HOME/local ]; then
    export PATH=`find $HOME/local -maxdepth 2 -type d -name bin | paste -s -d : -`:$PATH
fi

よって、.zshrc を再読込して Lua を起動します。

$ source ~/.zshrc
$ lua
lua: error while loading shared libraries: libreadline.so.6: cannot open shared object file: No such file or directory

おっと。
いろいろ自前でやりすぎたので、今度は LD_LIBRARY_PATH の設定が必要ですね。。。
ということで、.zshrc に以下を追記して

if [ -d $HOME/local ]; then
    export LD_LIBRARY_PATH=`find $HOME/local -maxdepth 2 -type d -name lib | paste -s -d : -`:$LD_LIBRARY_PATH
fi

再度 Lua を起動すると

$ source ~/.zshrc
$ lua
Lua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio
>

わーい。
とりあえず、一般ユーザでもなんとかなるもんですね。