🧸

Lua ver1.1をビルドする(とりあえずビルドができる状態に)

2021/09/23に公開

はじめに

タイトルの通り Lua Ver1.1をビルドする方法を記載します。

ビルド環境

使用する gccのバージョンは以下です。
(Ubuntu上で確認)

$ gcc --version
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

http://www.lua.org/ftp/lua-1.1.tar.gzの中にある
READMEを見ると以下のような記載があります。

  • Installing
    To make, simply type domake.
    If make succeeds, you get an interpreter in ./bin/lua.
    The libraries are in ./lib. The include files are in ./include.
    You don't need the other directories for development.
    There is documentation in ./doc and tests in ./test.
    The documentation includes a reference manual and an article on the
    design and implementation of Lua.
    This distribution is biased towards SunOS 4 with gcc but it is simple to
    change the Makefiles for other systems.

SunOS 4 & gccの環境でビルドができたのでしょう。

ビルドするための修正

以下のように修正します。
修正したファイルは以下の3つ

  • clients/lib/Makefile
  • clients/lib/iolib.c
  • src/Makefile

修正内容は以下。

diff --git a/clients/lib/Makefile b/clients/lib/Makefile
index 4110a62..291a81a 100644
--- a/clients/lib/Makefile
+++ b/clients/lib/Makefile
@@ -4,7 +4,7 @@ INC= $(LUA)/include
 LIB= $(LUA)/lib
 
 CC= gcc
-CFLAGS= -Wall -O2 -I$(INC) $(DEFS)
+CFLAGS= -fPIC -Wall -O2 -I$(INC) $(DEFS)
 
 OBJS= iolib.o mathlib.o strlib.o
 SLIB= $(LIB)/liblualib.a
@@ -17,7 +17,7 @@ $(SLIB): $(OBJS)
 	ranlib $(SLIB)
 
 $(DLIB): $(OBJS)
-	ld -o $@ $(OBJS)
+	ld -shared -o $@ $(OBJS)
 
 clean:
 	rm -f $(OBJS) $(SLIB) $(DLIB)
diff --git a/clients/lib/iolib.c b/clients/lib/iolib.c
index b972124..ec2ef3c 100644
--- a/clients/lib/iolib.c
+++ b/clients/lib/iolib.c
@@ -11,14 +11,19 @@ char *rcs_iolib="$Id: iolib.c,v 1.4 1994/04/25 20:11:23 celes Exp $";
 #include <ctype.h>
 #include <sys/stat.h>
 #ifdef __GNUC__
-#include <floatingpoint.h>
+// #include <floatingpoint.h>
 #endif
 
 #include "mm.h"
 
 #include "lua.h"
 
