Lua:LuaRocksでパッケージ管理

ふと Lua を使いたくなったので、まずはパッケージ管理ツールの LuaRocks をインストールしてみた(Ruby の RubyGems、Python の pip のようなもの)。

最終目標

LuaRocks で md5 のライブラリをインストールし、Lua から md5 ライブラリを呼び出す。
環境は 64 ビットの Ubuntu と CentOS。

$ echo -n | md5sum
d41d8cd98f00b204e9800998ecf8427e  -
$ lua -lmd5 -e 'print(md5.sumhexa(""))'
d41d8cd98f00b204e9800998ecf8427e

Ubuntu(64 bit) & apt-get 編

まずは 64-bit の Ubuntu で  LuaRocks を apt-get でインストールする方法。

LuaRocks のインストール

$ apt-cache search luarocks
luarocks - deployment and management system for Lua modules
$ sudo apt-get install luarocks

ここまでは問題なし。あとは md5 ライブラリをインストールするだけ。

md5 のインストール

$ luarocks install md5
Installing http://luarocks.org/repositories/rocks/md5-1.1.2-2.src.rock...
Archive:  /tmp/luarocks_luarocks-rock-md5-1.1.2-2-4389/md5-1.1.2-2.src.rock
  inflating: md5-1.1.2-2.rockspec
 extracting: md5-1.1.2.tar.gz
gcc -O2 -I/usr/include/lua5.1   -c -o src/md5.o src/md5.c
gcc -O2 -I/usr/include/lua5.1   -c -o src/md5lib.o src/md5lib.c
export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc -O2 -I/usr/include/lua5.1 -shared -o src/core.so src/md5.o src/md5lib.o /usr/bin/ld: src/md5.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
src/md5.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [src/core.so] Error 1

Error: Build error: Failed building.

「共有ライブラリをつくりたければ -fPIC オプションをつけてコンパイルし直すように!」と怒られてしまう。-fPIC オプションをつけて直接コマンドを叩いてコンパイルし直すと、確かに共有ライブラリが作成される。

このあたりの環境に絡む問題は LuaRocks が吸収すべきだなぁーと検索すると、debian/ubuntu 系の LuaRocks ではアーキテクチャが決め打ちで i686 にされているのが原因とわかる。

BUG#923161:Hardcoded i686 architecture breaks x86_64 builds

$ grep fPIC /usr/share/lua/5.1/luarocks/cfg.lua
if proc == "x86_64" and not defaults.variables.CFLAGS:match("-fPIC") then
   defaults.variables.CFLAGS = defaults.variables.CFLAGS.." -fPIC"
$ grep UNAME_M /usr/share/lua/5.1/luarocks/config.lua
LUAROCKS_UNAME_M=[[i686]] # !!!
$ uname -m
x86_64

LuaRocks は x86_64 向けの分岐が用意されているのに、設定ファイルで i686 としているためにエラーが起きるという残念な結果。

簡単な回避策は次の2つがある。いずれも /usr/share/lua/5.1/luarocks/config.lua を変更する

  1. 64ビット環境ではLUAROCKS_UNAME_Mを”x86_64″に書き換える(ハードコード)
  2. LUAROCKS_UNAME_M を削除し、コンパイル時に自動的に検出させる

今回は後者を採用して、無事コンパイルできた。

$ luarocks build md5
Archive:  /tmp/luarocks_luarocks-rock-md5-1.1.2-2-7715/md5-1.1.2-2.src.rock
  inflating: md5-1.1.2-2.rockspec
 extracting: md5-1.1.2.tar.gz
gcc -O2 -fPIC -I/usr/include/lua5.1   -c -o src/md5.o src/md5.c
gcc -O2 -fPIC -I/usr/include/lua5.1   -c -o src/md5lib.o src/md5lib.c
export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc -O2 -fPIC -I/usr/include/lua5.1 -shared -o src/core.so src/md5.o src/md5lib.o
gcc -O2 -fPIC -I/usr/include/lua5.1   -c -o src/des56.o src/des56.c
gcc -O2 -fPIC -I/usr/include/lua5.1   -c -o src/ldes56.o src/ldes56.c
export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc -O2 -fPIC -I/usr/include/lua5.1 -shared -o src/des56.so src/des56.o src/ldes56.o
mkdir -p /home/user/.luarocks/lib/luarocks/rocks/md5/1.1.2-2/lib/md5
cp src/core.so /home/user/.luarocks/lib/luarocks/rocks/md5/1.1.2-2/lib/md5/core.so
mkdir -p /home/user/.luarocks/lib/luarocks/rocks/md5/1.1.2-2/lua
cp src/md5.lua /home/user/.luarocks/lib/luarocks/rocks/md5/1.1.2-2/lua
cp src/des56.so /home/user/.luarocks/lib/luarocks/rocks/md5/1.1.2-2/lib
Updating manifest for /home/user/.luarocks/lib/luarocks/rocks
No existing manifest. Attempting to rebuild...
$ luarocks install md5
...

動作確認

$ lua -lmd5 -e 'print(md5.sumhexa(""))'
d41d8cd98f00b204e9800998ecf8427e

CentOS(64 bit) & 野良インストール編
yum には LuaRocks がなかったので野良インストール。

LuaRocks のインストール

$ curl -O http://luarocks.org/releases/luarocks-2.0.8.tar.gz
$ tar zxfv luarocks-2.0.8.tar.gz
$ cd luarocks-2.0.8
$ ./configure
Lua interpreter found: /usr/bin/lua...
Looking for Lua... lua found in $PATH: /usr/bin
Checking Lua includes... lua.h not found (looked in /usr/include/lua.h)
You may want to use the flag --with-lua-include. See --help.

