🌙
自分でLuaをビルドしてブラウザ上で動かす
ふと、自分でluaをビルドしてブラウザ上で動かしてみたくなり、やってみたら意外と簡単にできたので記録しておきます。
必要なコンパイラのinstall
emscripten
のコンパイラをinstallします。
luaのソースコードの取得
luaのソースコードを取得します
git clone https://github.com/lua/lua.git
makefileの書き換え
コンパイラ、アーカイバをemscripten
のものに置き換えます。
makefile
diff --git a/makefile b/makefile
index 8506e93c..1ca942fd 100644
--- a/makefile
+++ b/makefile
@@ -76,9 +76,9 @@ MYLDFLAGS= $(LOCAL) -Wl,-E
MYLIBS= -ldl
-CC= gcc
-CFLAGS= -Wall -O2 $(MYCFLAGS) -fno-stack-protector -fno-common -march=native
-AR= ar rc
+CC= emcc
+CFLAGS= -Wall -O2 $(MYCFLAGS) -fno-stack-protector -fno-common
+AR= emar rc
RANLIB= ranlib
RM= rm -f
makeしてビルドします。
make
うまくいくと、ソースごとのオブジェクトファイル、アーカイブファイルliblua.a
、lua.wasm
などが生成されます
簡単なファイルで試してみる
luaはbuildの容易さからか、埋め込みスクリプトによく利用されます(nvim, aviutl, ヤマハルーター等々)。
ネット上にも情報が多く、大抵の場合「c言語 lua 埋め込み」などと検索すればたくさんサンプルになりそうなプログラムが出てきます。
僕は、下のようなプログラムをブラウザで動かしてみました。
sample.c
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
int main(int argc, char *argv[]){
printf("start lua program...\n");
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_dostring(L,
"print(\"hello world\")"
"function add(a, b)\n"
"return (a+b)\n"
"end\n"
"function gcd(a, b)\n"
"if b == 0 then\n"
"return math.abs(a)\n"
"else\n"
"return gcd(b, a % b)\n"
"end\n"
"end\n"
"print(add(1,2))\n"
"print(gcd(36, 60))\n"
);
lua_close(L);
return 0;
}
以下のコマンドで、コンパイル&&リンクすると同じディレクトリにa.out.js
a.out.wasm
ができます。
emcc sample.c liblua.a
簡単なhtmlを書き
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Lua</title>
</head>
<body>
<script src="a.out.js"></script>
</body>
</html>
サーバーを起動し
python3 -m http.server
http://0.0.0.0:8000/にアクセスしてデベロッパーコンソールを開くと、、、
うまくいってそうです!!
動作時のバージョン
luaやemccのバージョンによっては再現できない可能性もあるので、僕が試した時点でのバージョンを残しておきます。
$ emcc --version
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.73 (ac676d5e437525d15df5fd46bc2c208ec6d376a3)
Copyright (C) 2014 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ emar --version
LLVM (http://llvm.org/):
LLVM version 20.0.0git
Optimized build.
$ git branch -v
* master f7115674 Check string indices when loading binary chunk
感想
ストレスなくビルドから実行までできました。
色々おもしろいことができそうです。
Discussion