Hybrid CC という処理系を Windows なバイナリとして動かす方法とか(README には WindowsNT で動きますとか書いてあるけど)。
ビルド環境は
の二通りで試しています。
FILE *yyout = stderr;をこのままビルドするとエラーがでるので次のように修正。
FILE *yyout; FILE *debug;で、修正したので bison に一回かける必要があるんやけど、 Windows の開発環境には bison が用意されていないのでここだけ Cygwin の力を借りることにした。 (と書いてるうちに。MS が配布している SFU に入っているんじゃないかな、と思った。)
extern char *strtok_r(char *, const char *, char **); /* not in string.h ?? */を
#ifndef WIN32 extern char *strtok_r(char *, const char *, char **); /* not in string.h ?? */ #else #include <string.h> /* use strtok instead of strtok_r */ #endif
と書き換えます。
static char *firstToken(COMMAND_ARG *args) {
return strtok_r(args->line, " ", &args->line);
}
static char *nextToken(COMMAND_ARG *args) {
return strtok_r(NULL, " ", &args->line);
}
を
#ifndef WIN32
static char *firstToken(COMMAND_ARG *args) {
return strtok_r(args->line, " ", &args->line);
}
static char *nextToken(COMMAND_ARG *args) {
return strtok_r(NULL, " ", &args->line);
}
#else
static char *firstToken(COMMAND_ARG *args) {
return strtok(args->line, " ");
}
static char *nextToken(COMMAND_ARG *args) {
return strtok(NULL, " ");
}
#endif
static char *allTokens(COMMAND_ARG *args) {
return args->line;
}
と書き換えます。
if (upload_hcc_file(argv[0]) == 0)
を
/* side effect of using strtok at debug.c */ #ifndef WIN32 if (upload_hcc_file(argv[0]) == 0) #else if (upload_hcc_file(argv[argc-1]) == 0) #endifと書き換えます。ついでに argc < 2 のときに usage を出力するのですが、 WIN32 がマクロ定義されている場合無視されるようだったので、無視せず出力させる用にしました。
> nmake -f makefile.win32と使ってください。src ディレクトリ上に hcc.exe がビルドされるはずです。
とりあえず変更したファイルのみ置いておきます。hcc.tar.gz 展開後にできる src にすべてぶちこんで下さい。 このパッチを用いたことによる事故・不利益などにおきまして稲垣は責任を負いかねますので、自己責任の上で御利用下さい。
JNI とつなげるなら .dll があったほうがいいのかなぁ。