Cygwin でクロスコンパイラ環境を作成

Cygwin は、ここから直接インストールか、一度ダウンロードしてからインストールしますが、一度全部ダウンロードしてからの方が良いと思います。現在では、Cygwin 1.5.25 (2008.6.14)になっています。インストールするときは、項目の Develの右の丸矢印をクリックして その右の指示を、Default から Install に変えます。



インストールすると、1.5GBほどになりますが、Xウィンドウ関連は使わないので、すべて消去してもクロス開発はできます。
Cygwin のインストールができると、GCC のソースをダウンロードします。ここは、比較的早いサイトです。 必要なのは、

binutil
gcc
newlib これは、RedHat か ftp://sources.redhat.com/pub/newlib ftp://sourceware.org/pub/newlib です

の3個あればよいのですが、バージョンの組み合わせによっては、コンパイラがエラーで止まる場合があります。また、gcc については、最新のものは使わないほうがいいようです。H8のクロスコンパイラで、確認したのは、

binutil-2.18
gcc-core-4.2.3
newlib-1.16.0

までです。また、ライブラリなどの、.a ファイルのフォーマットで、-hms(-coff と同じ) と、-elf がありますが、-hms はH8ではよく使われてきましたが、最近では、-elf を使った例が多いようです。また、-coff フォーマットでは、binutils のアセンブラが、2.17 からサポートされなくなっているようです。newlib は、三角関数など、超越関数のライブラリを使わないなら、必要ありません。newlib はクロスコンパイラ環境を作成するとき、時間がかかり、binutil と、gcc 合計よりも時間を要します。また、パソコンのメモリも2GB以上あったほうがいいようです。それでも、HDDのアクセスが頻繁になり、binutil と、gcc 合計で、1時間近くかかることがあります。早くするには、RAMDISKを、2GB以上用意して、パソコンのメモリも4GB以上実装します。この解説で使ったパソコンは、

メモリ 6GB 内3GBをWindowsで使用可能
CPU Core2Duo 2.4GHz L2キャッシュ4MB
OS WindowsXP PRO SP2
RAMDISK 2.6GB 驚速RAMディスク Version 1.0.0 ソースネクスト

です。これでも、binutil と、gcc 合計で、35分ほどかかり、newlib はさらに50分ほどかかります。RAMDISKは、Cygwin インストール後、HDDに Cygwin フォルダごとコピーして残しておき、使うときRAMDISKにもどします。無論、出来上がったクロス開発環境もHDDにコピーして残しますが、tar.gz でパックしておくと、どの パソコンCygwin 環境でも使えます。ちなみに、クロス開発環境では、Cygwin 1.5.19 と、やや古いもので行っています。

ソースの解凍

binutil gcc newlib の各ソースを、/usr/local/. 以下にコピーして、tar または、bz2 なら、bzip2 で解凍します。解凍結果の記録を残すために、適当な log ファイルに残すので、>xxx.log 2>&1 を付け足しています。2>&1 は、エラーメッセージもログファイルに残す指示です。この指示は、解凍ではあまり意味がありませんが、クロスコンパイラでは、どこでエラーなのか、あとで解析(できたらですが)するのに役に立ちます。

cd /usr/local
bzip2 -dc gcc-core-4.2.3.tar.bz2 | tar xvf - >targ423.log 2>&1
tar zxvf newlib-1.16.0.tar.gz >tarn1160.log 2>&1
tar zxvf binutils-2.18.tar.gz >tarb.log 2>&1

解凍すると、/usr/local/. 以下に、gcc-core-4.2.3 newlib-1.16.0  binutils-2.18 の各フォルダが生成されてそれ以下にソースが展開されます。展開された binutils-2.18 以下に、configure という text ファイルを開くと、どのようなCPUが使えるかが判ります。クロスコンパイラ環境を作成するには、 binutils-2.18 を先に、続いて gcc-core-4.2.3  newlib-1.16.0 の順に行います。

結果の格納場所と、CPUの指定

binutils-2.18 フォルダ以下に、作業フォルダ、buildh8 などを作り、cd buildh8 に移動して、そこで作業します。どのCPUで、結果をどこに置くかを指示するため、configure を実行してから、make します。configure は、binutils-2.18 フォルダ内にあるので、../ とパスを指定します。--prefix= は、結果を格納するフォルダ指定で、/usr/local/ 以下は、--target= 名と同じがわかりやすいと思います。CPU指定、--target= は、h8300 が、CPU、-elf が、ライブラリフォーマット指定です。h8300 と、-elf の間に、適当な名称を入れることもできます。GCCのバージョンなどを入れておくと、出来た実行ファイルのバージョンがひと目で判ります。例、h8300-g421b217-elf、 h8300-g402b2161-coff など。--target= で指定する名称は、このあとの、gcc や newlib でも同じものを使います。ここでは、-elf フォーマットのものを作成します。-coff では、binutils-2.17 以降、アセンブラが生成できません。

mkdir buildh8
cd buildh8
../configure --prefix=/usr/local/h8300-elf --target=h8300-elf \
>confb.log 2>&1

