2021/06/19(土) [n年前の日記]
#1 [lua][windows] luarocksをWindows10上で使おうとしてハマった
json4lua というライブラリを使いたいので、Lua のライブラリをインターネット経由でインストールできるツール luarocks を、Windows10 x64 20H2上で導入しようと試みた。
最初に書いておくけれど、Windows上で luarocks を使いたいなら、hererocks を使ってビルドするのが簡単。以下は苦労した過程のメモ。
最初に書いておくけれど、Windows上で luarocks を使いたいなら、hererocks を使ってビルドするのが簡単。以下は苦労した過程のメモ。
◎ luarocksを導入。 :
以下から、Lua と luarocks のバイナリを入手。
*1
_Lua Binaries Download
_LuaRocks releases
以下をDL。当初、Lua 5.4 + luarocks を試したら「Lua 5.3を使え」と警告が出てきたので、Lua 5.3 を選び直した。
lua-5.3.6_Win32_bin.zip と lua-5.3.6_Win32_dllw6_lib.zip を解凍。今回は、中身を C:\tools\lua_alt\lua53\ に置いた。
luarocks-3.7.0-windows-32.zip を解凍。luarocks.exe, luarocks-admin.exe を、C:\tools\lua_alt\lua53\ に置いた。
自分の環境には色んな Lua を入れてあるので、luas.bat を作成して、Lua のバージョンを切り替えられるようにしておいた。要するに、環境変数PATHの先頭に、lua.exe (lua53.exe) が置いてあるディレクトリパスを挿入する batファイルを作っておけばいい。
luarocks.exe を実行すると、動作に必要な環境変数の一覧が最後のほうに出てくる。
LUA_LIBDIR が不明、とエラーが出ている。以下を打ち込めば治せる、と表示されているが…。
gcc を使う場合は以下で上手く行くという話も見かけた。とにかく、C:\Users\<YOURNAME>\AppData\Roaming\luarocks\config-5.3.lua に、適切な値を指定すればいいらしいが…。
_lua - Luarocks on windows not recognizing my lua_libdir - Stack Overflow
C:\Users\<YOURNAME>\AppData\Roaming\luarocks\config-5.3.lua
とりあえず今回は、MinGW の gcc を使うことを前提にして、config-5.3.lua を設定した。
C:\Users\<YOURNAME>\AppData\Roaming\luarocks\config-5.3.lua
MinGW の gcc が使える状態にしておく。自分の環境の場合、D:\home\bin\mingw.bat を実行すればPATHに追加されるようにしておいた。
luarocks を実行。環境変数の状態を確認してみる。
今度は LUA_LIBDIR が ok になっている。イケそうな気がする。
_Lua Binaries Download
_LuaRocks releases
以下をDL。当初、Lua 5.4 + luarocks を試したら「Lua 5.3を使え」と警告が出てきたので、Lua 5.3 を選び直した。
- lua-5.3.6_Win32_bin.zip
- lua-5.3.6_Win32_dllw6_lib.zip
- luarocks-3.7.0-windows-32.zip
lua-5.3.6_Win32_bin.zip と lua-5.3.6_Win32_dllw6_lib.zip を解凍。今回は、中身を C:\tools\lua_alt\lua53\ に置いた。
luarocks-3.7.0-windows-32.zip を解凍。luarocks.exe, luarocks-admin.exe を、C:\tools\lua_alt\lua53\ に置いた。
自分の環境には色んな Lua を入れてあるので、luas.bat を作成して、Lua のバージョンを切り替えられるようにしておいた。要するに、環境変数PATHの先頭に、lua.exe (lua53.exe) が置いてあるディレクトリパスを挿入する batファイルを作っておけばいい。
set PATH=C:\tools\lua_alt\lua53;%PATH%目的の Lua を使いたい時は、そのbatファイルを実行すれば使えるようになる。
> lua -v Lua 5.3.6 Copyright (C) 1994-2020 Lua.org, PUC-Rio
luarocks.exe を実行すると、動作に必要な環境変数の一覧が最後のほうに出てくる。
... Configuration: Lua: Version : 5.3 Interpreter: c:\tools\lua_alt\lua53/luarocks.exe (ok) LUA_DIR : c:\tools\lua_alt\lua53 (ok) LUA_BINDIR : c:\tools\lua_alt\lua53 (ok) LUA_INCDIR : c:\tools\lua_alt\lua53/include (ok) LUA_LIBDIR : (not found) **************************************** Use the command luarocks config variables.LUA_LIBDIR <dir> to fix the location **************************************** Configuration files: System : C:/Program Files (x86)/luarocks/config-5.3.lua (not found) User : C:/Users/<YOURNAME>/AppData/Roaming/luarocks/config-5.3.lua (not found) Rocks trees in use: C:\Users\<YOURNAME>\AppData\Roaming/luarocks ("user")
LUA_LIBDIR が不明、とエラーが出ている。以下を打ち込めば治せる、と表示されているが…。
luarocks config variables.LUA_LIBDIR <ディレクトリパス>
gcc を使う場合は以下で上手く行くという話も見かけた。とにかく、C:\Users\<YOURNAME>\AppData\Roaming\luarocks\config-5.3.lua に、適切な値を指定すればいいらしいが…。
_lua - Luarocks on windows not recognizing my lua_libdir - Stack Overflow
C:\Users\<YOURNAME>\AppData\Roaming\luarocks\config-5.3.lua
rocks_trees = { { name = [[system]], root = [[C:\\tools\\lua_alt\\lua53]] }, } variables = { LUA = 'C:\\tools\\lua_alt\\lua53\\lua53.exe', LUA_BINDIR = 'C:\\tools\\lua_alt\\lua53', LUA_INCDIR = 'C:\\tools\\lua_alt\\lua53\\include', LUA_LIBDIR = 'C:\\tools\\lua_alt\\lua53\\lib', CC = 'gcc', LD = 'gcc', }
とりあえず今回は、MinGW の gcc を使うことを前提にして、config-5.3.lua を設定した。
C:\Users\<YOURNAME>\AppData\Roaming\luarocks\config-5.3.lua
variables = { CC = "gcc", LD = "gcc", LUA_LIBDIR = "C:\\tools\\lua_alt\\lua53" }
MinGW の gcc が使える状態にしておく。自分の環境の場合、D:\home\bin\mingw.bat を実行すればPATHに追加されるようにしておいた。
@echo off @rem MinGW,MSYS enable set MINGW_PATH=D:\MinGW set MSYS_PATH=%MINGW_PATH%\\msys\1.0 set MINGWADDPATH=%MINGW_PATH%\bin;%MSYS_PATH%\bin set PATH=%MINGWADDPATH%;%PATH% set C_INCLUDE_PATH=%MINGW_PATH%\include set CPLUS_INCLUDE_PATH=%MINGW_PATH%\include set LIBRARY_PATH=%MINGW_PATH%\lib echo MinGW enable. echo add path %MINGWADDPATH%
luarocks を実行。環境変数の状態を確認してみる。
... Configuration: Lua: Version : 5.3 Interpreter: C:\tools\lua_alt\lua53/luarocks.exe (ok) LUA_DIR : C:\tools\lua_alt\lua53 (ok) LUA_BINDIR : C:\tools\lua_alt\lua53 (ok) LUA_INCDIR : C:\tools\lua_alt\lua53/include (ok) LUA_LIBDIR : C:\tools\lua_alt\lua53 (ok) Configuration files: System : C:/Program Files (x86)/luarocks/config-5.3.lua (not found) User : C:/Users/<YOURNAME>/AppData/Roaming/luarocks/config-5.3.lua (ok) Rocks trees in use: C:\Users\<YOURNAME>\AppData\Roaming/luarocks ("user")
今度は LUA_LIBDIR が ok になっている。イケそうな気がする。
◎ json4luaのインストールを試す。 :
json4lua をインストールしてみる。mingw.bat と luas.bat を実行してから作業。
_JSON4Lua - LuaRocks
C:\Users\<YOURNAME>\AppData\Roaming\luarocks\ 以下に関連ファイルが追加されたように見える。
luarocks path と打って、環境変数に追加すべき記述を確認する。以下は「;」で改行を入れてある。本来は1行で繋がってる。どうやら環境変数 LUA_PATH と LUA_CPATH を設定しておけば良さそう。たぶん。
これで json4lua をインストールできたはず…。json = require('json') をしてみる。しかし、エラーになる。
Ubuntu Linux 20.04 LTS上では luarocks で json4lua をインストールできたのに、Windows10 x64 20H2 上では上手く行かない…。
_JSON4Lua - LuaRocks
> luarocks install json4lua Installing https://luarocks.org/json4lua-0.9.30-1.src.rock json4lua 0.9.30-1 depends on lua >= 5.1 (5.3-1 provided by VM) Do not use 'module' as a build type. Use 'builtin' instead. No existing manifest. Attempting to rebuild... json4lua 0.9.30-1 is now installed in C:\Users\<YOURNAME>\AppData\Roaming/luarocks (license: GPL)
C:\Users\<YOURNAME>\AppData\Roaming\luarocks\ 以下に関連ファイルが追加されたように見える。
luarocks path と打って、環境変数に追加すべき記述を確認する。以下は「;」で改行を入れてある。本来は1行で繋がってる。どうやら環境変数 LUA_PATH と LUA_CPATH を設定しておけば良さそう。たぶん。
> luarocks path SET LUA_PATH= C:\tools\lua_alt\lua53\lua\?.lua; C:\tools\lua_alt\lua53\lua\?\init.lua; C:\tools\lua_alt\lua53\?.lua; C:\tools\lua_alt\lua53\?\init.lua; C:\tools\lua_alt\lua53\..\share\lua\5.3\?.lua; C:\tools\lua_alt\lua53\..\share\lua\5.3\?\init.lua; .\?.lua; .\?\init.lua; C:\Users\<YOURNAME>\AppData\Roaming/luarocks/share/lua/5.3/?.lua; C:\Users\<YOURNAME>\AppData\Roaming/luarocks/share/lua/5.3/?/init.lua SET LUA_CPATH= C:\tools\lua_alt\lua53\?.dll; C:\tools\lua_alt\lua53\..\lib\lua\5.3\?.dll; C:\tools\lua_alt\lua53\loadall.dll; .\?.dll; C:\Users\<YOURNAME>\AppData\Roaming/luarocks/lib/lua/5.3/?.dll SET PATH= C:\Users\<YOURNAME>\AppData\Roaming/luarocks/bin; C:\tools\lua_alt\lua53; (以下略)
これで json4lua をインストールできたはず…。json = require('json') をしてみる。しかし、エラーになる。
> lua -i Lua 5.3.6 Copyright (C) 1994-2020 Lua.org, PUC-Rio > json = require('json') ...<YOURNAME>\AppData\Roaming/luarocks/share/lua/5.3/json.lua:41: attempt to call a nil value (global 'module') stack traceback: ...<YOURNAME>\AppData\Roaming/luarocks/share/lua/5.3/json.lua:41: in main chunk [C]: in function 'require' stdin:1: in main chunk [C]: in ?
Ubuntu Linux 20.04 LTS上では luarocks で json4lua をインストールできたのに、Windows10 x64 20H2 上では上手く行かない…。
◎ 諦めた。 :
疲れた。Windows10上で luarocks を使うのは諦めた。
つまるところ今回は、Lua で JSON のデコードができるかどうかを試したいだけなので、json.lua 単体を別途DLして、lua.exe のある場所に置いて済ませてみることにする。
ググったら、以下でそれらしいファイルが公開されてた。使わせてもらおう…。
_rxi/json.lua: A lightweight JSON library for Lua
上記ページから json.lua だけをDLして、Lua 5.2 の置いてある場所(自分の環境では C:\tools\lua\)にコピーした。
エラーは出ていない。とりあえず、これで済ませることにしてしまおう…。
つまるところ今回は、Lua で JSON のデコードができるかどうかを試したいだけなので、json.lua 単体を別途DLして、lua.exe のある場所に置いて済ませてみることにする。
ググったら、以下でそれらしいファイルが公開されてた。使わせてもらおう…。
_rxi/json.lua: A lightweight JSON library for Lua
上記ページから json.lua だけをDLして、Lua 5.2 の置いてある場所(自分の環境では C:\tools\lua\)にコピーした。
> lua -i Lua 5.2.3 Copyright (C) 1994-2013 Lua.org, PUC-Rio > json = require('json') >
エラーは出ていない。とりあえず、これで済ませることにしてしまおう…。
◎ cjsonを試してみた。 :
luarocks で json4lua をインストールするのは諦めたけど、ふと、cjson (lua-cjson) ならどうだろうと疑問が湧いた。試してみる。
_lua-cjson - LuaRocks
エラーが出た。どうやら Lua 5.3 では lua-objlen なる記述で問題が起きるそうで、lua-cjson 2.1.0-1 ならどうにかなるという話を見かけた。
_Symbol not found: _lua_objlen - Issue #56 - mpx/lua-cjson
lua-cjson のバージョンを指定してインストールしてみる。
エラーが出ているように見えるけど、C:\Users\<YOURNAME>\AppData\Roaming\luarocks\ 以下にファイルが作られているようにも見える。
json = require('cjson') を試してみたら、エラーは出ていない。動きそうな予感。ただし、MinGW/MSYS にもパスが通った状態じゃないと、require() した際にエラーが出る模様。
lua-cjson-219 というライブラリもあるらしい。lua-cjson が数年前から更新されてないのでforkしたっぽい。
_lua-cjson-219 - LuaRocks
_lua-cjson - LuaRocks
luarocks install lua-cjson
エラーが出た。どうやら Lua 5.3 では lua-objlen なる記述で問題が起きるそうで、lua-cjson 2.1.0-1 ならどうにかなるという話を見かけた。
_Symbol not found: _lua_objlen - Issue #56 - mpx/lua-cjson
lua-cjson のバージョンを指定してインストールしてみる。
luarocks install lua-cjson 2.1.0-1
エラーが出ているように見えるけど、C:\Users\<YOURNAME>\AppData\Roaming\luarocks\ 以下にファイルが作られているようにも見える。
json = require('cjson') を試してみたら、エラーは出ていない。動きそうな予感。ただし、MinGW/MSYS にもパスが通った状態じゃないと、require() した際にエラーが出る模様。
lua-cjson-219 というライブラリもあるらしい。lua-cjson が数年前から更新されてないのでforkしたっぽい。
_lua-cjson-219 - LuaRocks
◎ hererocksを使ってみる。 :
Windows環境で luarocks を使おうとすると色々ハマる。しかし、hererocks というツールを使えば、Lua も含めてビルドしてくれるらしい。
_luarocks/hererocks: Python script for installing Lua/LuaJIT and LuaRocks into a local directory
_Windows環境にluarocksをインストールするにはhererocksが便利 | Birth, Gaming, Gaming, Death
_HereRocksなるものがあるらしい - Qiita
動作には、Python、git、gcc等が必要。Windows10 x64 20H2 上でインストールしてみた。
必要なアレコレが入っているか確認。
pip で hererocks をインストール。
hererocks.exe がインストールされた。
C:\tools\lua_alt\ 以下に lua51 というディレクトリを作って、そこに Lua 5.1 + luarocks をインストールしてみる。
C:\tools\lua_alt\lua51\ 以下に、Luaがインストールされた。bin\ 以下に、lua.exe や luarocks.bat が入っている。activate.bat や activate.ps1 を実行すれば、環境変数PATH の最初に bin\ が挿入されて、lua.exe や luarocks.bat が使えるようになる。
luarocks.bat で json4lua をインストールしてみる。
エラーが出ない…。すんなり動いた…。Lua 5.3 + luarocks の環境でエラーが出て苦労したのは何だったのか…。最初から hererocks を使えば良かった…。
_luarocks/hererocks: Python script for installing Lua/LuaJIT and LuaRocks into a local directory
_Windows環境にluarocksをインストールするにはhererocksが便利 | Birth, Gaming, Gaming, Death
_HereRocksなるものがあるらしい - Qiita
動作には、Python、git、gcc等が必要。Windows10 x64 20H2 上でインストールしてみた。
必要なアレコレが入っているか確認。
> python -VV Python 3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] > git --version git version 2.30.2.windows.1 > gcc --version gcc (MinGW.org GCC Build-2) 9.2.0 Copyright (C) 2019 Free Software Foundation, Inc. ...Python, git, gcc が使える状態になっている。
pip で hererocks をインストール。
pip install git+https://github.com/luarocks/hererock
> which hererocks "C:\Python\Python39-64\Scripts\hererocks.exe" > hererocks --version Hererocks 0.23.0
hererocks.exe がインストールされた。
C:\tools\lua_alt\ 以下に lua51 というディレクトリを作って、そこに Lua 5.1 + luarocks をインストールしてみる。
cd c:\tools\lua_alt
hererocks .\lua51 --lua 5.1 --luarocks latest or hererocks .\lua51 -l 5.1 -r latest
C:\tools\lua_alt\lua51\ 以下に、Luaがインストールされた。bin\ 以下に、lua.exe や luarocks.bat が入っている。activate.bat や activate.ps1 を実行すれば、環境変数PATH の最初に bin\ が挿入されて、lua.exe や luarocks.bat が使えるようになる。
luarocks.bat で json4lua をインストールしてみる。
luarocks install json4lua
> lua -i Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio > json = require('json') >
エラーが出ない…。すんなり動いた…。Lua 5.3 + luarocks の環境でエラーが出て苦労したのは何だったのか…。最初から hererocks を使えば良かった…。
*1: 昔は luarocks を gcc か VC++ でビルドする必要があったらしいのだけど、今時は luarocks.exe 等のバイナリも配布されているらしい。もっとも、luarocks を使って Lua のライブラリをインストールする際にビルドする時もあるので、結局はコンパイラ等の導入が必要になる。
[ ツッコむ ]
以上です。