|▽ ̄)ノ なページ再帰 - GcLでMGWx/MinGWクロスコンパイル環境と設定
Gentoo coLinux で MinGW クロスコンパイル >> MinGW クロスコンパイル環境と設定

MinGW クロスコンパイル環境と設定


MinGW クロスコンパイルに必要なファイルのダウンロード、保存場所の確認、各種ツールのコンパイル、環境設定を行います。

目次

用意するもの


ダウンロードしたファイルは cofs 経由で Gentoo coLinux に渡します。直接ネット接続できる状態であれば wget で落としてください。

MinGW GCC


MinGW ダウンロードページから次のファイルを取得してください。バージョンは最新のものでかまわないと思いますが、うまくいかないときはこのバージョンを試してください。
MinGW - Minimalist GNU for Windows
http://sourceforge.net/project/showfiles.php?group... http://www.mingw.org/download.shtml
  • mingw-runtime-3.9.tar.gz
  • gcc-core-3.4.4-20050522-1-src.tar.gz
  • gcc-g++-3.4.4-20050522-1-src.tar.gz
  • w32api-3.6.tar.gz
  • mingw-utils-0.3-src.tar.gz
必要なら g77 も。

Binutils


PE ファイル用の Binutils をコンパイルする必要があります。次のページからファイルを取得してください。
Index of /gnu/binutils
http://ftp.gnu.org/gnu/binutils/
  • binutils-2.16.tar.bz2

unzip


zip ファイルの解凍には unzip が必要です。 UnZip は解凍専用の PKZIP ツールです。
Info-ZIP's UnZip
http://www.info-zip.org/UnZip.html
  • unzip552.tar.gz

保存場所


インストール先とクロスコンパイルに使用するファイルの置き場所を決め、ディレクトリを作成します。

ここでは /opt/xmingw32/ にインストールすることにします。 MinGW 環境に関するファイルはその下の src ディレクトリに置きます。
mkdir /opt/xmingw32/ mkdir /opt/xmingw32/src

以降の説明では /opt/xmingw32/ を ${XMINGW} 、/opt/xmingw32/src を ${XMGWSRC} で示します。

コンパイルとインストール


ソースをコンパイルしインストールします。

MinGW ランタイムのインストール


MinGW ランタイムをインストールします。解凍するだけです ;-)
cd ${XMINGW}
mkdir mingw32
cd mingw32
tar -zxf ${XMGWSRC}/mingw-runtime-3.9.tar.gz
tar -zxf ${XMGWSRC}/w32api-3.6.tar.gz

Binutils のコンパイル


手順は参考文献「クロスビルド環境の構築」とほぼ同じです。 build ディレクトリを作るところが違います。
cd ${XMGWSRC}
tar -jxf binutils-2.16.tar.bz2
cd binutils-2.16
mkdir build
cd build
../configure --prefix=${XMINGW} --target=mingw32 --disable-nls --disable-shared
make CFLAGS="-O2 -fno-exceptions" LDFLAGS=-s >make.log 2>&1

インストールします。
make install >install.log 2>errinstall.log

errinstall.log にエラーが記録されてなければインストールできているはずです。

実行してみます。次のように表示されれば成功です。
localhost build # ${XMINGW}/bin/mingw32-strings --help
Usage: /opt/xmingw32/bin/mingw32-strings [option(s)] [file(s)]
 Display printable strings in [file(s)] (stdin by default)
 The options are:
  -a - --all                Scan the entire file, not just the data section
  -f --print-file-name      Print the name of the file before each string
  -n --bytes=[number]       Locate & print any NUL-terminated sequence of at
  -<number>                 least [number] characters (default 4).
  -t --radix={o,d,x}        Print the location of the string in base 8, 10 or 16
  -o                        An alias for --radix=o
  -T --target=<BFDNAME>     Specify the binary file format
  -e --encoding={s,S,b,l,B,L} Select character size and endianness:
                            s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit
  -h --help                 Display this information
  -v --version              Print the program's version number
/opt/cross-tools/mingw32/bin/mingw32-strings: supported targets: pe-i386 pei-i38
6 elf32-i386 elf32-little elf32-big srec symbolsrec tekhex binary ihex
Report bugs to <URL:http://www.sourceware.org/bugzilla/>

