| NetBSD 解説 | sysinst | pkgsrc 各論 | packages | macppc | TsubaiBSD | 絹/software/全文検索
at www.ki.nu

NetBSD 解説

Last Update: "2008/07/15 11:18:05 makoto" . . . 2008/07/14 の日記

cross compiler

Windows

Windows の上で使えるオープンソースのコンパイラには mingw と cygwin の gcc があります。このうち、mingw を使うと、 「何も他に必要としないで、cygwin の入っていない機械でも、 そのまま実行出来る」 ような実行形式が出来ます。 これはとても便利です。 ここでは、その mingw を使って NetBSD 上にクロスコンパイラを作って見ます。

クロスコンパイラを用意する一般的な方法は次の三つを準備することです。

  1. lib/include
  2. binutils
  3. gcc
1. の lib/include は、 「標的とする環境でもし(セルフ)コンパイルをすると仮定して、 その時に使うライブラリとへッダファイル」 と全く同じものを使います。

次の 2. binutils はアセンブラ・リンカ(as/ld) などを始めとする gcc の下請けとも言えるプログラムです。 その他に objdump など便利な道具も入っています。 これを標的とする環境用に構成します。

最後の 3. gcc も同じようにして標的とする環境用に構成します。

前提として 配布形式 (distfiles) を $DISTFILES に用意してあり、また $LOCALSRC のディレクトリで作業するとします。 今回使う配布形式は次のようなものです。

> (cd $DISTFILES;ls -l binutils-2.15.tar.* gcc-3.4.3* mingw-run*5.t* w32api-3.1.*) -rw-r--r-- 1 makoto wheel 11515075 May 18 2004 binutils-2.15.tar.bz2 -rw-r--r-- 1 makoto wheel 27425338 Nov 5 18:00 gcc-3.4.3.tar.bz2 -rw-r--r-- 1 makoto wheel 443702 Dec 25 16:12 mingw-runtime-3.5.tar.gz -rw-r--r-- 1 makoto wheel 1523310 Dec 25 16:50 w32api-3.1.tar.gz

1. lib/include

これはコンパイル済のものが 用意してあるので、 設置先で開けるだけです。ここでは設置先を /usr/local/i386-mingw32 とします。もしコンパイル済のものがない時には、これも用意する必要が ありますが、今回は(やったことがないので)その説明は省きます

mingw-runtime と w32api は http://www.mingw.org/download.shtml の画面の下の方に一覧があるので、そこから取得します。

> sudo mkdir /usr/local/i386-mingw32 > cd /usr/local/i386-mingw32 > sudo tar zxf $DISTFILES/mingw-runtime-3.5.tar.gz > sudo tar zxf $DISTFILES/w32api-3.1.tar.gz

2. binutils

--target=i386-mingw32 を指定して configure します。
> cd $LOCALSRC > tar zxf $DISTFILES/binutils-2.15.tar.bz2 > mkdir binutils-work > cd binutils-work > ../binutils-2.15/configure --target=i386-mingw32 > make > sudo make install

3. gcc

これも同じく --target=i386-mingw32 を指定して configure します。 gcc を make する時には gmake を使った方が簡単です。 また、簡単のため C と C++ だけを作ることにします。
> tar zxf $DISTFILES/gcc-3.4.3.tar.bz2 > mkdir gcc-work > cd gcc-work > ../gcc-3.4.3/configure --target=i386-mingw32 --enable-languages=c,c++ > gmake > sudo make install
これで、gcc は、bin/i386-mingw32-gcc という名前で設置されます。

動作確認

まずは Hello World! をコンパイルします。hello.c の中身は次の通りです。
> cat hello.c #include "stdio.h" main (){ printf( "hello world!\n"); }

このような内容を用意しておいて、 いま作ったばかりの i386-mingw32-gcc を使い、 次のようにすれば、Windows/2000 等用の実行形式が出来ます。
> rehash > i386-mingw32-gcc -o hello-win2k.exe hello.c > file hello-win2k.exe hello-win2k: MS Windows PE 32-bit Intel 80386 console executable not relocatable

これを何らかの方法で Window の機械に転送します。 ftp を使うならおそらく bin の指定が必要になります。 そして、それを DOS 窓で実行します。

binutils

hello.c は簡単すぎるので、もう少し大きなものはどうなるかと いうことで、 例えば、windows で動く、powerpc (NetBSD)用のアセンブラを作ってみます。 一例ですが、configure の時に指定する引数は次のようにします。
指定内容引数引数に与える値
make する機械 --build i386--netbsd
作ったアセンブラを動かす機械 --host i386-mingw32
そのアセンブラが作り出すコードを動かす機械 --target powerpc--netbsd
> env CC=i386-mingw32-gcc \ ../binutils-2.15/configure \ --target=powerpc--netbsd \ --host=i386-mingw32 \ --build=i386--netbsd > env CC=i386-mingw32-gcc make
これでクロスアセンブラが、 gas/as-new という名前で出来ます。

objdump

pkgsrc

pkgsrc/cross の下に i386-mingw32 があります。 これがここで説明しているものと同じ機能のはずです。 2006/09 に見たところ次のような組合せを使っています。
Version		Makefile,v 1.27 2006/06/09 15:50:03 minskim
binutils	2.15.90-20040222-1-src.tar.gz	(2.15)
		
gcc		3.3.3				(3.4.3)
		gcc-3.3.3-20040217-1-src.diff  
mingw-runtime	mingw-runtime-3.2.tar.gz       	(3.5)
w32api		w32api-2.5.tar.gz              	(3.1)
ここで紹介している版(かっこ内に示したもの)よりやや古いのが気になります。

現在、4 点 必要なもののうち次の 3 点は

mingw-w32api
mingw-rutime-bin
mingw-binutils
wip ( http://sourceforge.net/projects/pkgsrc-wip/ ) にも用意してあります。 また、ちょっと変則的ですが、 http://cvsweb.ki.nu/mef/personal-pkgsrc/i386-mingw32/ を sudo make package すれば、環境は用意出来るかと思います。

その他

ここでは binutils と gcc を作る時に、--prefix の指定をしませんでした。この方法の場合、設置されるものは /usr/local の下に散らばります。これが必要なくなった場合など、 入れたものを手で消そうとする時は、 ちょっと手間がかかります。それを避けたければ、 configure する時に、引数に、 例えば、 --prefix=/usr/local/i386-mingw32 を加えておけば、その下にまとめて入れてくれます。 しかし使い勝手は、多分、散らばってしまった方がいいはずです。

何かお気付の点がありましたら makoto at ki dot nu までお知らせ下さい。

(以下は宣伝)

rakuraku-emacs-cover 便利なツール Emacs らくらく 入門 --- 全国書店等で好評発売中
( http://books.ki.nu/rakuraku/ )

old pkgsrc

この画面は Jeedosaquin によって表示しています。

1.66 2008/03/08