mieki256's diary



2021/06/19() [n年前の日記]

#1 [lua][windows] luarocksをWindows10上で使おうとしてハマった

json4lua というライブラリを使いたいので、Lua のライブラリをインターネット経由でインストールできるツール luarocks を、Windows10 x64 20H2上で導入しようと試みた。

最初に書いておくけれど、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
  • 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

> 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 -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

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 上でインストールしてみた。

必要なアレコレが入っているか確認。
> 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 のライブラリをインストールする際にビルドする時もあるので、結局はコンパイラ等の導入が必要になる。

以上です。

過去ログ表示

Prev - 2021/06 - Next
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project