Lua ver1.1をビルドしたときのエラーについて
はじめに
以前、以下のような記事を書きました。
clients/lib/iolib.c
のファイルに以下のような修正を加えました。
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;
+}
この修正の以下の部分について調べました。
static FILE *in=stdin, *out=stdout;
修正しない時に発生するエラー(initializer element is not constant)
static FILE *in=stdin, *out=stdout;
上記のままで、ビルドを行うと以下のエラーが出ます。
In file included from iolib.c:10:
iolib.c:21:17: error: initializer element is not constant
21 | static FILE *in=stdin, *out=stdout;
| ^~~~~
iolib.c:21:29: error: initializer element is not constant
21 | static FILE *in=stdin, *out=stdout;
| ^~~~~~
Lua Ver1.1がリリースされた当時のコンパイラ(gcc Ver??)では
これでコンパイルができたのでしょう。
https://godbolt.org/ というページを見つけたので、
ここで一番古いバージョンのgccを使って確認をしてみました。
(x86-64 gcc 4.1.2)
これでコンパイルができるのかなと思ったら、エラーになりました。
Lua 1.1 was released on 08 Jul 1994と
書かれているので、おそらく当時使用していたgcc のバージョンは
2.4.4あたりでしょうか。
http://ftp.tsukuba.wide.ad.jp/software/gcc/old-releases/gcc-2/gcc-2.4.5.tar.bz2
の中のChangeLogをみたら以下のような記載がありました。
Sat Jun 19 03:57:57 1993 Richard Stallman
- Version 2.4.4 released.
でもこのバージョンでもinitializer element is not constant
の
エラーが出るような作りになっているようにも見える。
tree
digest_init (type, init, tail, require_constant, constructor_constant, ofwhat)
tree type, init, *tail;
int require_constant, constructor_constant;
char *ofwhat;
{
// 省略
/* Any type except an array can be initialized
from an expression of the same type, optionally with braces.
For an array, this is allowed only for a string constant. */
if (inside_init && TREE_TYPE (inside_init) != 0
&& ((TYPE_MAIN_VARIANT (TREE_TYPE (inside_init))
== TYPE_MAIN_VARIANT (type))
|| (code == ARRAY_TYPE
&& comptypes (TREE_TYPE (inside_init), type))
|| (code == POINTER_TYPE
&& (TREE_CODE (TREE_TYPE (inside_init)) == ARRAY_TYPE
|| TREE_CODE (TREE_TYPE (inside_init)) == FUNCTION_TYPE)
&& comptypes (TREE_TYPE (TREE_TYPE (inside_init)),
TREE_TYPE (type)))))
{
// 省略
if (require_constant && ! TREE_CONSTANT (inside_init))
{
error_init ("initializer element%s is not constant",
" for `%s'", ofwhat);
inside_init = error_mark_node;
}
else if (require_constant
&& initializer_constant_valid_p (inside_init, TREE_TYPE (inside_init)) == 0)
{
error_init ("initializer element%s is not computable at load time",
" for `%s'", ofwhat);
inside_init = error_mark_node;
}
return inside_init;
}
Lua Ver2.4 -> Ver2.5
Luaの各バージョンのコードを見るとVer2.5で以下のように変わっていました。
Ver2.4
#include "lua.h"
#include "luadebug.h"
#include "lualib.h"
static FILE *in=stdin, *out=stdout;
Ver2.5
#include "lua.h"
#include "luadebug.h"
#include "lualib.h"
FILE *lua_infile, *lua_outfile;
//省略
void iolib_open (void)
{
lua_infile=stdin; lua_outfile=stdout;
luaI_openlib(iolib, (sizeof(iolib)/sizeof(iolib[0])));
lua_setfallback("error", errorfb);
}
HISTORYファイルを見ると以下の記載がありました。
Current version is 2.5
* Changes since version 2.4
+ io and string libraries are now based on pattern matching;
the old libraries are still available for compatibility
+ dofile and dostring can now return values (via return statement)
+ better support for 16- and 64-bit machines
+ expanded documentation, with more examples
まとめ
initializer element is not constant
のエラーが昔の環境では出なかったのかどうかは
わかりませんでした。
https://godbolt.org/ というサイトがあることが知れてよかった。
Lua Ver2.5で initializer element is not constant
のエラーは最新のgccを使っても出なくなっているっぽい。
Discussion