Goその2

というわけで、gccgoは断念。以下cygwin compileの時用備忘録。

install-cygwin_nt-5.1:

を追加。(XPの場合)

  • src/libmach/cygwin_nt-5.1.c なる空のファイルを生成
  • src/include/u.h の AUTOLIB マクロをスキップ
  • src/include/libc.h の p9setjmp マクロをコメントアウトして、代わりに
int p9setjmp(p9jmp_buf env);

を追加

  • src/lib9/jmp.c を変更
int p9setjmp(p9jmp_buf buf) {
  buf[_SAVEMASK] = 1;
  sigprocmask (SIG_SETMASK, 0, (sigset_t *)(buf + _SIGMASK));
  return setjmp (buf);
}

void
p9longjmp(p9jmp_buf buf, int val)
{
  //    siglongjmp((void*)buf, val);
  // Copied from /usr/include/machine/setjmp.h
  __extension__ ({
    if (buf[_SAVEMASK]) {
      sigprocmask(SIG_SETMASK, (sigset_t *)(buf + _SIGMASK), 0);
    }
    longjmp (buf, val);
  });
}

void
p9notejmp(void *x, p9jmp_buf buf, int val)
{
        USED(x);
        //      siglongjmp((void*)buf, val);
  // Copied from /usr/include/machine/setjmp.h
  __extension__ ({
    if (buf[_SAVEMASK]) {
      sigprocmask(SIG_SETMASK, (sigset_t *)(buf + _SIGMASK), 0);
    }
    longjmp (buf, val);
  });
}
  • src/libcgo/cygwin_386.c を linux.c からコピー
  • src/pkg/runtime/cygwin/386, を src/pkg/runtime/linux/386 あたりからコピー
  • src/pkg/syscall, src/pkg/os, src/pkg/net ないの*linux*を*cygwin*にコピー

これでとりあえずコンパイルできるようになる様子。(書き漏らしてなければ、だけど)
ただ、そもそもPEをどうやらサポートしていない様子。結局だめジャン。。。OTL
src/cmd/ld/elf.cとかあるので、あとはpe.cでも作ればいいとは思うけど、PEなんて生でいじったことない+goの中身追わないとか。
結構やっかいだなぁ。。。