ソースは不要なので削除します。
cd ../..
rm binutils-2.16 -r
追記

プリフィクスが付かない dllwrap を要求する場合があるので、 ${XMINGW}/bin/mingw32-dllwrap を ${XMINGW}/mingw32/bin にコピーするかシンボリックリンクを作成します。
# コピーする場合。
cp ${XMINGW}/bin/mingw32-dllwrap ${XMINGW}/mingw32/bin/.
# シンボリックリンクを作成する場合。
ln -s ${XMINGW}/bin/mingw32-dllwrap ${XMINGW}/mingw32/bin/.

MinGW GCC のコンパイル


作成した Binutils にパスを通し、MinGW GCC パッケージを解凍、 configure 、make 、インストールします。

MinGW 環境用の Binutils を使うために、${XMINGW}/bin にパスを通します。
PATH=${XMINGW}/bin:$PATH

カレントディレクトリを ${XMGWSRC} に移し、 core, g++ を解凍します。 g77 が必要ならそれも解凍します。
cd ${XMGWSRC}
tar -zxf gcc-core-3.4.5-20051220-1-src.tar.gz
tar -zxf gcc-g++-3.4.5-20051220-1-src.tar.gz

カレントを移動します。
cd gcc-3.4.5-20051220-1

ビルド ディレクトリを作成しカレントを移動します。
mkdir build
cd build

いくつか configure オプションを指定し実行します。 g77 を含める場合は --enable-languages にカンマを挟んで g77 を追加してください。
../configure --prefix=${XMINGW} --target=mingw32 --host=${MACHTYPE} --enable-threads --disable-nls --disable-win32-registry --disable-shared --enable-languages=c,c++ --enable-sjlj-exceptions --enable-libstdcxx-debug
  • --disable-win32-registry は不要です。たぶん。

make を実行します。
make CFLAGS="-O2 -fomit-frame-pointer" LDFLAGS=-s >make.log 2>&1

環境によってコンパイル時間は変わります。20分ほどで終わると思います。make.log にエラーが記録されてなければコンパイル成功です。

インストールします。
make install >install.log 2>errinstall.log

errinstall.log にエラーが記録されてなければインストールできているはずです。

実行してみます。
mingw32-gcc --version

次のように表示されれば成功です。
 gcc (GCC) 3.4.5 (mingw special)
 Copyright (C) 2004 Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

以降、ソースは不要なので削除します。
cd ../..
rm gcc-3.4.5-20051220-1 -r
追記 [2006/3/2thu]

3.4.5-20060117-1 も同じ方法でコンパイルできます。

mingw-utils のコンパイル


mingw-utils には pexports や reimp といったツールが含まれています。 drmingw, redir, res2coff はクロス コンパイル環境で利用できませんが、他のツールは使えます。必須ではありません。

カレントディレクトリを ${XMGWSRC} に移し、 mingw-utils を解凍します。
cd ${XMGWSRC}
tar -zxf mingw-utils-0.3-src.tar.gz

カレントを移動します。
cd mingw-utils-0.3

ビルド ディレクトリを作成しカレントを移動します。
mkdir build
cd build

いくつか configure オプションを指定し実行します。
../configure --prefix=${XMINGW}/mingw32 --target=mingw32 --host=${MACHTYPE} CFLAGS="-O2 -march=pentiumpro" LDFLAGS="-s"

make を実行します。
make >make.log 2>&1

make.log にエラーが記録されてなければコンパイル成功です。

インストールします。
make install >install.log 2>errinstall.log

errinstall.log にエラーが記録されてなければインストールできているはずです。

mingw/bin/dsw2mak ファイルの行頭 #!gawk -f を #!/bin/gawk -f に変更します。

unzip のコンパイル


zip ファイルは gzip/gunzip で解凍できません。専用の unzip を使います。

ソースアーカイブを解凍し、カレントを移します。 LICENSE, INSTALL, README に目を通してください。
tar -zxf unzip552.tar.gz
cd unzip-5.52

make を実行します。
make -f unix/Makefile generic

test します。
make -f unix/Makefile test

