🐡
LuaをTCCでビルドする
はじめに
使用するバージョンは以下
- Lua 5.4.3
- tccは以下のコミット時点のものを使用しました。特に深い理由はありません。
$ git log
commit 0378168c1318352bf13f24f210a23aa2fbeb1895 (HEAD -> mob, origin/mob, origin/HEAD)
Author: herman ten brugge <hermantenbrugge@home.nl>
Date: Tue May 4 11:22:11 2021 +0200
Fix macro processing
The code:
printf("%d\n", CALL(CONST));
did not work because we did not check for TOK_PLCHLDR.
TCCのビルド
以下のようにしてビルド、インストールを行いました。
インストールを変えるなどしたい時は./configure --help
で設定を確認してください。
$ ./configure
$ make
$ make install
$ tcc -v
tcc version 0.9.27 - 0378168 (x86_64 Linux)
Luaのビルド
src/Makefile
を以下のように変更します。
diff --git a/src/Makefile b/src/Makefile
index f78c0b8..dfe0262 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -6,12 +6,12 @@
# Your platform. See PLATS for possible values.
PLAT= guess
-CC= gcc -std=gnu99
+CC= tcc -std=c11
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_3 $(SYSCFLAGS) $(MYCFLAGS)
LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)
LIBS= -lm $(SYSLIBS) $(MYLIBS)
-AR= ar rcu
+AR= tcc -ar rcu
RANLIB= ranlib
RM= rm -f
UNAME= uname
@@ -120,7 +120,7 @@ generic: $(ALL)
Linux linux: linux-noreadline
linux-noreadline:
- $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl"
+ $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-rdynamic -ldl"
linux-readline:
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX -DLUA_USE_READLINE" SYSLIBS="-Wl,-E -ldl -lreadline"
修正箇所は上記のように三箇所です。
変更箇所その1
-CC= gcc -std=gnu99
+CC= tcc -std=c11
gcc
をtcc
に変更します。
引数に-std=gnu99
が指定されていますがtccではヘルプを見ると
以下の2つのみが対応されているようです。
$ tcc -h
Tiny C Compiler 0.9.27 - Copyright (C) 2001-2006 Fabrice Bellard
Usage: tcc [options...] [-o outfile] [-c] infile(s)...
tcc [options...] -run infile [arguments...]
General options:
...
-std=c99 Conform to the ISO 1999 C standard (default).
-std=c11 Conform to the ISO 2011 C standard.
...
とりあえず、-std=c11
としました。
変更箇所その2
ヘルプを見ると一番最後の行あたりに
以下の記載がありました。
$ tcc -h
Tiny C Compiler 0.9.27 - Copyright (C) 2001-2006 Fabrice Bellard
Usage: tcc [options...] [-o outfile] [-c] infile(s)...
tcc [options...] -run infile [arguments...]
General options:
...
Tools:
create library : tcc -ar [rcsv] lib.a files
なので、以下のように修正。
-AR= ar rcu
+AR= tcc -ar rcu
変更箇所その3
linux-noreadline:
- $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl"
+ $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-rdynamic -ldl"
謎です。
ただ、変更しないと以下のようにエラーとなりました。
$ make
<省略>
tcc -ar rcu liblua.a lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o
ranlib liblua.a
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lua.o lua.c
tcc -std=c11 -o lua lua.o liblua.a -lm -Wl,-E -ldl
tcc: error: unsupported linker option '-E'
<省略>
おそらく-E
はリンカのオプションなのでしょう。
おそらくこれ
When creating a dynamically linked executable, using the -E option or the --export-dynamic option causes the linker to add all symbols to the dynamic symbol table.
と書いてあるので、tccのヘルプを見ると、
$ tcc -h
...
Linker options:
...
-rdynamic export all global symbols to dynamic linker
...
とあるので、tccでは-E
のかわりに-rdynamic
を使用すればいいのでしょうか
(すっごい自信ないですが)
ビルドから実行まで
ちょっと自信のない修正箇所もありますが、
インタプリタの実行まで確認できました。
$ make
Guessing Linux
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lapi.o lapi.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c lcode.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lctype.o lctype.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ldebug.o ldebug.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ldo.o ldo.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ldump.o ldump.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lfunc.o lfunc.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lgc.o lgc.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c llex.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lmem.o lmem.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lobject.o lobject.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lopcodes.o lopcodes.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c lparser.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lstate.o lstate.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lstring.o lstring.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ltable.o ltable.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ltm.o ltm.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lundump.o lundump.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lvm.o lvm.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lzio.o lzio.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lauxlib.o lauxlib.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lbaselib.o lbaselib.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lcorolib.o lcorolib.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ldblib.o ldblib.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o liolib.o liolib.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lmathlib.o lmathlib.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o loadlib.o loadlib.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o loslib.o loslib.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lstrlib.o lstrlib.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ltablib.o ltablib.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lutf8lib.o lutf8lib.c
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o linit.o linit.c
tcc -ar rcu liblua.a lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o
ranlib liblua.a
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lua.o lua.c
tcc -std=c11 -o lua lua.o liblua.a -lm -rdynamic -ldl
tcc -std=c11 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o luac.o luac.c
tcc -std=c11 -o luac luac.o liblua.a -lm -rdynamic -ldl
$ ./src/lua
Lua 5.4.3 Copyright (C) 1994-2021 Lua.org, PUC-Rio
> print("hello")
hello
>
まとめ
コンパイラを変えるのは結構大変。
Discussion