🐡

LuaをTCCでビルドする

2021/06/27に公開

はじめに

luatccでビルドをしてみます。

使用するバージョンは以下

  • 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

gcctccに変更します。
引数に-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はリンカのオプションなのでしょう。
おそらくこれ
https://sourceware.org/binutils/docs/ld/Options.html#index-_002dE

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