-static FILE *in=stdin, *out=stdout;
+// static FILE *in=stdin, *out=stdout;
+static FILE *in, *out;
+
+ __attribute__((constructor)) void initHw(void){
+  in=stdin, out=stdout;
+}
 
 /*
 ** Open a file to read.
diff --git a/src/Makefile b/src/Makefile
index 7e833d4..0057074 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -4,7 +4,7 @@ LIB= $(LUA)/lib
 INC= $(LUA)/include
 
 CC= gcc
-CFLAGS= -g -Wall -O2 -I$(INC) $(DEFS)
+CFLAGS= -fPIC -g -Wall -O2 -I$(INC) $(DEFS)
 DEFS= -DMAXCODE=64000 -DMAXCONSTANT=1024 -DMAXSYMBOL=1024 -DMAXARRAY=1024
 
 OBJS= hash.o inout.o lex.o opcode.o table.o y.tab.o
@@ -18,7 +18,7 @@ $(SLIB): $(OBJS)
 	ranlib $(SLIB)
 
 $(DLIB): $(OBJS)
-	ld -o $@ $(OBJS)
+	ld -shared -o $@ $(OBJS)
 
 clean:
 	rm -f $(OBJS) $(SLIB) $(DLIB)

ビルドを実行するとbinディレクトリにluaが作成されます。
いくつかエラーが出ますが、今回は無視(あとで詳細は調べようかと思います)

$ ./domake 
(cd src; make)
make[1]: ディレクトリ '/home/USER/temp/lua1.1/lua/src' に入ります
gcc -fPIC -g -Wall -O2 -I/home/USER/temp/lua1.1/lua/include -DMAXCODE=64000 -DMAXCONSTANT=1024 -DMAXSYMBOL=1024 -DMAXARRAY=1024   -c -o hash.o hash.c
hash.c: In function ‘present’:
hash.c:70:17: warning: variable ‘p’ set but not used [-Wunused-but-set-variable]
   70 |  Node *n=NULL, *p;
      |                 ^
gcc -fPIC -g -Wall -O2 -I/home/USER/temp/lua1.1/lua/include -DMAXCODE=64000 -DMAXCONSTANT=1024 -DMAXSYMBOL=1024 -DMAXARRAY=1024   -c -o inout.o inout.c
gcc -fPIC -g -Wall -O2 -I/home/USER/temp/lua1.1/lua/include -DMAXCODE=64000 -DMAXCONSTANT=1024 -DMAXSYMBOL=1024 -DMAXARRAY=1024   -c -o lex.o lex.c
gcc -fPIC -g -Wall -O2 -I/home/USER/temp/lua1.1/lua/include -DMAXCODE=64000 -DMAXCONSTANT=1024 -DMAXSYMBOL=1024 -DMAXARRAY=1024   -c -o opcode.o opcode.c
gcc -fPIC -g -Wall -O2 -I/home/USER/temp/lua1.1/lua/include -DMAXCODE=64000 -DMAXCONSTANT=1024 -DMAXSYMBOL=1024 -DMAXARRAY=1024   -c -o table.o table.c
gcc -fPIC -g -Wall -O2 -I/home/USER/temp/lua1.1/lua/include -DMAXCODE=64000 -DMAXCONSTANT=1024 -DMAXSYMBOL=1024 -DMAXARRAY=1024   -c -o y.tab.o y.tab.c
lua.stx: In function ‘lua_parse’:
lua.stx:737:6: warning: implicit declaration of function ‘yyparse’ [-Wimplicit-function-declaration]
/usr/lib/yaccpar: In function ‘yyparse’:
/usr/lib/yaccpar:184:39: warning: implicit declaration of function ‘yylex’ [-Wimplicit-function-declaration]
/usr/lib/yaccpar:284:4: warning: label ‘yyerrlab’ defined but not used [-Wunused-label]
/usr/lib/yaccpar:96:2: warning: label ‘yynewstate’ defined but not used [-Wunused-label]
ar ruvl /home/USER/temp/lua1.1/lua/lib/liblua.a hash.o inout.o lex.o opcode.o table.o y.tab.o
ar: `u' modifier ignored since `D' is the default (see `U')
r - hash.o
r - inout.o
r - lex.o
r - opcode.o
r - table.o
r - y.tab.o
ranlib /home/USER/temp/lua1.1/lua/lib/liblua.a
ld -shared -o /home/USER/temp/lua1.1/lua/lib/liblua.so.1.1 hash.o inout.o lex.o opcode.o table.o y.tab.o
make[1]: ディレクトリ '/home/USER/temp/lua1.1/lua/src' から出ます
(cd clients/lib; make)
make[1]: ディレクトリ '/home/USER/temp/lua1.1/lua/clients/lib' に入ります
gcc -fPIC -Wall -O2 -I/home/USER/temp/lua1.1/lua/include    -c -o iolib.o iolib.c
gcc -fPIC -Wall -O2 -I/home/USER/temp/lua1.1/lua/include    -c -o mathlib.o mathlib.c
gcc -fPIC -Wall -O2 -I/home/USER/temp/lua1.1/lua/include    -c -o strlib.o strlib.c
ar ruvl /home/USER/temp/lua1.1/lua/lib/liblualib.a iolib.o mathlib.o strlib.o
ar: `u' modifier ignored since `D' is the default (see `U')
r - iolib.o
r - mathlib.o
r - strlib.o
ranlib /home/USER/temp/lua1.1/lua/lib/liblualib.a
ld -shared -o /home/USER/temp/lua1.1/lua/lib/liblualib.so.1.1 iolib.o mathlib.o strlib.o
make[1]: ディレクトリ '/home/USER/temp/lua1.1/lua/clients/lib' から出ます
(cd clients/lua; make)
make[1]: ディレクトリ '/home/USER/temp/lua1.1/lua/clients/lua' に入ります
gcc -g -Wall -O2 -I/home/USER/temp/lua1.1/lua/include   -c -o lua.o lua.c
lua.c:13:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
   13 | void main (int argc, char *argv[])
      |      ^~~~
lua.c: In function ‘main’:
lua.c:22:11: warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]
   22 |    while (gets(buffer) != 0)
      |           ^~~~
      |           fgets
gcc -o /home/USER/temp/lua1.1/lua/bin/lua lua.o -L/home/USER/temp/lua1.1/lua/lib -llua -llualib -lm
/usr/bin/ld: lua.o: in function `main':
/home/USER/temp/lua1.1/lua/clients/lua/lua.c:22: 警告: the `gets' function is dangerous and should not be used.
make[1]: ディレクトリ '/home/USER/temp/lua1.1/lua/clients/lua' から出ます

実行はできるようです。

$ ./lua
a = 100
print(a)
100

今後

今回はとりあえず、ビルドを通すまでを行ってみました。
このあと、なんでこのような修正が必要なのかを書いていこうかと思います。

Discussion