Lua のヘッダーファイルが見つからないと怒られたので、Lua の devel パッケージも入れる

$ sudo yum install lua lua-devel
$ ./configure
Lua interpreter found: /usr/bin/lua...
Looking for Lua... lua found in $PATH: /usr/bin
Checking Lua includes... lua.h found in /usr/include/lua.h
wget found at /usr/bin
md5sum found at /usr/bin
Configuring for system... Linux
Configuring for architecture... x86_64
Writing configuration...

Installation prefix: /usr/local
LuaRocks configuration directory: /usr/local/etc/luarocks
Using Lua from: /usr

Done. You can now run 'make' to build.
$ make
$ sudo make install
...

LuaRocks 系ファイルは

  • /usr/local/etc/luarocks/
  • /usr/local/share/lua/5.1/luarocks/

以下にインストールされる。

md5 のインストール

何事も無くインストールできた。

$ sudo /usr/local/bin/luarocks install md5
Installing http://luarocks.org/repositories/rocks/md5-1.1.2-2.src.rock...
Using http://luarocks.org/repositories/rocks/md5-1.1.2-2.src.rock... switching to 'build' mode
Archive:  /tmp/luarocks_luarocks-rock-md5-1.1.2-2-474/md5-1.1.2-2.src.rock
  inflating: md5-1.1.2-2.rockspec
 extracting: md5-1.1.2.tar.gz
gcc -O2 -fPIC -I/usr/include   -c -o src/md5.o src/md5.c
gcc -O2 -fPIC -I/usr/include   -c -o src/md5lib.o src/md5lib.c
export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc -O2 -fPIC -I/usr/include -shared -o src/core.so src/md5.o src/md5lib.o
gcc -O2 -fPIC -I/usr/include   -c -o src/des56.o src/des56.c
gcc -O2 -fPIC -I/usr/include   -c -o src/ldes56.o src/ldes56.c
export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc -O2 -fPIC -I/usr/include -shared -o src/des56.so src/des56.o src/ldes56.o
mkdir -p /usr/local/lib/luarocks/rocks/md5/1.1.2-2/lib/md5
cp src/core.so /usr/local/lib/luarocks/rocks/md5/1.1.2-2/lib/md5/core.so
mkdir -p /usr/local/lib/luarocks/rocks/md5/1.1.2-2/lua
cp src/md5.lua /usr/local/lib/luarocks/rocks/md5/1.1.2-2/lua
cp src/des56.so /usr/local/lib/luarocks/rocks/md5/1.1.2-2/lib
Updating manifest for /usr/local/lib/luarocks/rocks

動作確認
このまますんなり終わるのかとおもいきや、、、

$ lua -lmd5 -e 'print(md5.sumhexa(""))'
lua: module 'md5' not found:
        no field package.preload['md5']
        no file '/usr/share/lua/5.1/:/usr/local/share/lua/5.1/'
        no file './md5.so'
        no file '/usr/lib64/lua/5.1/md5.so'
        no file '/usr/lib64/lua/5.1/loadall.so'
stack traceback:
        [C]: ?
        [C]: ?

インストールした md5 ライブラリが見つからない。ライブラリは

  • /usr/local/lib/lua/5.1/
  • /usr/local/share/lua/5.1/

以下にインストールされているので、ここにパスを通してやれば良い。

ピュアLuaライブラリとCライブラリのパスはそれぞれ package.path, package.cpath で確認でき、環境変数 LUA_PATH, LUA_CPATH で上書き設定できる。
以下のコマンドで デフォルトの出力を確認できる。

$ lua -e 'print(package.path)'
/usr/share/lua/5.1/:/usr/local/share/lua/5.1/
$ lua -e 'print(package.cpath)'
./?.so;/usr/lib64/lua/5.1/?.so;/usr/lib64/lua/5.1/loadall.so

明らかにライブラリのインストール先にパスが通っていないので、環境変数で設定。

$ grep LUA ~/.bashrc
export LUA_PATH="/usr/local/lib/lua/5.1/?.lua;/usr/local/share/lua/5.1/?.lua;;"
export LUA_CPATH="/usr/local/lib/lua/5.1/?.so;;"
$ source ~/.bashrc
$ lua -e 'print(package.path)'
/usr/local/lib/lua/5.1/?.lua;/usr/local/share/lua/5.1/?.lua;./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib64/lua/5.1/?.lua;/usr/lib64/lua/5.1/?/init.lua;
$ lua -e 'print(package.path)'
/usr/local/lib/lua/5.1/?.lua;/usr/local/share/lua/5.1/?.lua;./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib64/lua/5.1/?.lua;/usr/lib64/lua/5.1/?/init.lua;

環境変数にはセミコロンを2個並べて(;;)デフォルト設定も残す。マニュアルによると

Any “;;” in the value of the environment variable is replaced by the default path.

md5 の確認

$ echo -n | md5sum
d41d8cd98f00b204e9800998ecf8427e  -
$ lua -lmd5 -e 'print(md5.sumhexa(""))'
d41d8cd98f00b204e9800998ecf8427e

ということで目標達成。Lua 初体験はなかなかスムーズにいかず、ライブラリのインストールだけでかなりぐったり。

References

Tagged with: ,
Posted in linux

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 days ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 3 weeks ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 3 weeks ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 6 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 9 months ago
%d bloggers like this: