gentooからmingwのクロスコンパイル

そろそろDirectX関連の活動を再開しようと コードを触りはじめたのだが
5月いっぱいw3mばかり弄っていたのもあって、
IDE触るのがどうもたるい。
これは一種のvi病のような気もするが、
マウス操作は当然のこととしてホームポジションから離れるのが
めんどくさ。
そこでcygwin上のvimからDirectXの開発をしようとしたのだが
set makeprg=vcbuild
というような感じでビルドまではできるのだが
cl.exe用の定義がないのでquickfixできないのでリズムが悪い。
そこで、gccを使ってみることにする。
DEFINEとかCFLAGS, LDFLAGSを多少工夫する必要があったが
vcと同じコードをコンパイルし実行することができた。

# DirectXのパス通し
 $ ln -s "/cygdrive/C/Program Files/Microsoft DirectX SDK (November 2008)/Lib/x86" /usr/local/lib/DirectX
 $ ln -s "/cygdrive/C/Program Files/Microsoft DirectX SDK (November 2008)/Include/x86" /usr/local/include/DirectX
 CXXFLAGS=-I/usr/local/include/DirectX
 LDFLAGS=-L/usr/local/lib/DirectX -ld3dxof -ldxguid -ld3dx9 -ld3d9 -lwinmm

ついでなのでcygwin.dllに依存しないように-mno-cygwinオプションを追加してみたところ

gcc: The -mno-cygwin flag has been removed; use a mingw-targeted cross-compiler.

とかいわれる。
しかし今使っているのはgcc-4なので、
mingwを入れるとgcc-3の方が混ざってしまいぐちゃぐちゃになるのでcygwinmingwは避けたい。
こうして、
どうせcross-compileerならLinuxの方に用意すればいいじゃないと思い至った。 
(前置き終わり)


(ここからgentoo)
調べてみたところcrossdevというのを使えばいいらしいのでやってみた。

# emerge crossdev

これはすぐに終わる。

つぎにMingwをターゲットにしてクロスコンパイル環境をビルドする。

# crossdev -t i686-mingw32                                          --------------------------------------------------------------------------------
 * Host Portage ARCH:     x86
 * Target Portage ARCH:   x86
 * Target System:         i686-mingw32
 * Stage:                 4 (C/C++ compiler)

 * binutils:              binutils-[latest]
 * gcc:                   gcc-[latest]
 * headers:               w32api-[latest]
 * libc:                  mingw-runtime-[latest]

 * PORTDIR_OVERLAY:       /usr/portage/local/pc_local
 * PORT_LOGDIR:           /var/log/portage
 * PKGDIR:                /usr/portage/packages/cross/i686-mingw32
 * PORTAGE_TMPDIR:        /var/tmp/cross/i686-mingw32
  _  -  ~  -  _  -  ~  -  _  -  ~  -  _  -  ~  -  _  -  ~  -  _  -  ~  -  _  -
 * Forcing the latest versions of {binutils,gcc}-config/gnuconfig ...     [ ok ]
 * Log: /var/log/portage/cross-i686-mingw32-binutils.log
 * Emerging cross-binutils ...                                            [ ok ]
 * Log: /var/log/portage/cross-i686-mingw32-w32api-quick.log
 * Emerging cross-w32api-quick ...                                        [ ok ]
 * Log: /var/log/portage/cross-i686-mingw32-mingw-runtime-headers.log
 * Emerging cross-mingw-runtime-headers ...                               [ ok ]
 * Log: /var/log/portage/cross-i686-mingw32-gcc-stage1.log
 * Emerging cross-gcc-stage1 ...                                          [ ok ]
 * Log: /var/log/portage/cross-i686-mingw32-w32api.log
 * Emerging cross-w32api ...                                              [ ok ]
 * Log: /var/log/portage/cross-i686-mingw32-mingw-runtime.log
 * Emerging cross-mingw-runtime ...                                       [ ok ]
 * Log: /var/log/portage/cross-i686-mingw32-gcc-stage2.log
 * Emerging cross-gcc-stage2 ...                                          [ ok ]

しばらく放置しておけば
なんの問題もなくあっさり完了していた。

最後、使ってみる

$ cat wintest.c
#include <windows.h>

int WINAPI WinMain (HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
        PSTR szCmdLine,
            int iCmdShow)
{
    MessageBox (NULL, "Hello", "Hello Demo", MB_OK);
      return (0);
}
$ i686-mingw32-gcc wintest.c -o wintest.exe -mwindows
$ wine wintest.exe
# 動いた

さらにWindowsXPにもっていっても問題なく動いた。
思ったよりお手軽だ。
うちはGentooマシンが一番パワーあるので助かる。
後でDirectXを使うものがいけるか試してみるとしよう。