最後に「##### testing complete.」と表示されていれば成功です。

インストールします。
make -f unix/Makefile install >install.log 2>errinstall.log

errinstall.log にエラーが記録されていなければ成功です。

以降、ソースは不要なので削除します。
cd ..
rm unzip-5.52 -r

MinGW 環境の設定


MinGW 環境下で実行するための共通環境設定ファイル、シェルスクリプト、configure パラメータ設定済みシェルスクリプト。

クロス環境の設定ファイル


ホスト環境を汚染せずクロスコンパイルを行うために、作業はシェルスクリプトを介し実行します。またクロスコンパイルに伴う決まりきった設定を省略し、当面の問題に集中できるようにします。
共通設定ファイル

cross.env のファイル名で ${XMINGW}/. に保存してください。
# cross.env
#PREFIX=/opt/xmingw32
TARGET=mingw32

PATH="${PREFIX}/local/bin:${PREFIX}/${TARGET}/bin:${PREFIX}/bin:${PATH}"
export CC="mingw32-gcc "
export CXX="mingw32-g++ "
export C_INCLUDE_PATH="${PREFIX}/local/include:${PREFIX}/${TARGET}/include:${PREFIX}/include"
export CPLUS_INCLUDE_PATH=${C_INCLUDE_PATH}
#export LIBRARY_PATH="${PREFIX}/local/lib:${PREFIX}/${TARGET}/lib:${PREFIX}/lib"
export LD_LIBRARY_PATH="${PREFIX}/local/lib:${PREFIX}/${TARGET}/lib:${PREFIX}/lib:${LD_LIBRARY_PATH}"
export OBJDUMP="${PREFIX}/bin/mingw32-objdump "
export PKG_CONFIG_PATH="${EXTRA_PKG_CONFIG_PATH}:${PREFIX}/local/lib/pkgconfig:${PREFIX}/${TARGET}/lib/pkgconfig"

#export BUILD_FOR_CC="build4cc "
#export BUILD_FOR_CXX="build4cxx "

export MANPATH=${PREFIX}/man:${XLOCAL}/man:${MANPATH}
export INFOPATH=${PREFIX}/info:${XLOCAL}/info:${INFOPATH}

config_commands="
cppunit-config
aalib-config
fftw-wisdom-to-conf
freetype-config
gimptool-2.0
libart2-config
libpng-config
libwmf-config
${TARGET}-croco-0.6-config
${TARGET}-sdl-config
xml2-config
"
for c in $config_commands
do
  v=`echo $c | sed 's/-[0-9]\+\.[0-9]\+//'`
  v=`echo $v | sed "s/^${TARGET}-//"`
  v=`echo $v | tr '[:lower:]-' '[:upper:]_'`
  vv=$(eval echo `echo \\$$v`)
  if test -z $vv
  then
    for p in $PREFIX/local/bin $PREFIX/$TARGET/bin $PREFIX/bin
    do
      if test -f "$p/$c"
      then
        export $v="$p/$c"
        break
      fi
    done
  fi
done
シェルスクリプト

cross のファイル名で ${XMINGW}/. に保存してください。
#!/bin/sh
prog=$1
shift
PREFIX=/opt/xmingw32
. ${PREFIX}/cross.env
${prog} "$@"

cross のパーミッションを変更します。
chmod 755 ${XMINGW}/cross

実行してみます。
${XMINGW}/cross gcc --version

次のように表示されれば成功です。
args:  gcc --version
gcc (GCC) 3.4.5 (mingw special)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
configure パラメータ設定済みシェルスクリプト

cross-ppconfigure のファイル名で ${XMINGW}/. に保存してください。ソース ディレクトリ下に build ディレクトリを作成しコンパイルする場合の設定です。
#!/bin/sh

CONFIG_SHELL=/bin/sh
export CONFIG_SHELL

PREFIX=/opt/xmingw32
. ${PREFIX}/cross.env
echo -n "args: "
echo "$@"

cache=cross-config.cache
sh ../configure --cache-file="$cache" \
	--target=${TARGET} --host=${TARGET} --build=${MACHTYPE} \
	"$@"
status=$?
rm -f "$cache"
exit $status

