Hybrid CC を Windows で動かす

2004-08-27 : 書いてみた
2004-08-29 : debug.c を修正

Hybrid CC という処理系を Windows なバイナリとして動かす方法とか(README には WindowsNT で動きますとか書いてあるけど)。

ビルド環境は

の二通りで試しています。

元のソースからの変更点

  1. parer.y, y.tab.c (by 若槻君 and 水野君)
    parser.y 17行目の
    FILE *yyout = stderr;
    
    をこのままビルドするとエラーがでるので次のように修正。
    FILE *yyout;
    FILE *debug;
    
    で、修正したので bison に一回かける必要があるんやけど、 Windows の開発環境には bison が用意されていないのでここだけ Cygwin の力を借りることにした。 (と書いてるうちに。MS が配布している SFU に入っているんじゃないかな、と思った。)
  2. debug.c
    コマンドラインの解析に使っていると思われる firstToken と nextToken では strtok_r 関数が使われています。 しかし、Windows には strtok_r がないため、リンク時にみつからずエラーになります。ここを strtok に書き換えます。 次の例では汎用性を持たせるために(?) #ifdef を使っています。
    1. 冒頭部
      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
      

      と書き換えます。

    2. 関数部
      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;
      }
      
      と書き換えます。

    strtok_r から strtok への書き換えで引数への作用が変わるため、次の main.c の書き換えが必要になります。
  3. main.c
    135行目付近の if 文で呼んでいる upload_hcc_file(argv[0]) の引数を変更します。 strtok_r が動いていると、この時点で argv[0] には最後の引数(hcc では読み込むべき Hybrid CC ソース)が入っているようなのですが、 その部分を変更したので、argv[argc-1] と直接、最後の引数を指定するようにします。
        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 がマクロ定義されている場合無視されるようだったので、無視せず出力させる用にしました。
  4. makefile.win32
    スタティックな hcc.exe を新規に作成。.NET Framework の nmake 用です。src ディレクトリ上で
     > nmake -f makefile.win32
    
    と使ってください。src ディレクトリ上に hcc.exe がビルドされるはずです。

    hcc.tar.gz 展開後にできる windows ディレクトリに、VC++6.0 のプロジェクトファイルがあり、 これを使うと dll とかもできるようで、実際に Visual Studio.NET ではビルド・実行できることを確認しました。 Visual Studio.NET 使いはこれを使った方が無難かも。

ダウンロード

とりあえず変更したファイルのみ置いておきます。hcc.tar.gz 展開後にできる src にすべてぶちこんで下さい。 このパッチを用いたことによる事故・不利益などにおきまして稲垣は責任を負いかねますので、自己責任の上で御利用下さい。

Source[tar.gz]
hcc-win32.tar.gz
Source[zip]
hcc-win32.zip

独り言

JNI とつなげるなら .dll があったほうがいいのかなぁ。



<< 戻る

最終更新日 2004/8/29 Ryoichi INAGAKI <inagaki@ueda.info.waseda.ac.jp>