Building Cygwin hosted newlib-based target toolchain
Cygwin をホストとした newlib ベースのターゲット toolchain のビルド
この HOWTO は、powerpc-eabi のような newlib をベースにしたターゲット開発 toolchain を、Cygwin(ix86-pc-cygwin)プラットフォームをホストとしてビルドする方法について記述しています。 この HOWTO では Cygwin をホストとして使用していますが、 ここに収められた情報は他のホストに対してもそのまま適用可能です。
目次:
%%howto-version: 1.0 %%title: Cygwin をホストとした newlib ベースのターゲット toolchain のビルド %%url: http://www.nanotech.wisc.edu/~khan/software/gnu-win32/ %%category: cygwin %%filename: cygwin-to-newlib-cross-howto %%author: Mumit Khan Created: Thu Jan 25 11:10:11 CST 2001 Last Modified: Thu Jan 25 15:05:13 CST 2001
背景
クロスコンパイル(単純なもの又は canadian なもの(原文: the simple kind or the canadian kind))を行うようになると、3 つの用語が非常に重要となります -- ホスト、ターゲットそしてビルドです。ホストとは最終的なツールチェイン(the resulting toolchain)が実行されるマシン、ビルドとは最終的なツールチェインが構築されたマシン、 ターゲットとは最終的なツールチェインが作成するバイナリです。 最も一般的なケースは、ホスト == ビルド == ターゲットです(即ち、Linux マシン上で作成された Linux マシン上の Linux のコンパイラ)。クロスコンパイラの場合は、ホスト == ビルドであり、 ターゲットは異なります(即ち、このツールチェインを使用して Linux マシン上でコンパイル / リンクを行い、i686-pc-cygwin 上で動作するバイナリを作成する場合は、ホストとビルドが Linux となり、ターゲットが i686-pc-cygwin となります)。 canadian クロスコンパイラの場合は、ホスト、 ビルドそしてターゲットが全て異なります(この場合についての説明は避けて、読者の想像にお任せします)。
さて、それでは Windows 2000 と Cygwin が実行されている PC があるとし、 この PC 上で powerpc-eabi なバイナリをビルドしたいとしましょう。 このターゲット用のランタイムライブラリは、その手の人々の間ではよく知られているであろう newlib です。この HOWTO は、ランタイムライブラリとして newlib を使用する全てのサポートされた GCC ターゲットに対して適用可能であり、ここでは単に powerpc-eabi を例としているだけです。
CrossGCC の人々は様々なスキームを使用していますが、個人的にはそれらはとても分かりにくいと思っています。 しかし手順書を読むには私はあまりにも怠惰なので、大抵は自分自身のやり方で済ませています。
ここでは基本的な手順を挙げます:
- (準備) どこにインストールするかなどを決定します。
- (1) 必要となる全てのソースパッケージを集め、それらを Cygwin ホスト上に格納します。
- (2) Binutils をビルドし、インストールします。
- (3) GCC 中の C コンパイラ *だけ* をビルドし、インストールします。
- (4) たった今インストールした C コンパイラを使用して newlib ビルドし、インストールします。最後に
- (5) 立ち戻って、GCC 中の残りのコンパイラと言語サポートランタイムを同様にビルドし、インストールします。
追記には簡単な例が挙げられており、実行形式の名称に常に .exe が付与されるという事態からどのようにして GCC を避けるかについて記述しています(これを避けたければ、その前にステップ 3 を読んで下さい)。
注意しておくことが一つあります -- 「シングルツリー」ビルドという用語に突き当たるだろうということです。 これは、要求される全てのコンポーネントが一つのツリー中に存在し、 単純に「configure」と「make」が実行出来るようにセットアップすることを意味します。 そうであれば、ここに示すステップに従わずに作業を進めるのがよいでしょう。 しかし、(あなたが顧客であったとして)以前は Cygnus Solutions、 現在は RedHatが提供する GNUPro のようなシングルツリーコンフィグレーションをテスト及び検証したことがないとすれば、 それぞれ一つずつビルドしたほうがよいでしょう。 全ての個別の部分の外側にあるシングルツリーをビルドすることは取るに足らないことだ、 と考えるかもしれません-- 互いのトップディレクトリで展開するだけであり、 共通部分を結合するだけだろう、と。binutils と gdb にそれぞれ含まれている、異なるバージョンの bfd についてこの作業を試してみて下さい。すぐに大失敗に陥ることでしょう。 複数の分かれたパッケージにこだわることで発生する、 余分なキーストロークのことを後悔はしません。この後に全てが記述されているので、 キーストロークは僅かに少なくなります。
この HOWTO の目的のために、以下のパッケージを使用します。
- Cygwin -- 1.1.7 (最新版を使用します)
- GCC -- 2.95.2-6 (Cygwin のソース配布の一部分)
- Binutils -- 2.10.1 (GNU によって配布されている通常のもの)
- newlib -- 1.9.0 (http://sources.redhat.com/newlib/)
準備:
タイプすることになるユーザーコマンドはこの文書のあちこちに散在しています。
「cygwin$」をシェルプロンプトとして使用します。
以下のものを使用します(私は bash を使用していますが、もし csh / tcsh のようなシェルを使用しているのでしたら、それに合う形にして下さい)。
cygwin$ host=i686-pc-cygwin cygwin$ build=i686-pc-cygwin cygwin$ target=powerpc-eabi cygwin$ prefix=/usr/local/powerpc cygwin$ src_root=/usr/local/src/gnu
(訳注: csh/tcsh では、プロンプトが「cygwin%」であるとすると以下のようになります)
cygwin% set host=i686-pc-cygwin cygwin% set build=i686-pc-cygwin cygwin% set target=powerpc-eabi cygwin% set prefix=/usr/local/powerpc cygwin% set src_root=/usr/local/src/gnu
$prefix と $src_root
についてはあなたの環境に合うように変更して構いませんが、
$host、$build そして $target
は変更しないで下さい。$src_root
ディレクトリが存在することを確かめて下さい。
もちろん、これら全てのシェル変数を設定する必要はありませんが、
私のタイプの手間を省き、私のタイプミスからあなたを救うことにはなります。
PATH に $prefix/bin
もまた追加すべきですが、これは binutils
をインストールした後ででも構いません(即ち、ステップ 2 の最後)。
ビルドのステップ
ステップ 1
必要なソースパッケージを集めます。最低限、コンパイラのソースとバイナリユーティリティです。
GNU 又は RedHat sourceware のミラーから、以下のものを取得します:
gcc-2.95.2.tar.gz binutils-2.10.1.tar.gz newlib-1.9.0.tar.gz
Cygwin ホストでビルドを行うので、Cygwin ディストリビューション内にある、 幾つかの Cygwin 用のフィックスが施されている gcc-2.95.2 を取得してくるのが安全です。ネットワーク「setup」ユーティリティを使用して(或いは、 単にミラーのどれかから ftp を使用して) GCC のソースをダウンロードする方法については、 http://sources.redhat.com/cygwin/ にある Cygwin のホームページを参照して下さい。この文書を書いている時点では、最新版は gcc-2.95.2-6 です(訳注: この文書を翻訳している時点での最新版は gcc-2.95.2-7 ですが、これはテストバージョンとして位置付けられています)。
これらを Cygwin マシンにダウンロードして展開します:
cygwin$ cd $src_root cygwin$ tar zxf /tmp/gcc-2.95.2.tar.gz cygwin$ tar zxf /tmp/binutils-2.10.1.tar.gz cygwin$ tar zxf /tmp/newlib-1.9.0.tar.gz
ステップ 2:
binutils をビルドし、インストールします。
決してソースツリー中でビルドしないで下さい。
ビルドの最上位のディレクトリとして、ここでは単に
$src_root/BUILD を選択しました。この下で
binutils と gcc の両方をビルドします。
cygwin$ mkdir -p $src_root/BUILD/binutils cygwin$ cd $src_root/BUILD/binutils cygwin$ $src_root/binutils-2.10.1/configure \ --with-included-gettext \ --target=$target --host=$host --build=$build \ --prefix=$prefix -v cygwin$ make > make.log 2>&1
全てがうまくいったなら、インストールします。
cygwin$ make install > install.log 2>&1
重要: これ以上先へ進む前に、
$prefix/bin を PATH に追加して下さい。
cygwin$ export PATH=$PATH:$prefix/bin
チェックします:
cygwin$ $target-ld --version GNU ld 2.10.1 Copyright 2000 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License. This program has absolutely no warranty. Supported emulations: elf32ppc
完了です。
ステップ 3:
GCC から C コンパイラだけをビルドし、インストールします。
cygwin$ mkdir -p $src_root/BUILD/gcc cygwin$ cd $src_root/BUILD/gcc cygwin$ $src_root/gcc-2.95.2/configure \ --enable-languages=c,c++ \ --with-included-gettext --enable-shared --enable-threads \ --target=$target --host=$host --build=$build \ --with-newlib \ --prefix=$prefix -v
--enable-languages に渡す引数は自由に変更して構いません。
利用可能な言語を全てビルドするのであれば、全体をそのまま残しておきます。
--enable-shared と --enable-threads
のパラメータも同様です。残りの部分は変更しないで下さい。
--with-newlib は重要です。何故なら、コアの
C コンパイラのビルドの一部を構成する libgcc.a のビルドに際して、stdlib.h と unistd.h
をコンパイラがインクルードしないように指示するからです(簡単な答:
configure スクリプトは、gcc/libgcc2.c ファイル内にインクルードされる特定のターゲットを見張る inhibit_libc マクロを定義します)。
今は C コンパイラだけをビルドするということを指定することに注意して下さい。そのためには、単にこうします。
cygwin$ make LANGUAGES=c all-gcc > make.log 2>&1 cygwin$ mv make.log make-c-only.log
全てがうまくいったなら、インストールします。
cygwin$ make LANGUAGES=c install-gcc > install.log 2>&1 cygwin$ mv install.log install-c-only.log
今やインストールされたコンパイラによって C のコードをビルドすることが可能になりました。同様に C++ コンパイラもビルドすることが出来ますが、 newlib のビルドには必要ありません。ステップ 4 が終わるまで待ちましょう。
ステップ 4
newlib をビルドし、インストールします。
cygwin$ mkdir -p $src_root/BUILD/newlib cygwin$ cd $src_root/BUILD/newlib cygwin$ $src_root/newlib-1.9.0/configure \ --target=$target --host=$host --build=$build \ --prefix=$prefix -v cygwin$ make > make.log 2>&1
全てがうまくいったなら、インストールします。
cygwin$ make install > install.log 2>&1
今やターゲット環境が出来上がりましたので、残りの世界を構築することが出来ます。
ステップ 5:
残った GCC コンパイラと言語ランタイムライブラリ、 言語サポートライブラリをビルドしてインストールします。
cygwin$ cd $src_root/BUILD/gcc cygwin$ make > make.log 2>&1 cygwin$ make install > install.log 2>&1
追記:
今や、実行すれば $target ターゲットバイナリを作成することが出来るはずです。全てがうまくいっていれば、こうなります。
$ cat > hello.c
#include <stdio.h>
int
main()
{
printf("hello world\n");
return 0;
}
^D
$ $target-gcc -o hello hello.c
$ ls -l hello*
hello.c hello.exe
[ ところで、ターゲットとした例は powerpc-eabi です。ですので、
これを行うためには少なくとも -msim のような
-m<xx> パラメータを与える必要があります。]
おや、なぜ拡張子 .exe が? Cygwin でホストしている
gcc を使用したからですが、この自動的な .exe
の付与を取り除くことは可能です。
$src_root/gcc-2.95.2-6/gcc/config/i386/xm-cygwin.h にある
EXECUTABLE_SUFFIX マクロをコメントアウトして、gcc
をリビルドするだけです。
ついでながら、まず GCC の C コンパイラ部分だけをビルド及びインストールするという作業は、ターゲット環境(この場合は newlib)が完全にインストールされている場合は必要ありません。最初の作業の後は、それらはもちろん不要になります。
同様に gdb-5.0(ところで、これには ppc シミュレータが含まれています)をビルドするなら、 gdb-5.0/gdb/defs.h にある strsignal の宣言をコメントアウトする必要があるでしょう。なぜなら、この宣言は newlib で行われている宣言とは異なっているからです(newlib 内での宣言では const char * を返しますが、gdb 内での宣言では const が省略されています)。
最後に
GNU コンパイラコレクション(GCC)に関する更なる情報については、 GCC のホームページを参照して下さい。
Cygwin に関する更なる情報については、Cygnus の Cygwin プロジェクトのページを参照して下さい。
CrossGCC に関する更なる情報については、以下を参照して下さい。
http://www.objsw.com/CrossGCC/
binutils に関する更なる情報については、以下を参照して下さい。
http://sources.redhat.com/binutils/
本文書の最新版、及び様々な 32 ビット Windows システム上で動作する GNU ツールに関する他の情報は、私の gnu-win32 ページにあります。
http://www.nanotech.wisc.edu/~khan/software/gnu-win32/
作成日: Thu Jan 25 11:10:11 CST 2001
最終更新日: Thu Jan 25 15:05:13 CST 2001
Mumit Khan <khan@nanotech.wisc.edu>
幸運を。
%%end-howto