パーミッションを変更します。
chmod 755 ${XMINGW}/cross-ppconfigure

ビルド環境の設定ファイル


クロスコンパイルに際しビルド環境下で実行するファイルを生成する場合があります。このような作業を行うツールは configure で BUILD_FOR_CC や BUILD_FOR_CXX を取ります。ここではそれら変数に与えるシェルスクリプトを作成します。
共通設定ファイル

build4cc.env のファイル名で ${XMINGW}/. に保存してください。
BUILD_PREFIX=/usr

export CC="${BUILD_PREFIX}/bin/gcc "
export CXX="${BUILD_PREFIX}/bin/g++ "
export C_INCLUDE_PATH="${BUILD_PREFIX}/local/include:${BUILD_PREFIX}/include"
export CPLUS_INCLUDE_PATH=${C_INCLUDE_PATH}

export PKG_CONFIG_PATH="${BUILD_PREFIX}/local/lib/pkgconfig:${BUILD_PREFIX}/lib/pkgconfig"
export LD_LIBRARY_PATH="${BUILD_PREFIX}/local/lib:${BUILD_PREFIX}/lib:${LD_LIBRARY_PATH}"
#export LIBRARY_PATH="${BUILD_PREFIX}/local/lib:${BUILD_PREFIX}/lib"

export OBJDUMP=${BUILD_PREFIX}/bin/objdump
build4cc

build4cc のファイル名で ${XMINGW}/bin/. に保存してください。
PREFIX=/opt/xmingw32
. ${PREFIX}/bin/build4cc.env
${CC} "$@"

パーミッションを変更します。
chmod 755 ${XMINGW}/bin/build4cc
build4cxx

build4cxx のファイル名で ${XMINGW}/bin/. に保存してください。
PREFIX=/opt/xmingw32
. ${PREFIX}/bin/build4cc.env
${CXX} "$@"

パーミッションを変更します。
chmod 755 ${XMINGW}/bin/build4cxx

リンク

MinGW - Home
http://www.mingw.org/
総本山。
GNU Binutil
http://sources.redhat.com/binutils/
総本山です。メーリング リストやドキュメントがあります。
Info-ZIP Home Page
http://www.info-zip.org/
PKZIP の圧縮解凍ツールです。 zip ファイルの操作に使います。

参考文献

win2linuxwiki - Info/Linux上でのMS-Windows向けGTKアプリのビルド
http://win2linux.sourceforge.jp/pukiwiki/index.php...
Building GTK apps for MS Windows on Linuxの日本語訳です。 GTK アプリをクロスコンパイルする方法が書かれています。 binutils と MinGW GCC のコンパイル&インストール、 GTK アプリのビルド方法など。
win2linuxwiki - Info/クロスビルド環境の構築
http://win2linux.sourceforge.jp/pukiwiki/index.php...
上記訳者の実践による記事。 binutils と MinGW GCC のコンパイル&インストール、 Gtk+2 パッケージのインストール。
Cross-compiled win32 build environment under Linux
http://www.libsdl.org/extras/win32/gcc.html
libsdl をクロスコンパイルするためのシェルスクリプト。

更新履歴


2007/6/16sat mingw-utils のコンパイルに、 dsw2mak の修正を追記。
2007/3/17sat cross.env を改良。
2007/2/18sun mingw-utils のコンパイル方法を追記。
2007/2/9fri ページ統合。「 MinGW ランタイムのインストール」を修正。シェルスクリプトを修正。
2006/7/9sun BUILD_FOR_CC 関係の設定を記述した。
2006/3/9thu cross の echo 行を削除した。
2006/3/3fri 修正。
2006/3/2thu MinGW GCC 関連の不備の修正と追記。
2006/2/21tue cross に手を加えた。"$@" を使うようにした |_T)
2006/2/18sat cross に手を加えた。 CFLAGS="-O2 -DNDEBUG" のような引数を渡せるようになった。
2006/2/14tue dllwrap に関する記述を追記。
2006/2/13mon unzip、MinGW 環境の設定を記述。ソースの削除を追記。記述の整合性を調整。
2006/2/12sat MinGW GCC を記述。
2006/2/11sat ページ作成。