Goその2
というわけで、gccgoは断念。以下cygwin compileの時用備忘録。
- とりあえずCygwinにmercurial, bison/flex, edをinstall.
- http://golang.org/doc/install.html にしたがってhgでソースをダウンロード
- $GOROOT=ダウンロードしたパス, $GOBIN=実行ファイルつくるディレクトリ, $GOOS=cygwin, $GOARCH=386、$PATH=$GOBIN:$PATHにしておく。
- src/make.bash内のOS指定のところにcygwinを追加
- src/cmd/cov/Makefile, src/cmd/prof/Makefile に
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の中身追わないとか。
結構やっかいだなぁ。。。