1分ほどで、makefile が生成されます。 makefile ができれば、第一関門通過です。 makefile は、ターゲットCPUやバージョンによって、大きさや内容が様々で、だいたい100KBから1MBほどの大きさになります。

make の実行

make >makeb.log 2>&1

で、構築が始まります。10分ほどかかります。 途中、makeb.log を開くと、進行状態を観察できます。makeb.log は、100kb前後になりますが、これもCPUやバージョンで大きく変わります。あまり早く終了する場合は、エラーの可能性が大きいですが、ほとんど終わり近くで、エラーになってしまう場合もあります。成功した場合、makeb.log の終わり部分は以下のようになっています。

make[4]: Leaving directory `/usr/local/binutils-2.18/buildh8/ld'
make[3]: Leaving directory `/usr/local/binutils-2.18/buildh8/ld'
make[2]: Leaving directory `/usr/local/binutils-2.18/buildh8/ld'
make[1]: Nothing to be done for `all-target'.
make[1]: Leaving directory `/usr/local/binutils-2.18/buildh8'

エラーの場合、Error となって、その理由も書かれています。

make install の実行

make install >makebi.log 2>&1

で、/usr/local/h8300-elf/bin フォルダ以下に、アセンブラなどのプログラムが格納されます。gcc や、newlib は、出来たプログラムも使って構築するので、

export PATH=/usr/local/h8300-elf/bin:$PATH

などと、パスを通して、次の gcc 構築をします。

結果の格納場所と、CPUの指定

gcc-core-4.2.3 フォルダ以下に、buildh8 フォルダを作り、そこへ移動します。結果の格納場所、CPUの指定は、当然同じに指定します。c++ も使う場合は、--enable-languages=c,c++ と指定します。

cd /usr/local/gcc-4.2.3
mkdir buildh8
cd buildh8
../configure --prefix=/usr/local/h8300-elf --target=h8300-elf \
--enable-languages=c --with-newlib \
--with-headers=/usr/local/newlib-1.16.0/newlib/libc/include \
>confh8g421.log 2>&1

で、同じく makefile ができます。あとの作業は、binutil と同じで、

make >makeh8g423.log 2>&1
make install >makeh8g4213.log 2>&1

今度は、RAMDISKでも30分ほどかかります。ここで、>makeh8g423.log 2>&1 と、ログを残すと、経過がコンソールに出ないため、若干スピードが速くなります。出来上がった開発環境は、他の場所に移しやすいように、 tar.gz でまとめます。

cd /usr/local/h8300-elf
tar zcvf ../h8300-g423b218-elf.tar.gz ./

これで、圧縮したファイルが、/usr/local 以下に作られます。こちらができあがったものです。h8300-g423b218-elf.tar.gz 27MBほどあります。これには、newlib などは入ってません。newlib を追加したものは、45MBほどになります。h8300-g423b218n116-elf.tar.gz どちらも、このURLの場所には置いてないので、ダウンロードできない場合は、日を改めてアクセスしてください。
解凍は、/usr/local/ 以下に、h8300-elf フォルダを作り、(名称はなんでも良い)そこにコピーして、

cd /usr/local/h8300-elf
tar zxvf h8300-g423b218-elf.tar.gz

で、開発環境のツールチェーンができます。使う場合は、

export PATH=/usr/local/h8300-elf/bin:$PATH

と、パスを通しておきます。newlib を追加するには、以下のように、/usr/local/newlib-1.16.0 フォルダに移動して、同じように configure を実行してから make します。

cd /usr/local/newlib-1.16.0
mkdir buildh8new
cd buildh8new
../configure --prefix=/usr/local/h8300-elf \
--target=h8300-elf >confb.log 2>&1
make >maken.log 2>&1
make install >makeni.log 2>&1

超越関数のメイクには、50分ほどかかります。できあがったものが、h8300-g423b218n116-elf.tar.gz です。このURLの場所には置いてないので、ダウンロードできない場合は、日を改めてアクセスしてください。
45MBほどになります。フォルダ、/usr/local/h3800-elf にコピーして以下のように解凍すると、

cd /usr/local/h3800-elf
tar zxvf h8300-g423b218n116-elf.tar.gz

/usr/local/h8300-elf/lib/h8300h 以下に、libm.a などがありますが、これが超越関数のライブラリです。このライブラリは、リンカーで呼び出すとき、GCC標準の libgcc.a より先に参照するように設定しないと、エラーになります。
makefile でのリンカーの例。

LDFLAGS_RAM = -Thdm69.x -nostartfiles
LDLIBS = /usr/local/h8300-elf/lib/gcc/h8300-elf/4.2.3/h8300h/libgcc.a
FLIBC =/usr/local/h8300-elf/h8300-elf/lib/h8300h/libm.a

h8300-elf-ld $(LDFLAGS_RAM) -Map=hdm69_22.map -o hdm69.elf start69.o hdm69.o lanbios.o $(FLIBC) $(LDLIBS)
h8300-elf-objcopy -O srec -R .ibss hdm69.elf hdm69_22.mot
rm hdm69.elf

戻る








inserted by FC2 system