FreeBSDにMinGWをインストール

FreeBSDMinGWを導入するメモ。
GNU CコンパイラWindowsプログラムをクロスコンパイル出来る様になる。

インストール

Ports化されてるのでインストールは簡単。
Portsでdevel/mingw32-gccをインストールする。
これで、MinGWのライブラリも依存関係で自動的にインストールされる。


インストールされたツールは、/usr/local/bin/mingw32-*****という名前で使える。
gccならmingw32-gccになっている。

$ cd /usr/local/bin
$ ls mingw32-*
mingw32-addr2line       mingw32-gcc             mingw32-mingw32-gcjh
mingw32-addr2name.awk   mingw32-gcc-3.4.5       mingw32-nm
mingw32-ar              mingw32-gccbug          mingw32-objcopy
mingw32-as              mingw32-gcj             mingw32-objdump
mingw32-c++             mingw32-gcjh            mingw32-ranlib
mingw32-c++filt         mingw32-gcov            mingw32-readelf
mingw32-cpp             mingw32-grepjar         mingw32-size
mingw32-dlltool         mingw32-jar             mingw32-strings
mingw32-dllwrap         mingw32-jcf-dump        mingw32-strip
mingw32-g++             mingw32-jv-scan         mingw32-windres

サンプルプログラム

適当なサンプルプログラムを作ってmingw32-gccコンパイルすれば、勝手に拡張子にexeが付いてWindows用のプログラムが出来上がる。

$ mingw32-gcc test.c
$ ls *.exe
a.exe


システムに依存する関数は使えない。
下記プログラムはFreeBSDgccではコンパイル出来るが、mingw32-gccではgrp.hがインクルード出来ずにコンパイルエラーが出る。

#include 
#include  /* グループ情報を扱うヘッダ */

int main()
{
    struct group *g;

    g = getgrent();

    /* FreeBSDならwheelが表示される */
    printf("%s\n", g->gr_name);

    return 0;
}

GNUツールを移植

試しにgzip 1.3.9を移植してみる。
GNUツールの中でも、これは簡単に移植できる。


ソースを展開して、gzip.cの最初の方に「#define SIGPIPE 13」を付け加える。

#ifdef RCSID
static char rcsid[] = "$Id: gzip.c,v 1.11 2006/12/12 00:03:17 eggert Exp $";
#endif

#define SIGPIPE 13

#include 
#include 
#include 
#include 
#include 
#include 


下記の通りにconfigureする。
CFLAGS(コンパイラオプション)は好みで指定する。
gzipの場合、hostとtargetをmingw32にするのがミソ。

$ CFLAGS="-O2 -fno-strict-aliasing -pipe" \
./configure \
--host=mingw32 \
--target=mingw32


makeするとgzip.exeが出来上がり、windowsにコピーして使う事が出来る。