[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]  


GNU CCのインストール

ここに記載されている情報は、 GNUシステムまたはUNIXシステム上にGNU CCをインストールするための手順です。 VMSシステム上でのインストールに関しては、 VMSへのGNU CCのインストールを参照してください。 このセクションでは、 ソース・ファイルの置かれているディレクトリにおいてコンパイルをすることを想定しています。 UNIXシステム上において これとは異なるディレクトリにおいてコンパイルする方法については、 別ディレクトリにおけるコンパイルを参照してください。

MSDOS上では、 GNU Cを単独でインストールすることはできません。 GNU C以外のどのようなMSDOS上のコンパイラを使っても、 GNU Cをコンパイルすることはできません。 完全なコンパイラ・パッケージであるDJGPPを入手する必要があります。 DJGPPには、 ソースだけではなくバイナリも含まれていて、 かつ、 必要なコンパイル・ツールとライブラリがすべて備わっています。

  1. 以前に同じディレクトリにおいて、 異なるターゲット・マシン用にGNU CCをビルドしたことがある場合は、 無効であるかもしれないファイルをすべて削除するために、 `make distclean'を実行します。 これによって削除されるファイルの1つが`Makefile'です。 `make distclean'が、 `Makefile'が存在しないと訴えてくるようであれば、 おそらくそのディレクトリは既に適切にクリーンな状態になっているということです。
  2. System Vリリース4システムでは、 PATHの中において、 `/usr/bin'`/usr/ucb'よりも前にあることを確認します。 `/usr/ucb'にあるccコマンドは、 バグのあるライブラリを使います。
  3. パーサ生成プログラムBisonがインストールされていることを確認します。 (Bisonの出力ファイルである`c-parse.c'`cexp.c'`c-parse.y'`cexp.y'よりも新しく、 かつ、 `.y'ファイルを変更するつもりがないのであれば、 Bisonがインストールされている必要はありません)。 1988年9月8日版よりも古いバージョンのBisonは、 出力ファイル`c-parse.c'を正しく生成しません。
  4. システムの提供する標準ツール以外のツール (例えば、 GASやGNUリンカ) を必要とするGNU CCのコンフィギュレーションを選択した場合は、 必要となるツールを `as'`ld'、 その他の適切な名前でビルド・ディレクトリにインストールします。 これによってコンパイラは、 プログラム`enquire'をコンパイルするのに適切なツールを見つけることができるようになります。 あるいは、 必要なGNUツールがシステム標準のツールよりも優先されるような 環境変数PATHの値を使って、 これ以降のコンパイル処理を実行することもできます。
  5. ホスト・マシン、 ビルド・マシン、 ターゲット・マシンのコンフィギュレーションを指定します。 `configure'スクリプトを実行するときに、 この指定を行います。 ビルド・マシンとは、 (ビルドをするのに)使っているマシンです。 ホスト・マシンとは、 結果的に作成されるコンパイラを実行させたいシステムです (通常は、 ビルド・マシンと同一です)。 ターゲット・マシンとは、 そのコンパイラの生成するコードを実行させたいシステムです。 ビルドしているコンパイラが実行されるマシンと、 そのコンパイラが生成するコードが実行されるマシンとが同一の場合 (ネイティブ・コンパイラ)、 `configure'に対してオペランドを指定する必要は通常ありません。 `configure'は、 実行中のマシンの種類を推測して、 それをビルド・マシン、 ホスト・マシン、 ターゲット・マシンとして使います。 したがって、 `configure'が、 コンフィギュレーションを判別できない場合、 または、 誤って推測する場合を除けば、 ネイティブ・コンパイラをビルドする際には、 コンフィギュレーションを指定する必要はありません。 判別ができない場合、 あるいは、 推測が誤っている場合は、 ビルド・マシンのコンフィギュレーション名`--host'オプションで指定します。 ホストとターゲットは、 デフォルトではホスト・マシンと同一になります (クロス・コンパイラをビルドしている場合は、 クロス・コンパイラのビルドとインストールを参照してください)。 以下に例を示します。
    ./configure --host=sparc-sun-sunos4.1
    
    コンフィギュレーション名は、 正規名でも構いませんし、 多少省略しても構いません。 正規のコンフィギュレーション名は、 3つの部分から構成され、 各部分はダッシュによって区切られます。 `cpu-company-system' のようになります (3つの構成要素の中にダッシュが含まれることもあります。 `configure'は、 どのダッシュがどのような目的で使われているかを判別することができます)。 例えば、 `m68k-sun-sunos4.1'はSun 3を指定します。 また、 コンフィギュレーションの構成要素を、 ニックネームや別名で置き換えることもできます。 例えば、 `sun3'`m68k-sun'を表わします。 したがって、 `sun3-sunos4.1'は、 Sun 3を指定する別の方法です。 あるいは単に、 `sun3-sunos'を使うこともできます。 SunOSのバージョンは、 デフォルトでバージョン4と想定されているからです。 バージョン番号は、 任意のシステム種別の後ろに指定することができます。 また、 いくつかのCPU種別の後ろにも指定することができます。 ほとんどの場合、 バージョンは無関係であり、 無視されます。 したがって、 バージョンは、 分かっている場合に指定すれば良いのです。 サポートされているコンフィギュレーション名と、 多くのコンフィギュレーションに関する留意点については、 GNU CCのサポートするコンフィギュレーションを参照してください。 GNU CCのインストールにこれ以上進む前に、 そのセクションに記載されている留意点をチェックするべきです。
  6. configureを実行する際には、 ハードウェアやソフトウェアのさまざまなコンフィギュレーションを指定するオプションを 追加して指定する必要があるかもしれません。 `--with-gnu-as'`--with-gnu-ld'`--with-stabs'`--nfp'がそうしたオプションです。
    `--with-gnu-as'
    GNU CCをGNUアセンブラ(GAS)と組み合わせて使うのであれば、 `configure'を実行する際に、 `--with-gnu-as'オプションによってそのことを宣言しなければなりません。 このオプションを指定してもGASがインストールされるわけではありません。 GASが処理できるように、 GNU CCの出力を変更するだけです。 GASのビルドとインストールはユーザの責任です。 逆に、 GASを使いたくなくて、 GNU CCをビルドする際に`--with-gnu-as'を指定しないのであれば、 GASがインストールされていないことを確認するのもユーザの責任です。 GNU CCは、 asという名前のプログラムをさまざまなディレクトリにおいて探します。 見つかったプログラムがGASであれば、 GNU CCはGASを実行します。 GNU CCが使っているアセンブラがどのディレクトリにあるものか定かではない場合は、 GNU CCの実行時に`-v'オプションを指定してみてください。 GASを使うか使わないかによって違いの出るシステムは、
    `hppa1.0-any-any'`hppa1.1-any-any'`i386-any-sysv'`i386-any-isc'`i860-any-bsd'`m68k-bull-sysv'`m68k-hp-hpux'`m68k-sony-bsd'`m68k-altos-sysv'`m68000-hp-hpux'`m68000-att-sysv'`any-lynx-lynxos'`mips-any'です。 これ以外のシステムでは、 `--with-gnu-as'を指定しても結果に違いはありません。 上記のシステム (ただし、 HP-PA、 386上のISC、 `mips-sgi-irix5.*'は除く) では、 GASを使うのであれば、 同時にGNUリンカを使わなければなりません (したがって、 `--with-gnu-ld'を指定しなければなりません)。
    `--with-gnu-ld'
    GNU CCとともにGNUリンカを使うつもりであれば、 `--with-gnu-ld'オプションを指定します。 このオプションを指定しても、 GNUリンカがインストールされるわけではありません。 GNUリンカと協働できるように、 GNU CCの振る舞いを変更するだけです。
    `--with-stabs'
    MIPSベースのシステムとAlpha上では、 GNU CCに、 通常のECOFFデバッグ・フォーマットを生成させたいのか、 あるいは、 ECOFFシンボル・テーブルを経由して渡されるBSDスタイルのstabsフォーマットを使わせたいのかを指定しなければなりません。 通常のECOFFデバッグ・フォーマットでは、 C以外の言語を完全に処理することはできません。 BSD stabsフォーマットは、 ほかの言語を処理することができますが、 GNUデバッガGDBでしか使うことができません。 通常、 GNU CCはデフォルトではECOFFデバッグ・フォーマットを使います。 BSD stabsフォーマットを使いたい場合は、 GNU CCの構成(configureの実行)を行う際に`--with-stabs'を指定します。 GNU CCの構成(configureの実行)を行う際にどちらをデフォルトとして選択した場合でも、 ユーザは、 `-gcoff'オプションや`-gstabs+'オプションを使って、 特定のコンパイル処理におけるデバッグ・フォーマットを明示的に指定することができます。 386上のISCシステムでは、 `--with-gas'が使われていれば、 `--with-stabs'が意味を持ちます。 これは、 COFF出力の中に埋め込まれたstabsデバッグ情報を使うことを選択します。 この種のデバッグ情報は、 C++を申し分なくサポートしています。 普通のCOFFデバッグ情報は、 C++をサポートしていません。 `--with-stabs'は、 SVR4の動作する386システム上でも意味を持ちます。 これは、 ELF出力の中に埋め込まれたstabsデバッグ情報を使うことを選択します。 現在のC++コンパイラ(2.6.0)は、 386のSVR4プラットフォーム上において通常使われる DWARFデバッグ情報をサポートしていません。 stabsは、 実際に使える代替手段を提供しています。 ただし、 通常のSVR4のツールではstabsを生成することや解釈することはできないため、 gasとgdbが必要になります。
    `--nfp'
    システムによっては、 マシン内の浮動小数点ユニットの有無を指定しなければなりません。 該当するシステムには、 `m68k-sun-sunosn'`m68k-isi-bsd'があります。 これ以外のシステムでは、 `--nfp'は現在のところまったく効力を持ちません。 おそらく、 このフラグが意味のある違いをもたらすことのできるようなシステムは、 これ以外にも存在するでしょう。
    `--enable-haifa'
    `--disable-haifa'
    (IBM Haifaから提供されている) 実験的な命令スケジューラを有効にするためには、 `--enable-haifa'を使います。 これによって、 より良いコードが生成されることもあるでしょうが、 そうでない場合もあるでしょう。 このスケジューラが効果を持つことが分かっているいくつかのターゲットでは、 デフォルトでそれを有効にしてあります。 このようなターゲットでそれを無効にするためには、 `--disable-haifa'を使います。 configureは、 Haifaスケジューラが有効化されているかどうかを、 実行時に表示します。
    `--enable-threads=type'
    いくつかのシステム、 特にLinuxベースのGNUシステムでは、 Objective Cランタイムに対するスレッド機能の提供をあてにすることができません。 したがって、 Objective Cランタイムは、 デフォルトでは単一スレッドのランタイムとなります。 しかし、 これらのシステムでもライブラリによるスレッド実装が利用できる場合もあり、 そのような場合には、 適切なtype (おそらく`posix') を指定してこのオプションを使うことによって、 スレッドを有効化することができます。 typeとして考えられるのは、 `single'`posix'`win32'`solaris'`irix'`mach'です。
    `--enable-checking'
    このオプションを指定すると、 ビルドされたコンパイラは、 ツリー・ノードのフィールドを参照する際に、 そのツリー・ノードの型をチェックします。 生成されるコードが変更されるわけではなく、 コンパイラの内部にエラー・チェックの処理が追加されるだけです。 これによりコンパイラの速度は遅くなります。 また、 GNU Cを使ってコンパイラをビルドする場合にしか正しく機能しない可能性があります。 `configure'スクリプトは、 ソース・ディレクトリのサブディレクトリから、 GNU CCに統合されるほかのコンパイラを探します。 G++と呼ばれる、 C++用のGNUコンパイラは、 `cp'という名前のサブディレクトリにあります。 `configure'は、 これらすべてのコンパイラをビルドするためのルールを、 `Makefile'の中に挿入します。 以下に、 configureによってセットアップされるすべてのファイルを示します。 通常は、 これらのファイルのことをユーザが気にする必要はありません。
    • コンパイラを実行させるマシン用のトップ・レベルの構成ファイルを `#include'によってインクルードする、 `config.h'という名前のファイルが生成されます (コンフィギュレーション・ファイルを参照)。 このファイルは、 ホスト・マシンに関する情報の定義に責任を持ちます。 このファイルから`tm.h'がインクルードされます。 トップ・レベルの構成ファイルは、 サブディレクトリ`config'にあります。 名前は常に`xm-something.h'という形式です。 通常は`xm-machine.h'ですが、 例外もあります。 シンボリック・リンクをサポートしていないシステムでは、 適切なファイルを参照するような`#include'コマンドを含むように、 `config.h'をセットアップする必要があるかもしれません。
    • ターゲット・マシン用のトップ・レベルのconfigファイルをインクルードする、 `tconfig.h'という名前のファイルが生成されます。 このファイルは、 そのマシンで実行するいくつかのプログラムをコンパイルするのに使われます。
    • ターゲット・マシン用のマシン記述マクロ・ファイルをインクルードする、 `tm.h'という名前のファイルが生成されます。 このマクロ・ファイルは、 サブディレクトリ`config'にあるはずであり、 多くの場合その名前は`machine.h'です。
    `--enable-nls'
    `--disable-nls'
    `--enable-nls'オプションは、 Native Language Support(NLS)を有効化します。 これによりGCCは、 米国英語以外の言語で診断メッセージを出力します。 診断メッセージの翻訳は未だ存在しないので、 現在のところこのオプションの主なユーザは、 GCCの診断メッセージを翻訳していて、 翻訳結果をテストしようとしている人々です。 翻訳が利用できるようになれば、 Native Language Supportはデフォルトで有効になるでしょう。 `--disable-nls'オプションは、 NLSを無効化します。
    `--with-included-gettext'
    NLSが有効であれば、 GCCのビルド・プロシージャは通常、 ホストのgettextライブラリを使うことを試みます。 ホストのライブラリが十分でない場合に限り、 GCCの持っているGNU gettextライブラリのコピーを使います。 `--with-included-gettext'オプションが指定されると、 ビルド・プロシージャは、 GNU gettextのコピーを優先して使います。
    `--with-catgets'
    NLSが有効である場合で、 ホストにgettextが存在せず、 機能的に劣るcatgetsインターフェイスは存在する場合、 GCCのビルド・プロシージャは通常、 catgetsを無視して、 GCCの持っているGNU gettextライブラリのコピーを使います。 `--with-catgets'オプションが指定されると、 ビルド・プロシージャはこのような状況において、 ホストのcatgetsを使います。
  7. 状況によっては、 configureを実行する際に、 他の特定のオプションを指定する必要があります。
  8. コンパイラをビルドします。 コンパイラのディレクトリにおいて、 単に`make LANGUAGES=c'を実行します。 `LANGUAGES=c'は、 Cコンパイラだけをコンパイルすることを指定します。 通常であればメイクファイルは、 サポートされるすべての言語用のコンパイラをビルドします。 現在のところサポートされている言語は、 C、 C++、 Objective Cです。 ただし、 GNU Cコンパイラ以外のコンパイラを使ってビルドした場合に、 確実に動作するのはC言語のコンパイラだけです。 また、 この段階においてC以外のコンパイラをビルドすることは時間の無駄です。 一般には、 引数`LANGUAGES="list"'を使って、 特定の言語用のコンパイラをビルドすることを指定します。 ここで、 listには、 `c'`c++'`objective-c'の中から1つ以上を指定します。 GNU CCソース・ディレクトリのサブディレクトリに これ以外のGNUコンパイラがある場合には、 その名前をリストの中に指定することもできます。 `insn-emit.c'において "statement not reached"という警告メッセージが出力されても、 無視してください。 これは異常ではありません。 また、 `genopinit.c'、 および、 おそらくその他のファイルについても出力されるかもしれない、 "unknown escape sequence"という警告メッセージも異常ではありません。 同様に、 `insn-emit.c'`insn-recog.c'における "constant is so large that it is unsigned"という警告、 `enquire.o'において比較の結果が常にゼロであることに関する警告、 `cexp.y'におけるシフト・カウントが型の幅を超えていることに関する警告は いずれも無視するべきです。 これ以外のコンパイル・エラーは、 そのマシンまたはオペレーティング・システムへの移植のバグである可能性があります。 これについては、 調査と報告が行われるべきです (バグ報告を参照)。 コンパイラによっては、 バグや制限事項のためにGNU CCをコンパイルできないものもあります。 例えば、 Microsoftのコンパイラを使うと、 マクロ・スペースが不足してしまうそうです。 また、 いくつかのUltrixのコンパイラでは、 式スペースが不足してしまいます。 この場合には、 問題の発生する文を分割する必要があります。
  9. クロス・コンパイラをビルドするのであれば、 ここ以降を読むのは止めて、 クロス・コンパイラのビルドとインストールを参照してください。
  10. 以下のコマンドによって、 ステージ1のオブジェクト・ファイルと実行ファイルを サブディレクトリに移動します。
    make stage1
    
    ファイルは、 `stage1'という名前のサブディレクトリに移動されます。 インストールが完了した後には、 rm -r stage1によってこれらのファイルを削除すると良いでしょう。
  11. システム標準のツールの代わりとして、 (例えば、 GASやGNUリンカのような) 他のGNUツールを必要とするGNU CCのコンフィギュレーションを選択した場合には、 `stage1'サブディレクトリの下に、 `as'`ld'、 および、 その他の適切な名前で、 必要なツールをインストールします。 これにより、 ステージ1のコンパイラは、 以降のステージにおいて適切なツールを見つけることができるようになります。 あるいは、 以降のコンパイル処理においてはPATH環境変数の値を使って、 必要なGNUツールがシステム標準のツールよりも優先されるようにすることもできます。
  12. 以下のコマンドによって、 コンパイラをそのコンパイラ自身によって再コンパイルします。
    make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2"
    
    これは、 ステージ2・コンパイラの作成と呼ばれます。 上記のコマンドは、 サポートされるすべての言語用のコンパイラをビルドします。 これらすべてが必要ではない場合、 コンパイラをビルドする言語を 引数`LANGUAGES="list"'によって指定することができます。 listには、 `c'`c++'`objective-c'`proto'の中の1つ以上が指定されていなければなりません。 複数指定する場合は、 空白類で区切ります。 `proto'は、 protoizeプログラムとunprotoizeプログラムを表わしています。 これらは言語ではありませんが、 そのインストールは、 LANGUAGESを使って有効または無効にします。 ステージ3・コンパイラをビルドするのであれば、 ステージ2ではC言語用のコンパイラだけをビルドするのが良いでしょう。 ステージ2・コンパイラのビルドが終了した後に ディスク・スペースが不足しているようであれば、 `stage1'サブディレクトリを削除しても問題ありません。 浮動小数点ハードウェアを持たない68000システムまたは68020システムでは、 そのようなハードウェアがないことをデフォルトで想定している `tm.h'を選択したのでない限り、 以下のように実行します。
    make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2 -msoft-float"
    
  13. コンパイラをそのコンパイラ自身によってさらにもう一度コンパイルすることによって、 コンパイラのテストをしてみたいのであれば、 (GASやGNUリンカのような) 必要なその他のGNUツールを、 `stage1'サブディレクトリの場合と同様に、 `stage2'サブディレクトリにインストールします。 その後に、 以下を実行します。
    make stage2
    make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2"
    
    これは、 ステージ3・コンパイラの作成と呼ばれます。 `-B'オプション以外のコンパイラ・オプションは、 ステージ2・コンパイラを作成した際と同一でなければなりません。 しかし、 LANGUAGESオプションは同一である必要はありません。 上記のコマンドは、 サポートされているすべての言語を扱えるコンパイラをビルドします。 サポートされているすべての言語が必要ではない場合、 上で説明したように、 `LANGUAGES="list"'引数を入力することによって、 ビルドされるサポート言語を指定することができます。 GNUツールを追加でインストールする必要がないのであれば、 `stage1'`stage2'の各ディレクトリを作成して、 コンパイラのビルドを2回実行する代わりに、
    make bootstrap LANGUAGES=language-list BOOT_CFLAGS=option-list
    
    というコマンドを使うこともできます。
  14. 最後に生成されたオブジェクト・ファイルを ステージ2のオブジェクト・ファイルと比較してみて下さい。 両者は、 タイム・スタンプを除けば同一のはずです。 システムによっては、 オブジェクト・ファイルの有意味な比較が不可能であることがあります。 このようなシステムでは、 オブジェクト・ファイルは常に「異なる」ように見えます。 現在のところ、 SolarisとELFオブジェクト・ファイル・フォーマットを使ういくつかのシステムで このようなことが起こります。 SGIマシン上のIrixとAlphaシステム上のDEC UNIX(OSF/1)のいくつかのバージョンでは、 `-save-temps'を指定せずにオブジェクト・ファイルの比較を行なうことはできません。 比較の結果、 オブジェクト・ファイルが同一でないという結果が出た場合、 ここに挙げたシステムに関する説明を参考にしてください。 ほかのシステム上でも、 類似の問題があるかもしれません。 オブジェクト・ファイルの比較を行なうには、 以下のコマンドを使います。
    make compare
    
    これにより、 ステージ2とステージ3の間で相違のあるオブジェクト・ファイルがあれば、 そのことが報告されます。 いかに無害なものであっても相違があるということは、 ステージ2・コンパイラがGNU CCを正しくコンパイルしなかったということであり、 したがって、 ユーザが調査して報告するべき重大なバグである可能性があります (バグ報告を参照)。 オブジェクト・ファイルの中にタイム・スタンプを組み込まないシステムの場合、 以下のようにすればより高速に比較を行なうことができます (Bourneシェルを使った例)。
    for file in *.o; do
    cmp $file stage2/$file
    done
    
    MIPSマシン上において `-mno-mips-tfile'オプションを指定してコンパイラをビルドした場合は、 オブジェクト・ファイルの比較を行なうことはできません。
  15. コンパイラ・ドライバ、 コンパイラの各パスのファイル、 ランタイム・サポート・ファイルを`make install'によってインストールします。 CCCFLAGSLANGUAGESについては、 インストールされるファイルをコンパイルする際に使ったのと同一の値を使います。 これが必要となる理由の1つは、 いくつかのバージョンのmakeにバグがあって、 このステップを実行する際に、 必要もないのに再コンパイルを実行することがあるからです。 同一の変数値を使っていれば、 ファイルが再コンパイルされても問題はありません。 例えば、 ステージ2・コンパイラをビルドしたのであれば、 以下のコマンドを使うことができます。
    make install CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O" LANGUAGES="list"
    
    これにより、 ファイル`cc1'`cpp'`libgcc.a'が、 ディレクトリ`/usr/local/lib/gcc-lib/target/version'に、 `cc1'`cpp'`libgcc.a'としてコピーされます。 このディレクトリは、 コンパイラ・ドライバがこれらのファイルを探す場所です。 ここでtargetは、 `configure'を実行した際に指定されたターゲット・マシン種別を 正規化したもの(canonicalized form)です。 またversionは、 GNU CCのバージョン番号です。 このような名前付けによって、 異なるバージョンのコンパイラやクロス・コンパイラの共存が可能になります。 また、 他の言語用のコンパイラの実行ファイル (例えば、 C++用の`cc1plus')が、 同一のディレクトリにコピーされます。 さらに、 ドライバ・プログラム`xgcc'が、 典型的な実行サーチ・パスの中に存在するよう、 `/usr/local/bin/gcc'としてコピーされます。 また、 `gcc.1'`/usr/local/man/man1'に、 infoページが`/usr/local/info'に、 それぞれコピーされます。 システムによっては、 このコマンドによっていくつかのファイルが再コンパイルされることがあります。 これは通常は、 makeのバグによるものです。 この問題は無視するか、 さもなくば、 GNU makeを使ってください。 警告: Sunのライブラリに含まれているallocaにはバグがあります。 このバグを回避するには、 GNU CCによってコンパイルされたGNU CCの実行ファイルをインストールしてください。 (ステージ1の実行ファイルではなく、 ステージ2またはステージ3の実行ファイルです。) この実行ファイルは、 allocaを組み込み関数として扱い、 ライブラリの中のallocaを使いません。 (通常は、 ステージ2またはステージ3のGNU CC実行ファイルをインストールするほうが 良いでしょう。 というのは、 これらのほうが、 他のコンパイラによってコンパイルされたものよりも高速だからです。)
  16. C++を使うのであれば、 C++ランタイム・ライブラリをインストールする必要があります。 そこには、 すべてのI/O機能と特殊なクラス・ライブラリなどが含まれています。 GNU CCの標準C++ランタイム・ライブラリは`libstdc++'と呼ばれています。 今となっては古くなってしまったライブラリ`libg++'も利用可能ですが、 これは、 まだ標準ライブラリを使って書き直されていない 古いソフトウェアについてのみ使う必要のあるものです。 `libg++'を使う必要があるかどうかが分からないのであれば、 おそらく使う必要はないということでしょう。 以下に、 GNU CC用に`libstdc++'をビルドしてインストールする方法を示します。 まとめると、 GNU CCをビルドしてインストールした後に、 C++ライブラリ・ディストリビューションの最上位ディレクトリにおいて 以下のシェル・コマンドを実行します。 configure-optionsには、 GNU CCの`configure'実行に使ったのと同一のオプションを指定します。
    $ CXX=gcc ./configure configure-options
    $ make
    $ make install
    
  17. GNU CCには、 Objective-Cのランタイム・ライブラリが含まれています。 Objective-Cは、 GNU CCに統合された言語であるからです。 このライブラリに関連したファイルは、 サブディレクトリ`objc'にあります。 GNU Objective-Cランタイム・ライブラリをコンパイルするには、 ターゲット・マシンのCライブラリ用のヘッダ・ファイルが必要です。 また、 スレッドのサポートを希望するのであれば、 ターゲットのスレッド・ライブラリのヘッダ・ファイルも必要になります。 クロス・コンパイル用のヘッダ・ファイルの問題に関する説明については、 クロス・コンパイラとヘッダ・ファイルを参照してください。 `configure'を実行すると、 ターゲット・プラットフォームに適した Objective-Cのスレッド実装ファイルが選択されます。 プラットフォームによっては複数のスレッドの実装がサポートされているため、 場合によっては、 `configure'が選択したものとは異なるバックエンドを選択したいこともあるでしょうし、 あるいは、 スレッド・サポートを完全に無効化したい場合もあるでしょう。 makeを実行するときに、 コマンドライン上において メイクファイル変数OBJC_THREAD_FILEの値を指定することによって、 こうしたことを行ないます。 以下に例を示します。
    make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2" OBJC_THREAD_FILE=thr-single
    
    以下に、 現在利用可能なバックエンドの一覧を示します。

configureによって生成されるファイル

以下に、 configureによってセットアップされるファイルを順を追って説明します。 通常、 これらのファイルのことを気にする必要はありません。

GNU CCのサポートするコンフィギュレーション

以下に、 指定可能なCPU種別を示します。

1750a, a29k, alpha, arm, cn, clipper, dsp16xx, elxsi, h8300, hppa1.0, hppa1.1, i370, i386, i486, i586, i860, i960, m32r, m68000, m68k, m88k, mips, mipsel, mips64, mips64el, ns32k, powerpc, powerpcle, pyramid, romp, rs6000, sh, sparc, sparclite, sparc64, vax, we32k.

以下に、 認識される企業名を示します。 これを見て分かるように、 より長い正式名よりはむしろ慣例的に使われている省略名となっています。

acorn, alliant, altos, apollo, apple, att, bull, cbm, convergent, convex, crds, dec, dg, dolphin, elxsi, encore, harris, hitachi, hp, ibm, intergraph, isi, mips, motorola, ncr, next, ns, omron, plexus, sequent, sgi, sony, sun, tti, unicom, wrs.

企業名は、 指定されたその他の情報だけでは不十分な場合に、 曖昧さを取り除くという点においてのみ意味を持ちます。 必要なければ、 単に`cpu-system'のように書いて省略することができます。 例えば、 `vax-ultrix4.2'は、 `vax-dec-ultrix4.2'と同等です。

以下に、 システム種別の一覧を示します。

386bsd, aix, acis, amigaos, aos, aout, aux, bosx, bsd, clix, coff, ctix, cxux, dgux, dynix, ebmon, ecoff, elf, esix, freebsd, hms, genix, gnu, linux-gnu, hiux, hpux, iris, irix, isc, luna, lynxos, mach, minix, msdos, mvs, netbsd, newsos, nindy, ns, osf, osfrose, ptx, riscix, riscos, rtu, sco, sim, solaris, sunos, sym, sysv, udi, ultrix, unicos, uniplus, unos, vms, vsta, vxworks, winnt, xenix.

システム種別は省略可能です。 省略すると、 `configure'は、 CPU種別と企業名からオペレーティング・システムを推測します。

システム種別にバージョン番号を付加することができます。 これは、 違いをもたらす場合ともたらさない場合があります。 例えば、 BSDのバージョンを区別するのに、 `bsd4.3'`bsd4.4'のように指定することができます。 実際のところバージョン番号は、 多くの場合異なるものとして扱われる、 `sysv3'`sysv4'について最も必要となります。

`i860-dg-vms'のようなあり得ない組み合わせを指定すると、 `configure'がエラー・メッセージを出力するかもしれません。 あるいは、 `configure'が、 情報の一部を無視して、 それ以外の部分を頼りに最善の努力を払うかもしれません。 `configure'は常に、 代わりに使った組み合わせの正規名を表示します。 GNU CCは、 すべての可能な組み合わせをサポートしているわけではありません。

多くの場合、 特定のマシン・モデルには名前があります。 多くのマシン名が、 CPU種別と企業名の組み合わせの別名として認識されます。 上で示した`sun3'というマシン名は、 `m68k-sun'の別名です。 企業名が特定のマシンの名前として一般に使われている場合には、 その企業名をマシン名として受け入れることもあります。 以下に、 既知のマシン名の一覧を示します。

3300, 3b1, 3bn, 7300, altos3068, altos, apollo68, att-7300, balance, convex-cn, crds, decstation-3100, decstation, delta, encore, fx2800, gmicro, hp7nn, hp8nn, hp9k2nn, hp9k3nn, hp9k7nn, hp9k8nn, iris4d, iris, isi68, m3230, magnum, merlin, miniframe, mmax, news-3600, news800, news, next, pbd, pc532, pmax, powerpc, powerpcle, ps2, risc-news, rtpc, sun2, sun386i, sun386, sun3, sun4, symmetry, tower-32, tower.

マシン名が、 CPU種別と企業名の両方を指定していることを覚えていてください。 ユーザ独自に作成したコンフィギュレーション・ファイルをインストールしたい場合は、 それにアクセスするための企業名として`local'を使うことができます。 `cpu-local'というパターンのコンフィギュレーションを使うと、 CPU種別を示す接頭辞を除いた名前が コンフィギュレーション・ファイル名の構成要素として使われます。

したがって、 `m68k-local'を指定すると、 `config/m68k'ディレクトリにあるファイル `m68k.md'`local.h'`m68k.c'`xm-local.h'`t-local'`x-local' がコンフィギュレーションにおいて使われます。

以下に、 ユーザが知っておくべき、 特殊な取り扱いを受けるコンフィギュレーション、 あるいは、 特殊な事情を持つコンフィギュレーションの一覧を示します。

`1750a-*-*'
MIL-STD-1750Aプロセッサ。 クロス・コンフィギュレーションMIL-STD-1750Aは、 GNU Public Licenseにもとづいて利用可能な1750A用アセンブラ兼リンカである as1750用の出力を生成します。 as1750は、 ftp://ftp.fta-berlin.de/pub/crossgcc/1750gals/から入手できます。 同じアドレスから、 同様のライセンスにもとづく1750A用シミュレータも入手できます。 libgccをビルドしている過程において出る致命的エラーは無視するべきです (libgccは、 まだ1750A用には実装されていません)。 as1750アセンブラは、 `ms1750.inc'というファイルを必要とします。 このファイルは、 `config/1750a'ディレクトリにあります。 GNU CCは、 Fairchild F9450 Cコンパイラと同一のセクションを生成します。 具体的には、 以下に示すセクションです。
Normal
プログラム・コード・セクション。
Static
読み書き可能な(RAM)データ・セクション。
Konst
読み込みのみ可能な(ROM)定数セクション。
Init
初期化セクション (KRELをSRELへコピーするコード)
アドレス可能な最小単位は16ビットです (BITS_PER_UNITは16です)。 このことは、 char型が、 1文字につき16ビットのワードで表現されるということを意味しています。 GNU CCは、 1750Aの"Load/Store Upper/Lower Byte"命令 (上位バイトまたは下位バイトをロードまたはストアする命令) を使っていません。
`alpha-*-osf1'
DEC Alphaアーキテクチャを実装するプロセッサを使い、 DEC UNIX(OSF/1)オペレーティング・システムを実行するシステム。 例えば、 DEC Alpha AXPシステム。 GNU CCは、 クロス・コンパイラとしてビルドされたのではない場合、 アセンブラ出力ファイルの中に`.verstamp'指示子を書き込みます。 また、 バージョンは、 システム・ヘッダ・ファイル`/usr/include/stamp.h'から獲得します。 DEC UNIXのバージョンを更新した場合には、 新しいバージョン・スタンプを獲得するために、 GCCを再ビルドしなければなりません。 Alphaは64ビット・アーキテクチャなので、 32ビット・マシン上のクロス・コンパイラが生成するコードは、 64ビット・マシン上で実行されるコンパイラが生成するコードほど効率的なものではないという点に注意してください。 これは、 ターゲット上の1ワードをホスト上において整数値として表現できることが前提となる 多くの最適化が実行できないからです。 また、 Alpha上において32ビット・マシン用のクロス・コンパイラをビルドすることは、 少数のケースにおいてしかテストされておらず、 正しく動作しないかもしれません。 古いバージョンのDEC UNIX上では、 CFLAGS`-save-temps'を追加しないと、 make compareによる比較結果は不一致となるかもしれません。 これらのシステムでは、 オブジェクト・ファイルの中にアセンブラ入力ファイルの名前が含まれていて、 stage1stage2のそれぞれのコンパイルにおいてこの名前が異なると、 オブジェクト・ファイルの比較は不一致という結果になります。 オプション`-save-temps'は、 アセンブラ入力ファイルに対して、 `/tmp'において無作為に選択された名前の代わりに、 ある固定した名前が使われるよう強制します。 `-save-temps'は、 これを指定しないと比較の結果が不一致となる場合以外は追加しないでください。 `-save-temps'を追加すると、 一連のコンパイルのたびに `.i'ファイルと`.s'ファイルを手作業で削除しなければならなくなります。 GNU CCは現在、 DBXとGDBにより使われるネイティブ(ECOFF)・デバッグ・フォーマットと GDBのみにより使われるカプセル化された(encapsulated)STABSフォーマットの 両方をサポートしています。 これらのフォーマットに関するさらに詳しい情報とその選択方法については、 上に示した`configure'`--with-stabs'オプションの議論を参照してください。 DECのアセンブラには、 `.align'指示子が使われると、 ECOFFフォーマットにおいて正しくない行番号を出力するというバグがあります。 この問題を回避するために、 GNU CCは、 最適化が実行されている場合でも、 ECOFFフォーマットのデバッグ情報を生成する際に、 このような境界整列指示子を出力しません。 不幸なことに、 この回避策には、 `-O'が指定された際のコード・アドレスが、 `-g'の指定の有無によって変わってしまうという 非常に好ましくない副作用があります。 この振る舞いを回避するには、 `-gstabs+'を指定して、 DBXではなくGDBを使ってください。 DECは、 アセンブラにこの問題があることを既に知っており、 近いうちに修正を提供したいと考えています。
`arc-*-elf'
Argonaut ARCプロセッサ。 このコンフィギュレーションは組み込みシステム用です。
`arm-*-aout'
Advanced RISC MachinesのARMファミリ・プロセッサ。 これは、 組み込みアプリケーションにおいてよく使われています。 標準のUNIX用コンフィギュレーションは存在しません。 このコンフィギュレーションは、 基本的な命令シーケンスに対応するもので、 `a.out'フォーマットのオブジェクト・モジュールを生成します。 独自のコンフィギュレーションを作成するには、 ファイル`arm.h'を変更したファイルを作成する必要があるかもしれません。
`arm-*-linuxaout'
LinuxベースのGNUシステムを`a.out'バイナリ・フォーマット (ELFはまだサポートされていません) で実行している任意のARMファミリ・プロセッサ。 バージョン2.8.1.0.7以降のGNU/Linux binutilsを使わなければなりません。 これは、 `sunsite.unc.edu:/pub/Linux/GCC'、 および、 LinuxベースのGNUシステムの他のミラー・サイトからダウンロードできます。
`arm-*-riscix'
Acornが移植したBSD UNIXであるRISC iXを動作させているARM2またはARM3プロセッサ。 バージョン1.2よりも古いRISC iXを動作させている場合は、 コンフィギュレーションの過程でバージョン番号を指定しなければなりません。 RISC iXに含まれているアセンブラは、 stabsデバッグ情報をサポートしていないことに注意してください。 stabsサポートを含む新しいバージョンのアセンブラは、 Acornから `ftp.acorn.com:/pub/riscix/as+xterm.tar.Z' をftpすることで入手可能です。 stabsデバッグ情報を有効にするには、 configureの実行において`--with-gnu-as'を指定してください。 configureを実行する前に、 GNU `sed'をインストールする必要があります。
`a29k'
AMDのAm29kファミリ・プロセッサ。 これは通常、 組み込みアプリケーションにおいて使われます。 標準のUNIXコンフィギュレーションは存在しません。 このコンフィギュレーションは、 AMDの標準呼び出しシーケンスおよび標準バイナリ・インターフェイスに対応していて、 他の29kツールと互換性があります。 独自のコンフィギュレーションを作成するには、 ファイル`a29k.h'を変更したファイルを作成する必要があるかもしれません。
`a29k-*-bsd'
BSD UNIXの変種を動作させるシステムにおいて使われるAMD Am29050。
`decstation-*'
MIPSベースのDECstationは、 3つの異なるパーソナリティ Ultrix、 DEC OSF/1、 OSF/rose をサポートすることができます。 (AlphaベースのDECstation製品のコンフィギュレーションは、 `alpha-dec'で始まる名前を持ちます。) これらのプラットフォーム用にGCCを構成(configureを実行)するには、 以下のコンフィギュレーションを使ってください。
`decstation-ultrix'
Ultrixコンフィギュレーション。
`decstation-osf1'
DEC版のOSF/1。
`decstation-osfrose'
ECOFFではなくOSF/roseオブジェクト・ファイル・フォーマットを使う、 Open Software Foundationリファレンス版のOSF/1。 通常、 このコンフィギュレーションを選択することはないでしょう。
MIPS Cコンパイラを使って`cp/parse.c'をコンパイルするためには、 `-Wf,-XNg1500'オプションによって、 switch文用のテーブル・サイズを大きくするよう、 このコンパイラに通知する必要があります。 最適化オプション`-O2'を使うのであれば、 `-Olimit 3000'も指定する必要があります。 シェル・スクリプト`configure'がビルドする`Makefile'には、 これら両方のオプションが自動的に書き込まれます。 make変数CCを上書きしてMIPSコンパイラを使う場合は、 `-Wf,-XNg1500 -Olimit 3000'を追加する必要があるかもしれません。
`elxsi-elxsi-bsd'
ElxsiのCコンパイラの既知の制限のために、 このコンパイラを使ってGNU Cをコンパイルすることはできません。 さらに詳しい情報を知りたい場合は、 mrs@cygnus.comに連絡してください。
`dsp16xx'
AT&T DSP1610プロセッサ・ファミリへの移植版。
`h8300-*-*'
日立のH8/300プロセッサ・シリーズ。 呼び出し既約と構造体のレイアウトが、 リリース2.6において変更になりました。 すべてのコードを再コンパイルしなければなりません。 新しい呼び出し既約では、 関数呼び出しにおける最初の3つの引数はレジスタに入れて渡されます。 構造体のバイト数は、 もはや2の倍数ではありません。
`hppa*-*-*'
HP-PAプロセッサにはいくつかの変種があり、 さまざまなオペレーティング・システムが動作します。 GNU CCは、 正しいプロセッサ種別とオペレーティング・システムを使うよう構成(configureを実行)されなければなりません。 さもないと、 GNU CCは正しく機能しません。 この問題を処理するための最も簡単な方法は、 GNU CCの構成(configureの実行)時にターゲットを指定しないことです。 `configure'が、 正しいプロセッサ種別とオペレーティング・システムを自動的に決定することを試みてくれます。 HP-UX上では`-g'は機能しません。 このシステムが、 GNU CCの知らない奇妙なデバッグ・フォーマットを使っているからです。 しかし、 GCCとともにGASとGDBを使うのであれば、 `-g'は機能します。 すべてのHP-PAコンフィギュレーションにおいて、 GASを使うことを強くお勧めします。 GDB 4.16(以降)とともにGAS 2.6(以降)を使うべきです。 いずれも、 古くからあるすべてのGNU ftpアーカイブ・サイトから入手できます。 いくつかのバージョンのHP-UXでは、 GNU `sed'のインストールが必要になります。 GASは、 サーチ・パスにおいて /bin/usr/bin/usr/ccs/bin よりも前にあるディレクトリにインストールする必要があります。 また、 GASのインストールは、 GNU CCをビルドする前に行なわなければなりません。 デバッグ情報を有効にするには、 ビルドをする前に、 `--with-gnu-as'オプションを指定してGNU CCを構成(configureを実行)しなければなりません。
`i370-*-*'
この移植版は極めて予備的なもので、 まだ多くの既知のバグを含んでいます。 近いうちに、 より高い品質を持つ、 このマシンへの移植版を提供したいと考えています。
`i386-*-linux-gnuoldld'
バージョン2.5.2以降のgas/binutilsがインストールされていない状態で、 LinuxベースのGNUシステムにおいて`a.out'バイナリを生成するには、 このコンフィギュレーションを使ってください。 これは、 古くなって不用となったコンフィギュレーションです。
`i386-*-linux-gnuaout'
LinuxベースのGNUシステムにおいて`a.out'バイナリを生成するには、 このコンフィギュレーションを使ってください。 このコンフィギュレーションは新しいものに取って代わられつつあります。 バージョン2.5.2以降のgas/binutilsを使わなければなりません。
`i386-*-linux-gnu'
LinuxベースのGNUシステムにおいてELFバイナリを生成するには、 このコンフィギュレーションを使ってください。 バージョン2.5.2以降のgas/binutilsを使わなければなりません。
`i386-*-sco'
RCCによるコンパイルをお勧めします。 また、 システムに付属しているmallocではなく、 GNU mallocをリンクするほうが良いかもしれません。
`i386-*-sco3.2v4'
SCOリリース3.2のバージョン4では、 このコンフィギュレーションを使ってください。
`i386-*-sco3.2v5*'
バージョン 5.0.0、 5.0.2、 5.0.4、 5.0.5、 および、 Internet FastStart 1.0、 Internet FastStart 1.1 を含むSCO OpenServer Releaseファミリでは、 このコンフィギュレーションを使ってください。 `-mcoff'が指定されると、 GNU CCはCOFFバイナリを生成することができます。 また、 デフォルトでは、 ELFバイナリを生成することができます。 ELFをビルドするELFコンパイラが生成されるよう、 完全な`make bootstrap'の実行をお勧めします。 5.0.4よりも古いリリースでは、 ELF C++バイナリを正しく動作させるには、 ftp://ftp.sco.com/TLSから入手できるTLS597をインストールしなければなりません。 OSに無償で付属しているネイティブSCOアセンブラが通常は必要となります。 しかし、 (おそらくは複雑なasm文を使うため) GNUアセンブラを使えることが必須であるならば、 `--with-gnu-as'を指定して構成(configureを実行)しなければなりません。 そのためには、 (cpコマンドまたはシンボリック・リンクによって) gcc/asがGNUアセンブラを指すようにしなければなりません。 また、 新しいバージョンのGNU binutilsを使わなければなりません。 バージョン2.9.1は正しく動作するようです。 このオプションを選択すると、 COFFイメージをビルドすることはできなくなります。 COFFイメージをビルドしようとすると、 訳の分からない結果となるでしょう。 一般的に言って、 --with-gnu-asオプションは、 ネイティブ・アセンブラほどには十分にテストされていません。 注: C++コンパイラをビルドしているのであれば、 `make bootstrap'起動の手順に正しく従わなければなりません。 OpenServerのネイティブ・コンパイラが、 多くの正当なC++プログラムを正しく解析できない `cc1plus'をビルドしてしまうかもしれないからです。 ネイティブ・コンパイラを使ってビルドを行なうのであれば、 `make bootstrap'を実行しなければなりません 。
`i386-*-isc'
システムに付属しているmallocではなく、 GNU mallocをリンクするほうが良いかもしれません。 ISCバージョン4.1では、 `deduced.h'をビルドする際に`sed'がコア・ダンプします。 バージョン4.0に付属の`sed'を使ってください。
`i386-*-esix'
システムに付属しているmallocではなく、 GNU mallocをリンクするほうが良いかもしれません。
`i386-ibm-aix'
バージョン2.1以降のGASと バージョン2.2以降のGNU binutilsに含まれるLDを使う必要があります。
`i386-sequent-bsd'
コンパイルを開始する前にBerkeleyユニバース(Berkeley universe)に移行してください。
`i386-sequent-ptx1*'
`i386-sequent-ptx2*'
`configure'を実行する前にGNU `sed'をインストールしなければなりません。
`i386-sun-sunos4'
システムに付属のコンパイラによってカレント・バージョンのGNU CCをビルトすると、 `libgcc2.c'の一部をコンパイルする際に無限ループに陥るようなので、 ブートストラップを開始するためには、 別のGNU CCが必要になるかもしれません。 (任意のバージョンの)GNU CCによってコンパイルされたバージョン2のGNU CCには、 このような問題はないようです。 SunのシステムへのGNU CCのインストールに関する情報については、 SunへのGNU CCのインストールを参照してください。
`i[345]86-*-winnt3.5'
このバージョンでは、 まだリリースされていないGASが必要となります。 これがリリースされるまでの間は、 `cs.washington.edu:pub/gnat' または `cs.nyu.edu:pub/gnat' からanonymous ftpによって、 予備的にビルドされたバイナリ・バージョンを入手することができます。 また、 Windows NT 3.5 SDKに付属のMicrosoftヘッダ・ファイルを使わなければなりません。 これらは、 CDROM上の日付が1994年9月4日のディレクトリ`/mstools/h'にあります。 さらに、 NT 3.5用に特別に作成された修正版のMicrosoftリンカを使わなければなりません。 これもNT 3.5 SDK CDROMに収録されています。 このリンカが手に入らない場合は、 Visual C/C++ 1.0または2.0に付属のリンカを使うこともできます。 NT用のGNU CCをインストールすると、 `ld.exe'という名前のラッパ・リンカがビルドされます。 これは、 ライブラリの指定 (`-L'および`-l') において、 UNIXの`ld'の振る舞いを模倣するものです。 `ld.exe'は、 UNIXスタイルの名前のライブラリとMicrosoftスタイルの名前のライブラリの両方を探します。 例えば、 `-lfoo'を指定すると、 `ld.exe'は、 最初に`libfoo.a'を、 次に`foo.lib'を探します。 Windows NT用のGNU CCは、 UNIX風のシェルおよびユーティリティの有無によって、 2つの方法のいずれかを使ってインストールすることができます。
  1. UNIX風のシェル、ユーティリティがない場合には、 `configure.bat'という名前のDOSスタイルのバッチ・スクリプトを使います。 MSDOSコンソール・ウィンドウ、 または、 プログラム・マネージャのダイアログ・ボックスから、 このスクリプトをconfigure winntとして起動します。 `configure.bat'は、 `Makefile.in'から実際に使える`Makefile'を生成するのに使われるUNIX風の`sed'プログラムが、 既にインストール済みでパスの中に存在することを想定しています。 `Makefile'は、 GNU CCをビルドするのに、 メンテナンス・ユーティリティMicrosoft NmakeプログラムとVisual C/C++ V8.00コンパイラを使います。 コンパイラ自身を自動的にビルドするだけであるこのインストール方法を使うには、 `sed'ユーティリティと`touch'ユーティリティだけがあれば十分です。 その後に、 `fixinc.winnt'の処理内容を調べて、 ヘッダ・ファイルを手作業で編集して、 `libgcc.a'を手作業でビルドしなければなりません。
  2. 第2のインストール方法では、 UNIX風のシェルが実行されていること、 パスの中にUNIX風のユーティリティが完全に揃っていること、 および、 上記のビルド方法によってビルドされたものであれ、 あらかじめビルド済みのバイナリを手に入れたのであれ、 以前のバージョンのGNU CCが既にインストールされていることを想定しています。 この方法では、 通常どおりに`configure'スクリプトを使います。
`i860-intel-osf1'
これはParagonです。 このオペレーティング・システムのバージョン1.0を使っている場合に必要となる、 システムの特性を補うための作業については、 インストールの問題を参照してください。
`*-lynx-lynxos'
LynxOS 2.2以前のバージョンには、 GNU CC 1.xが`/bin/gcc'として既にインストールされています。 コンパイルは、 `/bin/cc'ではなく、 このGNU CCを使って行なわなければなりません。 構成(configureの実行)の際に`--with-gnu-as --with-gnu-ld'を指定することによって、 GNUアセンブラとGNUリンカを使うよう、 GNU CCに対して指示することができます。 これによって、 COFFフォーマットのオブジェクト・ファイルと実行ファイルが生成されます。 こうしないと、 GNU CCはインストールされているツールを使うことになり、 `a.out'フォーマットの実行ファイルが生成されます。
`m32r-*-elf'
三菱M32Rプロセッサ。 このコンフィギュレーションは組み込みシステム用です。
`m68000-hp-bsd'
BSDを動作させるHP 9000シリーズ200。 このシステムに付属のCコンパイラはGNU CCをコンパイルすることはできませんので、 注意してください。 ブートストラップ用のGNU CCバイナリを入手するには、 law@cygnus.comに連絡してください。
`m68k-altos'
Altos 3068。 GNUアセンブラ、 GNUリンカ、 GNUデバッガを使わなければなりません。 また、 カーネルのバグを修正しなければなりません。 詳細情報は、 ファイル`README.ALTOS'に記載されています。
`m68k-apple-aux'
A/UXを動作させるApple Macintosh。 システムのアセンブラ、リンカとGNUのアセンブラ、リンカのどちらかを使うように GCCを構成(configureを実行)することができます。 可能であれば、 GNUのコンフィギュレーションを使うべきです。 特にGNU C++も使いたい場合はそうするべきです。 このコンフィギュレーションは、 configureに対する `--with-gnu-as'オプションと`--with-gnu-ld'オプション によって有効にします。 このシステムに付属しているCコンパイラはGNU CCをコンパイルすることができませんので、 注意してください。 ブートストラップ用のGNU CCのバイナリは、 jagubox.gsfc.nasa.govにあります。 また、 オリジナル版にある いくつかの恣意的な上限を大きくした、 `/bin/ld'のパッチ版もあります。
`m68k-att-sysv'
7300 PCとしても知られているAT&T 3b1。 このマシンの標準Cコンパイラのバグのために、 このコンパイラを使ってGNU CCをコンパイルするには、 特殊な手順が必要になります。 以前のバージョンのGNU CCがあれば、 それを使ったほうがより簡単にブートストラップを行なうことができます。 既に動作するGNU CCがないとすると、 インストールされているCコンパイラのバグのため、 3b1上にGNU CCをインストールするのは困難でしょう。 しかし、 以下の手順でうまくいくかもしれません。 私たちには、 これをテストすることができません。
  1. `cccp.c'の先頭近くにある `#include "config.h"'という行をコメントにして、 `make cpp'を実行します。 これにより、 予備的なバージョンのGNU cppが作成されます。
  2. 古い`/lib/cpp'を退避して、 予備的なGNU cppをこの名前のファイルとしてコピーします。
  3. `cccp.c'に加えた変更を元に戻すか、 あるいは、 オリジナル版を再インストールして、 `make cpp'を再実行します。
  4. このGNU cppのファイナル版を`/lib/cpp'にコピーします。
  5. ファイル`tree.c'の中に出現するすべてのobstack_freeを、 _obstack_freeに置き換えます。
  6. ステージ1のGNU CCを手に入れるためにmakeを実行します。
  7. オリジナル版の`/lib/cpp'を再インストールします。
  8. ここまでくると、 通常の方法で、 GNU CC自身を使ってGNU CCをコンパイルして、 インストールすることができます。
`m68k-bull-sysv'
BOS-2.00.45からBOS-2.01までを動作させるBull DPX/2シリーズ200およびシリーズ300。 GNU CCは、 ネイティブ・アセンブラ、 GNUアセンブラのいずれを使っても動作します。 configureスクリプトに対して`--with-gnu-as'を指定することによって GNUアセンブラを使ってネイティブなCOFFを生成することもできますし、 `--with-gnu-as --stabs'を指定することによって、 GNUアセンブラを使ってCOFFの内部へのdbxカプセル化(dbx-in-coff encapsulation)を行なうこともできます。 ネイティブ・アセンブラに関連する問題、 あるいは、 DPX/2に移植されたGASの入手に関しては、 F.Pierresteguy@frcl.bull.frに連絡してください。
`m68k-crds-unox'
Unos上でビルドするには、 `configure unos'を使います。 Unosアセンブラの名前は、 asではなくcasmです。 何らかの奇妙な理由により、 `/bin/as'`/bin/casm'にリンクすると振る舞いが変わってしまって、 動作しなくなってしまいます。 したがって、 GNU CCをインストールする際に、 GCCの各パスのファイルがインストールされているサブディレクトリに、 以下のスクリプトを`as'という名前でインストールしなければなりません。
#!/bin/sh
casm $*
Unosのデフォルトのライブラリの名前は、 `libc.a'ではなく`libunos.a'です。 GNU CCが機能できるようにするためには、 `gcc.c'の中で`-lc'を指定しているすべての部分を `-lunos'に変更するか、 `/lib/libc.a'`/lib/libunos.a'にリンクします。 標準のコンパイラを使ってGNU CCをコンパイルする際には、 allocaのサポートに関するバグを克服するために、 ステージ2をビルドしているときには`-O'を指定しないでください。 その後に、 ステージ2・コンパイラに`-O'を指定してステージ3・コンパイラをビルドします。 このコンパイラが、 他のシステム上における通常のステージ2・コンパイラと同一の性格を持ちます。 これを使ってステージ4・コンパイラをビルドします。 正しくコンパイルできたことを検証するには、 このステージ4をステージ3と比較します。 (コメントの中に記述されているように、 `x-crds'の中においてALLOCAを定義するだけで、 上のパラグラフの記載はおそらく不必要になるでしょう。 この方法でうまくいくかどうか、 情報を提供してください。) Unosでは、 デマンド・ページングの代わりにメモリ・セグメンテーションを利用しています。 したがって、 大量のメモリが必要になります。 他のタスクがまったく動作していないのであれば、 5MBあればかろうじて足りるでしょう。 `cc1'のリンクに失敗するのであれば、 オブジェクト・ファイルをライブラリの中に入れて、 そのライブラリからリンクすることを試みてください。
`m68k-hp-hpux'
HP-UXを動作させるHP 9000シリーズ300またはシリーズ400。 HP-UXのバージョン8.0のアセンブラには、 GNU CCのコンパイルを妨げるバグがあります。 このバグを修正するには、 HPからパッチPHCO_4484を入手してください。 さらに、 `--with-gnu-as'によりGASを使いたいのであれば、 GASのバージョン2.1以降を使わなければなりません。 また、 GNUリンカのバージョン2.1以降を使わなければなりません。 これよりも前のバージョンのGASは、 GASの出力をネイティブHP-UXフォーマットに変換する別のプログラムに依存していましたが、 このプログラムは最新の状態に合わせて更新されていません。 GDBは、 このネイティブHP-UXフォーマットを認識しないので、 GDBを使うのであればGASを使わなければなりません。
`m68k-sun'
Sun 3。 デフォルトでSun FPAを使うようなコンフィギュレーション・ファイルは提供していません。 これは、 浮動小数点トラップに対するシグナル・ハンドラをセットするプログラムは、 本来FPAとともに使うことはできないからです。 SunのシステムへのGNU CCのインストールに関する情報については、 SunへのGNU CCのインストールを参照してください。
`m88k-*-svr3'
AT&T/Unisoft/Motorola V.3のリファレンス版(reference port) を動作させるMotorola m88k。 これらのシステムは、 標準CコンパイラとしてGreen Hills Cのリビジョン1.8.5を使う傾向があります。 このコンパイラには、 ステージ2のオブジェクト・ファイルとステージ3のオブジェクト・ファイルとに相違をもたらすようなバグが明らかに存在します。 このようなことが起こった場合には、 ステージ4・コンパイラを作成して、 それをステージ3・コンパイラと比較してください。 ステージ3のオブジェクト・ファイルとステージ4のオブジェクト・ファイルが同一であれば、 標準Cコンパイラの問題に直面したということを示唆しています。 ステージ3・コンパイラとステージ4・コンパイラは使用可能かもしれません。 しかし、 古いバージョンのGNU CCがあれば、 最も望ましいのはそれをブートストラップ用に使うことです。
`m88k-*-dgux'
DG/UXを動作させるMotorola m88k。 DG/UX上で 88open BCSのネイティブ・コンパイラまたはクロス・コンパイラをビルドするには、 コンフィギュレーション名に`m88k-*-dguxbcs'を指定して、 88open BCSソフトウェア開発環境でビルドします。 DG/UX上で ELFのネイティブ・コンパイラまたはクロス・コンパイラをビルドするには、 `m88k-*-dgux'を指定して、 DG/UX ELF開発環境でビルドします。 ソフトウェア開発環境は、 オペランドに`m88kbcs'または`m88kdguxelf'を指定して `sde-target'コマンドを実行することによって、 セットします。 コンフィギュレーション名を指定しないと、 その時点におけるソフトウェア開発環境をもとに、 `configure'がコンフィギュレーションを推定します。
`m88k-tektronix-sysv3'
UTekV 3.2eを動作させるTektronix XD88。 バグの多いGreen Hillsコンパイラを使ってブートストラップを行なうのであれば、 ステージ1をビルドする際には最適化を有効にしないでください。 また、 バンドルされているLAI System V NFSにはバグが多いので、 NFSマウントされたディレクトリ上でビルドを行なっているのであれば、 完全にリブートをするか、 さもなければ、 できればNFSの使用をすべて避けてください。 そうしないと、 ステージ間の正しい比較を行なうのに支障があるかもしれません。
`mips-mips-bsd'
MIPSオペレーティング・システムをBSDモードで動作させるMIPSマシン。 このシステムのいくつかの古いバージョンでは、 関数 memcpymemcmpmemset が欠けている可能性があります。 システムにこれらの関数がない場合は、 `mips-bsd.h'の中のTARGET_MEM_FUNCTIONSの定義を削除するか取り消すことをしなければなりません。 MIPSのCコンパイラを使って`cp/parse.c'をコンパイルするためには、 `-Wf,-XNg1500'オプションによって、 switch文用のテーブル・サイズを大きくするよう指示する必要があります。 最適化オプション`-O2'を指定するのであれば、 `-Olimit 3000'も指定する必要があります。 これらのオプションはいずれも、 シェル・スクリプト`configure'がビルドする`Makefile'の中に自動的に記述されます。 make変数CCを無効にしてMIPSコンパイラを使うのであれば、 `-Wf,-XNg1500 -Olimit 3000'を追加する必要があるかもしれません。
`mips-mips-riscos*'
MIPS Cコンパイラを使って`cp/parse.c'をコンパイルするためには、 `-Wf,-XNg1500'オプションによって、 switch文用のテーブル・サイズを大きくするよう指示する必要があります。 最適化オプション`-O2'を指定するのであれば、 `-Olimit 3000'も指定する必要があります。 これらのオプションはいずれも、 シェル・スクリプト`configure'がビルドする`Makefile'の中に自動的に記述されます。 make変数CCを無効にしてMIPSコンパイラを使うのであれば、 `-Wf,-XNg1500 -Olimit 3000'を追加する必要があるかもしれません。 RISC-OSを動作させるMIPSマシンは、 4つの異なるパーソナリティをサポートすることができます。 デフォルト、 BSD 4.3、 System V.3、 System V.4です (古いバージョンのRISC-OSは、 System V.4をサポートしていません)。 これらのプラットフォーム用にGCCを構成(configureを実行)するには、 以下のコンフィギュレーションを使います。
`mips-mips-riscosrev'
RISC-OS、リビジョンrevのデフォルトのコンフィギュレーション。
`mips-mips-riscosrevbsd'
RISC-OS、リビジョンrevのBSD 4.3コンフィギュレーション。
`mips-mips-riscosrevsysv4'
RISC-OS、リビジョンrevのSystem V.4コンフィギュレーション。
`mips-mips-riscosrevsysv'
RISC-OS、リビジョンrevのSystem V.3コンフィギュレーション。
上記のリビジョンrevは、 使用されるRISC-OSのリビジョンです。 RISC-OSのリビジョン4からリビジョン5へ移行する際には、 GCCの再構成(configureの実行)を行なわなければなりません。 これは、 リンカのバグを回避する効果を持ちます (詳細については、 インストールの問題を参照)。
`mips-sgi-*'
IRIX 4を動作させるSGIの上でGCCをコンパイルするためには、 Silicon Graphicsから提供されるCD-ROMから "c.hdr.lib"オプションをインストールしなければなりません。 これは、 リリース4.0.1の2枚めのCDに入っています。 IRIX 5を動作させるSGIの上でGCCをコンパイルするためには、 Silicon Graphicsから提供されるIDO CD-ROMから "compiler_dev.hdr"サブシステムをインストールしなければなりません。 IRIXのバージョン5では、 CFLAGS`-save-temps'を追加しないと、 make compareによる比較結果は不一致となるかもしれません。 これらのシステムでは、 オブジェクト・ファイルの中にアセンブラ入力ファイルの名前が含まれていて、 stage1stage2のそれぞれのコンパイルにおいてこの名前が異なると、 オブジェクト・ファイルの比較は不一致という結果になります。 オプション`-save-temps'は、 アセンブラ入力ファイルに対して、 `/tmp'において無作為に選択された名前の代わりに、 ある固定した名前が使われるよう強制します。 `-save-temps'は、 これを指定しないと比較の結果が不一致となる場合以外は追加しないでください。 `-save-temps'を追加すると、 一連のコンパイルのたびに `.i'ファイルと`.s'ファイルを手作業で削除しなければならなくなります。 MIPS Cコンパイラを使って`cp/parse.c'をコンパイルするためには、 `-Wf,-XNg1500'オプションによって、 switch文用のテーブル・サイズを大きくするよう指示する必要があります。 最適化オプション`-O2'を指定するのであれば、 `-Olimit 3000'も指定する必要があります。 これらのオプションはいずれも、 シェル・スクリプト`configure'がビルドする`Makefile'の中に自動的に記述されます。 make変数CCを無効にしてMIPSコンパイラを使うのであれば、 `-Wf,-XNg1500 -Olimit 3000'を追加する必要があるかもしれません。 Irixのバージョン4.0.5Fには、 命令の順序変更が正しく行なわれないというアセンブラのバグがあります。 より古いバージョンのいくつかにも、 おそらくこのバグがあるでしょう。 このバグを回避するには、 `mips-sgi-irix4loser'というターゲット・コンフィギュレーションを指定してください。 このコンフィギュレーションは、 アセンブラの最適化を禁止します。 ターゲット`mips-sgi-irix4'によって構成(configureを実行)されたコンパイラでは、 `-noasmopt'オプションを使うことによってアセンブラの最適化を無効にすることができます。 このコンパイラ・オプションを指定すると、 命令の順序変更を禁止するために、 アセンブラに対してオプション`-O0'が渡されます。 `-noasmopt'オプションは、 問題の原因がアセンブラによる誤った命令の順序変更にあるのかどうかテストするのに役に立ちます。 `-noasmopt'オプションによって問題が解消されないとしても、 アセンブラによる命令の順序変更が原因である可能性はあります。 おそらく、 命令の順序変更のために、 GNU CC自身が正しくコンパイルされなかった可能性があるのです。 Irix 5でのデバッグを可能にするためには、 GNU as 2.5以降を使い、 gccの構成(configureの実行)を行なう際に configureオプション`--with-gnu-as'を指定しなければなりません。 GNU asは、 binutilsパッケージの一部として配布されています。
`mips-sony-sysv'
ソニーのMIPS NEWS。 これはNEWSOS 5.0.1では機能しますが、 (COFFではなくELFを使う) 5.0.2では機能しません。 5.0.2のサポートは、 おそらく近いうちにボランティアによって提供されることになるでしょう。 特に問題となるのは、 共用ライブラリをリンクする際に、 GCCによって生成されたコードをリンカが嫌うことです。
`ns32k-encore'
Encore ns32000システム。 Encoreシステムは、 BSDの場合のみサポートされます。
`ns32k-*-genix'
National Semiconductorのns32000システム。 Genixには、 allocamallocにバグがあります。 GNU Emacsから、 これらのコンパイル済みのバージョンを入手しなければなりません。
`ns32k-sequent'
コンパイルを開始する前にBerkeleyユニバース(Berkeley universe)に移行してください。
`ns32k-utek'
UTEKのns32000システム(merlin)。 このシステムに付属しているCコンパイラでは、 GNU CCをコンパイルすることができません。 ブートストラップ用のGNU CCバイナリの入手については、 `tektronix!reed!mason'に連絡してください。
`romp-*-aos'
`romp-*-mach'
IBM RT PCにおいてサポートされるオペレーティング・システムは、 AOSとMACHだけです。 GNU CCは、 RT上で動作するAIXをサポートしていません。 古いバージョンのGNU CCを使ってGNU CCをコンパイルすることをお勧めします。 Metawareコンパイラhcを使ってGNU CCをコンパイルすることもできますが、 ステージ2・コンパイラとステージ3・コンパイラの比較において、 さまざまなファイルが不一致となるでしょう。 これらのエラーは、 いくつかの浮動小数点定数における重要ではない相違であって、 無視しても安全です。 ステージ3・コンパイラは適正です。
`rs6000-*-aix'
`powerpc-*-aix'
IBM XLCコンパイラの各リリースのさまざまな初期バージョンでは、 GNU CCをブートストラップすることはできないでしょう。 現象としては、 ステージ2のオブジェクト・ファイルとステージ3のオブジェクト・ファイルの相違や、 `libgcc.a'または`enquire'のコンパイルにおけるエラーが挙げられます。 問題のあるリリースとして知られているものの中には、 xlc-1.2.1.8、 (AIX 3.2.5とともに配布されている)xlc-1.3.0.0、 xlc-1.3.0.19 があります。 xlc-1.2.1.28とxlc-1.3.0.24(PTF 432238)はともに、 正しく機能するGNU CCを生成できることが分かっています。 最近のほとんどのリリースは、 正しくGNU CCをブートストラップすることができます。 AIXのリリース4.3.0、 および、 3.2.4よりも前のリリースには、 デバッグ指示子を受け付けないIBMアセンブラが含まれています。 アセンブラのアップデートはPTFとして入手可能です。 また、 AIX 3.2.5以降とともにGNUアセンブラを使う場合、 GNU Cコンパイラをビルドするためには、 1995年10月16日以降に修正されたバージョンでなければなりません。 これらの問題に関するさらに詳しい情報については、 ファイル`README.RS6000'を参照してください。 GNU CCはまだ64ビットのPowerPC命令をサポートしていません。 このアーキテクチャ上ではObjective Cは正しく機能しません。 Objective Cの想定が、 このアーキテクチャの呼び出し規約と両立しないからです。 RS/6000上のAIXは、 米国以外の環境に対するサポート(NLS)を提供しています。 コンパイラやアセンブラは、 浮動小数点数 (小数部分の区切りとして"."と","のどちらを使うか) を含む、 さまざまなオブジェクトの地域固有の表現をサポートするためにNLSを使います。 GNU CCによりリンクされるライブラリが、 アセンブラの受け付ける浮動小数点フォーマットと同一のフォーマットを生成しない という問題が報告されています。 この問題に直面した場合は、 LANG環境変数をCまたはEn_USにセットしてください。 GNU CCがAIX 4.1用のバインダ(リンカ)を起動する方法が変更されたために、 リンク段階において、 以前は報告されなかった重複シンボルに関する警告を受けることがあるかもしれません。 GNU CCによって生成されるAIX用のアセンブリ・ファイルには、 常に、 元のプログラムの中のいくつかの広域変数宣言や広域関数宣言のシンボル定義が複数含まれています。 警告メッセージが出力されても、 リンカが正しくライブラリや実行可能ファイルを生成することが妨げられることはないはずです。 デフォルトでは、 AIX 4.1では、 PowerプロセッサとPowerPCプロセッサのどちらでも使うことのできるコードが生成されます。 configureオプション`--with-cpu-'cpu_typeを使うことによって、 `-mcpu='cpu_typeフラグのデフォルト・バージョンを指定することができます。
`powerpc-*-elf'
`powerpc-*-sysv4'
System V.4を動作させるビッグ・エンディアン・モードのPowerPCシステム。 configureオプション`--with-cpu-'cpu_typeを使うことによって、 `-mcpu='cpu_typeフラグのデフォルト・バージョンを指定することができます。
`powerpc-*-linux-gnu'
LinuxベースのGNUシステムを動作させるビッグ・エンディアン・モードのPowerPCシステム。 configureオプション`--with-cpu-'cpu_typeを使うことによって、 `-mcpu='cpu_typeフラグのデフォルト・バージョンを指定することができます。
`powerpc-*-eabiaix'
デフォルトとして-mcall-aixが選択された、 ビッグ・エンディアン・モードの組み込みPowerPCシステム。 configureオプション`--with-cpu-'cpu_typeを使うことによって、 `-mcpu='cpu_typeフラグのデフォルト・バージョンを指定することができます。
`powerpc-*-eabisim'
PSIMシミュレータ配下での動作に使用される、 ビッグ・エンディアン・モードの組み込みPowerPCシステム。 configureオプション`--with-cpu-'cpu_typeを使うことによって、 `-mcpu='cpu_typeフラグのデフォルト・バージョンを指定することができます。
`powerpc-*-eabi'
ビッグ・エンディアン・モードの組み込みPowerPCシステム。 configureオプション`--with-cpu-'cpu_typeを使うことによって、 `-mcpu='cpu_typeフラグのデフォルト・バージョンを指定することができます。
`powerpcle-*-elf'
`powerpcle-*-sysv4'
System V.4を動作させるリトル・エンディアン・モードのPowerPCシステム。 configureオプション`--with-cpu-'cpu_typeを使うことによって、 `-mcpu='cpu_typeフラグのデフォルト・バージョンを指定することができます。
`powerpcle-*-solaris2*'
Solaris 2.5.1以降を動作させるリトル・エンディアン・モードのPowerPCシステム。 configureオプション`--with-cpu-'cpu_typeを使うことによって、 `-mcpu='cpu_typeフラグのデフォルト・バージョンを指定することができます。 Sun 4.0コンパイラのベータ版では、 GNU CCを正しくビルドすることができないようです。 また、 ホスト・アセンブラやリンカには問題がありますが、 GNU版のツールを使うことによって、 この問題は解消します。
`powerpcle-*-eabisim'
PSIMシミュレータ配下での動作に使用される、 リトル・エンディアン・モードの組み込みPowerPCシステム。
`powerpcle-*-eabi'
リトル・エンディアン・モードの組み込みPowerPCシステム。 configureオプション`--with-cpu-'cpu_typeを使うことによって、 `-mcpu='cpu_typeフラグのデフォルト・バージョンを指定することができます。
`powerpcle-*-winnt'
`powerpcle-*-pe'
Windows NTを動作させるリトル・エンディアン・モードのPowerPCシステム。 configureオプション`--with-cpu-'cpu_typeを使うことによって、 `-mcpu='cpu_typeフラグのデフォルト・バージョンを指定することができます。
`vax-dec-ultrix'
Vax C(vcc)を使ってコンパイルを試みてはいけません。 いくつかのケース (例えば、 allocaが使われた場合) において、 正しくないコードが生成されます。 その一方で、 pccの内部的なテーブル・サイズの制限のために このコンパイラ(pcc)によって`cp/parse.c'をコンパイルすることはできません。 この問題を回避するためには、 最初にGNU Cコンパイラだけをコンパイルして、 それを使って再コンパイルすることによって、 動作させたいすべての言語用のコンパイラをビルドします。
`sparc-sun-*'
SunのシステムへのGNU CCのインストールに関する情報については、 SunへのGNU CCのインストールを参照してください。
`vax-dec-vms'
VMS上へのGNU CCのインストール方法に関する詳細については、 VMSへのGNU CCのインストールを参照してください。
`we32k-*-*'
これらのコンピュータは、 3b2、 3b5、 3b20、 および、 これに類似した名前でも知られています (ただし、 3b1は実際には68000です。 GNU CCのサポートするコンフィギュレーションを参照してください)。 システムのコンパイラでコンパイルをする際には、 `-g'を使わないでください。 システムのリンカは、 このような大きなプログラムにデバッグ情報が付いている場合、 それを処理することができないようです。 システムのコンパイラは、 GNU CCの`stmt.c'をコンパイルする際に容量不足に陥ります。 この問題は、 最初にGNU CCの`cpp'をビルドして、 システムのプリプロセッサの代わりにこれをシステムのCコンパイラと組み合わせて `stmt.c'をコンパイルすることで回避できます。 以下にその手順を示します。
mv /lib/cpp /lib/cpp.att
cp cpp /lib/cpp.gnu
echo '/lib/cpp.gnu -traditional ${1+"$@"}' > /lib/cpp
chmod +x /lib/cpp
システムのコンパイラは、 GNU CCの最適化ファイルのいくつかに対して正しくないコードを生成します。 したがって、 ステージ2・コンパイラは最適化せずにビルドしなければなりません。 その後に、 ステージ3・コンパイラを最適化してビルドしてください。 その結果生成される実行ファイルは正しく機能するはずです。 以下に必要なコマンドを示します。
make LANGUAGES=c CC=stage1/xgcc CFLAGS="-Bstage1/ -g"
make stage2
make CC=stage2/xgcc CFLAGS="-Bstage2/ -g -O"
ファイル`cc1plus'のサイズは1メガバイトを超えるので、 C++コンパイラをビルドするためには、 ULIMITの設定値を大きくする必要があるかもしれません。

別ディレクトリにおけるコンパイル

ソース・ファイルのディレクトリ以外のディレクトリにおいて オブジェクト・ファイルと実行可能ファイルをビルドしたい場合、 通常の手順とは異なる、 以下のことをしなければなりません。

  1. VPATH機能をサポートするMakeを使っていることを確認してください。 (GNU Makeはこの機能をサポートしています。 ほとんどのBSDシステム上のMakeも同様です。)
  2. ソース・ディレクトリにおいて一度でも`configure'を実行したことがあれば、 そのコンフィギュレーションを取り消す必要があります。 そのためには、 以下のとおり実行します。
    make distclean
    
  3. `configure'を実行する前に、 コンパイラをビルドしたいディレクトリに移動します。
    mkdir gcc-sun3
    cd gcc-sun3
    
    シンボリック・リンクをサポートしていないシステムでは、 このディレクトリは、 ソース・コードのディレクトリと同一のファイル・システム上に存在しなければなりません。
  4. `configure'の実行時に、 `configure'の存在場所を指定します。
    ../gcc/configure ...
    
    これにより、 コンパイラ・ソースの存在場所もconfigureに対して示されます。 configureは、 その起動に使われたファイル名からディレクトリ部分を抽出します。 しかし、 ソースの存在場所の指定を確実にしたければ、 以下のようにして、 ソース・ディレクトリを`--srcdir'オプションで指定することもできます。
    ../gcc/configure --srcdir=../gcc other options
    
    `--srcdir'によって指定するディレクトリは、 configureの存在するディレクトリと同一である必要はありません。

ここまでくれば、 そのディレクトリにおいてmakeを実行することができます。 普通のソース・ファイルが変更されただけであれば、 上記のコンフィギュレーション手順を繰り返す必要はありません。 しかし、 コンフィギュレーション・ファイルが変更された場合、 システムがシンボリック・リンクをサポートしていないのであれば、 configureを再実行しなければなりません。

クロス・コンパイラのビルドとインストール

GNU CCは、 すべてのマシンに対してというわけにはいきませんが、 多くのマシンに対してクロス・コンパイラとして機能することができます。

GNU CCはアセンブラ・コードを生成するため、 オブジェクト・ファイルを作成するためには、 GNU CCが実行することのできるクロス・アセンブラがおそらく必要になるでしょう。 ターゲット・マシン以外のマシンでリンクしたいのであれば、 クロス・リンカも必要になります。 また、 ホスト・マシン上にインストールすることのできる、 ターゲット・マシンに適合するヘッダ・ファイルとライブラリも必要になります。

クロス・コンパイルの手順

クロス・コンパイラを使ってプログラムをコンパイルして実行することは、 いくつかの手順を伴います。

これらすべての手順を同一のホスト・マシン上で実行するのが最も便利です。 GNU CCを一度起動するだけですべての手順を実行できるからです。 そのためには、 適切なクロス・アセンブラとクロス・リンカが必要となります。 ターゲットによっては、 GNUアセンブラとGNUリンカが利用可能です。

クロス・コンパイラの構成(configureの実行)

GNU CCをクロス・コンパイラとしてビルドするためには、 まず`configure'を実行することから始めます。 ターゲット種別を指定するには`--target=target'を使います。 実行中のシステムを`configure'が正しく識別できなかった場合は、 `--build=build'オプションも指定します。 以下に例として、 `configure'が正しく識別することのできるシステム上において、 BSDを動作させるHP 68030システム用のコードを生成するクロス・コンパイラを 構成(configureを実行)する方法を示します。

./configure --target=m68k-hp-bsd4.3

クロス・コンパイラ用のツールとライブラリ

クロス・アセンブラとクロス・リンカが利用可能であれば、 それらをインストールしなければなりません。 これらは、 ディレクトリ`/usr/local/target/bin'に置きます。 このディレクトリに置くべきツールの一覧を以下に示します。

`as'
これはクロス・アセンブラでなければなりません。
`ld'
これはクロス・リンカでなければなりません。
`ar'
これはクロス・アーカイバでなければなりません。 クロス・アーカイバとは、 ターゲット・マシンのフォーマットでアーカイブ・ファイル (リンカ・ライブラリ) を操作することのできるプログラムです。
`ranlib'
これは、 アーカイブ・ファイルの中のシンボル・テーブルを作るプログラムでなければなりません。

GNU CCをインストールすると、 このディレクトリの中のこれらのプログラムが見つけられ、 後にクロス・コンパイラが実行されたときにクロス・コンパイラが見つけるのに適した場所に、 コピーまたはリンクされます。

これらのファイルを提供する最も簡単な方法は、 BinutilsパッケージとGASをビルドすることです。 GNU CCを構成(configureを実行)した際に指定したのと同一の値を `--host'オプションおよび`--target'オプションに指定して、 構成(configureの実行)を行ないます。 その後、 ビルドとインストールを行ないます。 実行可能ファイルは、 適切なディレクトリに自動的にインストールされます。 残念ながら、 BinutilsとGASは、 GNU CCがサポートしているターゲットすべてをサポートしてはいません。

標準Cライブラリのような、 クロス・コンパイラとともに使うライブラリをインストールしたいのであれば、 ディレクトリ`/usr/local/target/lib'に置きます。 GNU CCをインストールすると、 このサブディレクトリにあるすべてのファイルは、 GNU CCが見つけてリンクをするのに適した場所にコピーされます。 以下に、 ターゲット・マシンからいくつかのライブラリをコピーする手順の例を示します。

ftp target-machine
lcd /usr/local/target/lib
cd /lib
get libc.a
cd /usr/lib
get libg.a
get libm.a
quit

必要となるライブラリ群の正確な一覧とそのターゲット・マシン上の位置は オペレーティング・システムによって異なります。

多くのターゲットでは、 個々の実行可能ファイルにリンクして組み込まれる、 `crt0.o'`crtn.o'のような「起動ファイル(start files)」が必要となります。 これらもまた `/usr/local/target/lib'に置かれなければなりません。 `crt0.o'については、 プロファイル処理用や他のコンパイル・オプション用として、 いくつかの代替ファイルが存在するかもしれません。 使われている起動ファイルを調べるには、 ターゲットのSTARTFILE_SPECの定義をチェックします。 以下に、 ターゲット・マシンからこれらのファイルをコピーする手順の例を示します。

ftp target-machine
lcd /usr/local/target/lib
prompt
cd /lib
mget *crt*.o
cd /usr/lib
mget *crt*.o
quit

`libgcc.a'とクロス・コンパイラ

GNU CCによりコンパイルされたコードは、 いくつかのランタイム・サポート関数群を暗黙のうちに使います。 これらの関数群のいくつかはGNU CC自身によって問題なくコンパイルすることができますが、 コンパイルできないものも少数ですがあります。 これら問題のある関数群は、 ソース・ファイル`libgcc1.c'の中にあります。 これらから作られたライブラリは`libgcc1.a'という名前です。

ネイティブ・コンパイラをビルドする際には、 これらの関数群は別のコンパイラ、 すなわち、 GNU CCをブートストラップするのに使われたコンパイラによってコンパイルされます。 おそらく、 そのコンパイラは、 これらの演算をオープン・コードする(open code)方法を知っているか、 さもなければ、 マシンに付属するランタイム・エミュレーション機能を呼び出す方法を知っているのでしょう。 しかし、 このアプローチは、 クロス・コンパイラをビルドする際には通用しません。 ビルドに使うコンパイラはホスト・システムのことは知っていますが、 ターゲット・システムのことは知りません。

したがって、 クロス・コンパイラをビルドする際には、 期待されている仕事をこなす適切なライブラリ`libgcc1.a'を提供しなければなりません。

クロス・コンパイラ自身によって`libgcc1.c'をコンパイルするのはうまくいきません。 このファイルの中の関数群は、 算術オペレーションを実装することになっていますが、 これらの演算をターゲット・マシン用にオープン・コードする(open code)方法を、 GNU CCは知りません。 これらの関数群をGNU CC自身によってコンパイルすると、 無限再帰に陥ってしまいます。

どのターゲットにおいても、 これらの関数群のほとんどは必要ではありません。 GNU CCは、 ある算術演算をオープン・コードする(open code)ことができる場合、 その演算を実行するためにこれらの関数群を呼び出すことはしません。 使っているターゲット・マシンにおいて、 これらの関数群がまったく必要ではないということもありえます。 その場合は、 空のライブラリを`libgcc1.a'として提供することもできます。

多くのターゲットは、 乗算と除算についてのみライブラリのサポートを必要とします。 乗算と除算の関数を含むライブラリとリンクしているのであれば、 マクロMULSI3_LIBCALLとそれに類するものを定義することによって、 これを直接呼び出すようGNU CCに指示することができます。 これらのマクロは、 ターゲット記述マクロ・ファイルに定義されている必要があります。 ターゲットによっては、 それはあらかじめ定義されています。 libgcc1.aが必要とされないようにするにはこれだけでも十分かもしれません。 そうであれば、 空のライブラリを供給することができます。

ターゲットによっては、 浮動小数命令を持たないものもあります。 このようなターゲットは、 `libgcc1.a'の中の別の関数群を必要とします。 浮動小数演算を行なう関数群です。 GNU CCの最近のバージョンには、 浮動小数をエミュレートするファイルが含まれています。 ある程度作業をすれば、 `libgcc1.a'として使うことのできる浮動小数エミュレータが作れるはずです。 おそらく将来のバージョンには、 これを自動的かつ便利に行なうコードが含まれるでしょう。 これは、 そのようなコードを実装したい人の有無にかかっています。

組み込みシステムによっては、 Cまたはアセンブラで記述された、 すべての必要な`libgcc1.a'ルーチンが付属しているものもあります。 これらのターゲットは自動的に`libgcc1.a'をビルドするので、 このファイルのために特別なことをする必要はまったくありません。 他の組み込みシステムには、 必要なすべての演算がハードウェアによってサポートされているので、 `libgcc1.a'のルーチンがまったく必要ないものもあります。

使っているターゲット・システムに別のCコンパイラがあれば、 そのマシンのネイティブ・コンパイラとしてGNU CCを構成(configureを実行)し、 そのマシン上で`make libgcc1.a'を実行することによって`libgcc1.a'だけをビルドして、 結果として生成されたファイルをクロス・コンパイラとともに使うことができます。 このようにするには、 ターゲット・マシン上において以下のとおり実行します。

cd target-build-dir
./configure --host=sparc --target=sun3
make libgcc1.a

次に、 ホスト・マシン上において以下を実行します。

ftp target-machine
binary
cd target-build-dir
get libgcc1.a
quit

`libgcc1.a'の中に必要となる関数群を提供するまた別の方法として、 これらの関数群に対して適切なperform_...マクロを定義するという方法があります。 これらの定義が、 それら関数群が本来実装するべきCの算術演算を使わないかぎり、 ビルドしたクロス・コンパイラを使ってコンパイルすることができるはずです。 (ターゲット・ファイルにおいてこれらの定義が既に存在するのであれば、 準備万端ととのっています。)

performマクロを使って`libgcc1.a'をビルドするためには、 コンパイラをビルドする際に`LIBGCC1=libgcc1.a OLDCC=./xgcc'を使います。 さもなければ、 makeを実行する前に、 クロス・コンパイラをビルドするディレクトリの中に、 `libgcc1.a'という名前の代替ライブラリを置かなければなりません。

クロス・コンパイラとヘッダ・ファイル

スタンドアロン・プログラムや組み込みシステム用のプログラムをクロス・コンパイルする場合は、 GNU CCの構成要素であるごく少数のヘッダ・ファイル (および、 ユーザ・プログラムのヘッダ・ファイル) を除いて、 ヘッダ・ファイルは必要ないかもしれません。 しかし、 `libc.a'のような標準Cライブラリをユーザ・プログラムとリンクするつもりであれば、 使用するライブラリに関連するヘッダ・ファイルを使ってコンパイルする必要がおそらくあるでしょう。

GNU Cコンパイラには、 これらのファイルは付属していません。 その理由は、 (1)これらのファイルはシステム固有であること、 (2)これらのファイルはCライブラリに属するものであり、 コンパイラに属するものではないこと、 の2点です。

GNU Cライブラリがターゲット・マシンをサポートしている場合は、 (プログラムをリンクする際に、 GNUライブラリを実際に使うものと想定すれば) そこからヘッダ・ファイルを入手することができます。

ターゲット・マシンにCコンパイラが付属していれば、 おそらく適切なヘッダ・ファイルもまた付属しているでしょう。 これらのファイルをホスト・マシンからアクセスできるようにすれば、 クロス・コンパイラもそれを使うことができます。

上記以外の場合は、 クロス・コンパイルを行なう際に使うヘッダ・ファイルを、 独力で見つけなければなりません。

適切なヘッダ・ファイルが見つかれば、 クロス・コンパイラをビルドする前に、 それらをディレクトリ`/usr/local/target/include'に置きます。 この後、 インストールの過程においてfixincludesが正しく実行され、 コンパイラが使う場所に、 修正済みのヘッダ・ファイルがインストールされます。

クロス・コンパイラをビルドする前にヘッダ・ファイルを提供します。 これは、 ビルドの段階において、 `libgcc.a'の一部を作成するために、 実際にクロス・コンパイラが実行されるからです。 (これは、 GNU CCによってコンパイルすることが可能な部分です。) この中には、 適切なヘッダ・ファイルを必要とするものがあります。

以下は、 ターゲット・マシンからヘッダ・ファイルをコピーする方法を示す例です。 ターゲット・マシンでは以下を実行します。

(cd /usr/include; tar cf - .) > tarfile

次に、 ホスト・マシンにおいて、 以下を実行します。

ftp target-machine
lcd /usr/local/target/include
get tarfile
quit
tar xf tarfile

クロス・コンパイラの実際のビルド

ここまでくれば、 単一マシン上のコンパイラをコンパイルするのとまったく同様に、 ステージ1をビルドするステップを実行することができます。 何らかの`libgcc1.a'を提供していないのであれば、 そのファイルが必要となるところでコンパイルは中断し、 適切なエラー・メッセージが表示されます。 `libgcc1.a'を提供すれば、 コンパイラのビルドの過程で、 自動的に`libgcc1-test'という名前のテスト・プログラムがコンパイルされ、 リンクされます。 リンクにおいてエラーが出るようであれば、 `libgcc1.a'の中に必要とされるすべてのルーチンが利用できるようになっていないということを意味しています。

ヘッダ・ファイル`float.h'を提供しなければなりません。 そうするための1つの方法は、 `enquire'をコンパイルして、 ターゲット・マシン上でそれを実行することです。 `enquire'の仕事は、 ターゲット・マシン上で動作して、 実験によって、 ターゲット・マシンの浮動小数表現の性質を理解することです。 `enquire'は、 発見したことをヘッダ・ファイル`float.h'に記録します。 ターゲット・マシン上において`enquire'を実行することによって このファイルを作成することができないのであれば、 何か別の方法によって適切な`float.h'を作り出す必要があります (あるいは、 プログラムの中で`float.h'を使うことを避けるという手もあります)。

クロス・コンパイラのステージ2をビルドすることを試みないでください。 クロス・コンパイラを使って、 GNU CCをクロス・コンパイラとして再ビルドしてもうまくいきません。 これでは、 ホスト・マシンではなく、 ターゲット・マシン上で動作するプログラムが作成されてしまいます。 例えば、 386上で68030のコードを生成するクロス・コンパイラを、 それ自身を使ってコンパイルすると、 結果として生成されるものは、 (68030コードにコンパイルされたのですから) 386用としては適切ではなく、 (386をホストとして構成されたのですから) 68030用としても適切ではありません。 GNU CCを68030コードにコンパイルしたいのであれば、 68030上でコンパイルするにせよ、 386上でクロス・コンパイラを使ってコンパイルするにせよ、 構成(configureを実行)する際には、 68030をホストとして指定しなければなりません。

クロス・コンパイラをインストールするには、 通常どおり、 `make install'を実行します。

SunへのGNU CCのインストール

Solarisでは、 GNU CCをビルドするのに、 `/usr/ucb'にあるリンカやその他のツールを使わないでください。 /usr/ccs/binのほうを使ってください。

ブートストラップの際にアセンブラが`Error: misaligned data'を報告するようであれば、 おそらく古くなってしまったバージョンのGNUアセンブラを使っているのでしょう。 GNU binutilsの最新版にアップグレードするか、 または、 Solarisのアセンブラを使ってください。

`libgcc.a'をコンパイルするときには、 環境変数FLOAT_OPTIONがセットされていないことを確認してください。 `libgcc.a'のコンパイル時にこのオプションがf68881にセットされていると、 結果として生成されるコードは特殊なスタートアップ・ファイルとリンクすることを要求され、 正しくリンクするためには特別な苦労が必要になるでしょう。

Sunのライブラリのいくつかのバージョンには、 allocaにバグがあります。 このバグを回避するには、 GNU CCによってコンパイルされたGNU CCバイナリをインストールしてください。 これは、 allocaを組み込み関数として使います。 ライブラリの中の関数を使うことはありません。

Sunコンパイラのいくつかのバージョンは、 GNU CCをコンパイルする際にクラッシュします。 問題になるのは、 cppにおけるセグメンテーション・フォルトです。 この問題の原因は、 環境変数に大量のデータが存在することにあるように思われます。 Sun CCを使ってGNU CCをコンパイルするのに以下のコマンドを使うことによって、 この問題を回避することができるかもしれません。

make CC="TERMCAP=x OBJS=x LIBFUNCS=x STAGESTUFF=x cc"

SunOS 4.1.3と4.1.3_U1には、 GNU CCをコンパイルする際に断続的なコア・ダンプを引き起こすバグがあります。 共通する現象は、 再度コンパイラを実行しても再現しないコンパイラの内部エラーです。 この問題を修正するには、 Sunの推奨パッチ100726(SunOS 4.1.3の場合)、 あるいは、 101508(SunOS 4.1.3_U1の場合)をインストールするか、 より新しいSunOSリリースにアップグレードしてください。

VMSへのGNU CCのインストール

GNU CCのVMSバージョンは、 ソース・コードとコンパイル済みのバイナリを含む バックアップ・セーブセット(backup saveset)に入れて配布されています。

VMS Cコンパイラを使うのと同様の方法で簡単にコンパイラが使えるように`gcc'コマンドをインストールするには、 以下のようにして、 GNU CC用のVMS CLDファイルをインストールしなければなりません。

  1. VMSの論理名`GNU_CC'`GNU_CC_INCLUDE'を、 それぞれ、 GNU CC実行可能ファイル (`gcc-cpp.exe'`gcc-cc1.exe'等) が置かれているディレクトリ、 Cインクルード・ファイルが置かれているディレクトリを指すよう定義します。 これは以下のコマンドに、 適切なディスク名とディレクトリ名を指定して行なわなければなりません。
    $ assign /system /translation=concealed -
      disk:[gcc.] gnu_cc
    $ assign /system /translation=concealed -
      disk:[gcc.include.] gnu_cc_include
    
    これらのコマンドは、 マシンが起動するたびに実行されるよう、 システムのスタートアップ・ファイルの中に置くこともできます。 これは、 そうしたければ、 `[GCC]'ディレクトリの中の`GCC_INSTALL.COM'スクリプトを使って実現することもできます。
  2. コマンドラインにおいて以下のように実行して、 `GCC'コマンドをインストールします。
    $ set command /table=sys$common:[syslib]dcltables -
      /output=sys$common:[syslib]dcltables gnu_cc:[000000]gcc
    $ install replace sys$common:[syslib]dcltables
    
  3. ヘルプ・ファイルをインストールするには、 以下を実行します。
    $ library/help sys$library:helplib.hlb gcc.hlp
    
    ここまでくれば、 `gcc /verbose file.c'のようなコマンドを実行することによって、 コンパイラを起動することができます。 これは、 UNIXにおいて`gcc -v -c file.c'というコマンドを実行するのと同等です。

GNU C++を使いたい場合は、 最初にGNU CCをインストールしなければなりません。 その後に、 以下の手順を実行します。

  1. VMSの論理名`GNU_GXX_INCLUDE'を、 プリプロセッサがC++ヘッダ・ファイルを探索するディレクトリを指すよう定義します。 これは以下のコマンドに、 適切なディスク名とディレクトリ名を指定することによって行なえます。
    $ assign /system /translation=concealed -
      disk:[gcc.gxx_include.] gnu_gxx_include
    
    C++ランタイム・ライブラリを使うのであれば、 そのインストール・プロシージャがヘッダ・ファイルをインストールするディレクトリがここです。
  2. ファイル`gcc-cc1plus.exe'を手に入れ、 `gcc-cc1.exe'が置かれているのと同じディレクトリに置きます。 GNU C++コンパイラは、 `gcc /plus /verbose file.cc'のようなコマンドを実行することによって起動することができます。 これは、 UNIXにおいて`g++ -v -c file.cc'というコマンドを実行するのと同等です。

私たちは、 対応関係のあるバイナリとソースをVMSディストリビューション・テープ上に収録するよう努力しています。 しかし、 常にアップデートする時間があるわけではないので、 ときにはバイナリのバージョンがソースよりも古いことがあります (バイナリのバージョン番号を知るには`/version'オプションを使います。 バイナリのバージョンが古いかどうかを知るには、 その結果をソース・ファイル`version.c'と比較します)。 この場合、 そのバイナリを使ってソースを再コンパイルするべきです。 再コンパイルしなければならない場合、 その手順は以下のとおりです。

  1. コマンド・プロシージャ`vmsconfig.com'を実行して、 ファイル `tm.h'`config.h'`aux-output.c'`md.' をセットアップし、 ファイル`tconfig.h'`hconfig.h'を作成します。 このプロシージャは、 `make-cc1.com'によって使われるいくつかのリンカ・オプション・ファイルと、 `make-l2.com'によって使われるデータ・ファイルも作成します。
    $ @vmsconfig.com
    
  2. 上で定義したとおり、 論理名とコマンド・テーブルをセットアップします。 さらに、 VMS論理名`GNU_BISON'を、 Bison実行ファイルが置かれているディレクトリを指すよう定義します。 これは以下のコマンドで行なわなければなりません。
    $ assign /system /translation=concealed -
      disk:[bison.] gnu_bison
    
    そうしたいのであれば、 `[BISON]'ディレクトリにある`INSTALL_BISON.COM'スクリプトを使うこともできます。
  3. コマンドラインから以下を実行することにより、 `BISON'コマンドをインストールします。
    $ set command /table=sys$common:[syslib]dcltables -
      /output=sys$common:[syslib]dcltables -
      gnu_bison:[000000]bison
    $ install replace sys$common:[syslib]dcltables
    
  4. 全体を再コンパイルするには、 `@make-gcc'を実行します。 (あるいは、 バッチ・キューにファイル`make-gcc.com'を入れます)。 GNU CCコンパイラだけでなくGNU C++コンパイラもビルドしたいのであれば、 最初に`make-gcc.com'を編集してから、 そのコメントの中に記載されている手順に従わなければなりません。
  5. GCCを使うためには、 GCCによってコンパイルされたコードがいくつかの仕事をこなすために呼び出す関数群のライブラリが必要となります。 これらの関数群は、 ファイル`libgcc2.c'に定義されています。 これをコンパイルするためには、 ライブラリ`libgcc2.olb'を生成するコマンド・プロシージャ `make-l2.com'を使わなければなりません。 `libgcc2.olb'は、 `libgcc2.c'が含まれていたのと同一のディストリビューションからビルドされたコンパイラを使って、 ビルドされなければなりません。 `make-gcc.com'は、 これらすべてのことを自動的に実行してくれます。 ライブラリをインストールするには、 以下のコマンドを使います。
    $ library gnu_cc:[000000]gcclib/delete=(new,eprintf)
    $ library gnu_cc:[000000]gcclib/delete=L_*
    $ library libgcc2/extract=*/output=libgcc2.obj
    $ library gnu_cc:[000000]gcclib libgcc2.obj
    
    最初のコマンドは単に、 異なるモジュール名を持つ`libgcc2'のモジュールによって置き換えられる、 古いモジュールを削除しているだけです。 モジュールneweprintfは、 実際には`gcclib.olb'の中に存在しないかもしれません。 VMSライブラリアン(librarian)が、 これらのモジュールが存在しないことを訴えてきたとしても、 単にそのメッセージを無視して次のコマンドに進んでください。 2番目のコマンドは、 古いバージョンのライブラリ`libgcc2.c'のモジュールを削除します。 システム上のコンパイラをアップデートしたときには常に、 上記のプロシージャによってライブラリもアップデートするべきです。
  6. GCCをビルドする際に、 ソース・ファイルが存在するディレクトリにはファイルを書き込まないようにしたいことがあるかもしれません。 その1つの例は、 ソース・ファイルが読み込みのみ可能なディスク上に存在する場合です。 このような場合には、 以下のDCLコマンドを (パス名を実際のものに置き換えて) 実行します。
    $ assign dua0:[gcc.build_dir.]/translation=concealed, -
             dua1:[gcc.source_dir.]/translation=concealed  gcc_build
    $ set default gcc_build:[000000]
    
    ここで、 ディレクトリ`dua1:[gcc.source_dir]'は、 ソース・コードが存在するディレクトリです。 また、 ディレクトリ`dua0:[gcc.build_dir]'は、 すべての生成されたオブジェクト・ファイルと実行可能ファイルを置くためのものです。 これを実行した後では、 上で説明したとおりGCCのビルドを進めることができます。 (`gcc_build'はルート化された(rooted)論理名であり、 したがって、 サーチ・リストの個々の要素の中のデバイス名は、 別のルート化された論理名ではなく、 実際の物理デバイス名でなければならないことを忘れないでください)。
  7. 以前のバージョンのGNU CCを使ってGNU CCをビルドしているのであれば、 最新バージョンのアセンブラを使っていることを確認しなければなりません。 特に、 GNU CCバージョン2は、 広域const変数を、 GNU CCバージョン1とは若干異なる方法で取り扱います。 また、 GASバージョン1.38.1には、 GCCバージョン2と組み合わせて使うのに必要なパッチが存在しません。 GAS 1.38.1を使うと、 extern const変数のread-onlyビットはセットされず、 リンカが、 これらの変数のpsect属性が一致しないことに関する警告メッセージを出力するでしょう。 これらの警告メッセージは迷惑なだけで、 無視しても安全です。 1.33よりも古いバージョンのGNU CCを使ってコンパイルをしているのであれば、 コンパイルするときには常に`/DEFINE=("inline=")'をオプションとして指定してください。 こうするためには、 `make-cc1.com'の中のすべてのgccコマンドを編集する必要があります。 (古いバージョンでは、 inlineのサポートに問題がありました。) 正しく動作する1.33以降のGNU CCが手に入れば、 このファイルを元に戻すことができます。
  8. VAX Cコンパイラを使ってGNU CCをビルドしたいのであれば、 CCCFLAGSLIBS の別の定義を選択するために、 `make-cccp.com'`make-cc1.com'の内部を若干変更する必要があります。 これらのファイルの中のコメントを参照してください。 さらに、 正しく動作する (GNU as、 あるいは、 GASとしても知られる) GNUアセンブラを手に入れなければなりません。 これは、 バイナリ・オブジェクト・モジュールを作成するための、 GNU CCのバックエンドとして使われますが、 GNU CCのソースの中には含まれていないからです。 GASはまた、 `gcclib'をビルドするために`libgcc2'をコンパイルするためにも必要です (上記参照)。 `make-l2.com'は、 `gnu_cc:[000000]gnu-as.exe'にGASが動作できる状態で存在することを期待しています。 VMS上でGNU CCを使うためには、 VMSドライバ・プログラム `gcc.exe'`gcc.com'`gcc.cld' が必要です。 これらは、 GNU CCのソースの中にはなく、 VMSバイナリ(`gcc-vms')とともに配布されています。 GASもまた`gcc-vms'に含まれており、 Bisonも同様です。 VAX Cを使ったGNU CCのビルドに成功したら、 GNU CCの再ビルドを行なうのに、 結果として生成されたコンパイラを使わなければなりません。 その前に、 `make-cccp.com'`make-cc1.com'の中の CCCFLAGSLIBS の定義を元に戻すことを忘れないでください。 2回目に生成されるコンパイラは、 他のコンパイラを使ったビルドの際には抑止されるべき多くの最適化を利用することができます。

以前のバージョンのGNU CCでは、 共用ライブラリ`VAXCRTL'とリンクされると、 生成されたコードが奇妙な結果をもたらすことがたまにありました。 現在のバージョンでは、 問題なく動作するはずです。

しかし、 現在のバージョンでも、 GNU CC自身は共用ライブラリ`VAXCRTL'とリンクされてはなりません。 `VAXCRTL'の中のqsortには (VMSのバージョンV4.6からV5.5まで存在することが知られている) バグがあり、 このためにコンパイラが正しく動作できません。

`make-cc1.com'`make-cccp.com'により生成される実行可能ファイルは、 `gcclib.olb'の中のqsortルーチンを利用するために、 オブジェクト・ライブラリ版の`VAXCRTL'を使います。 コンパイラの実行可能ファイルを共用イメージ版の`VAXCRTL'とリンクしたい場合は、 (マクロQSORT_WORKAROUNDを定義するために`vmsconfig.com'により生成される) ファイル`tm.h'を編集しなければなりません。

QSORT_WORKAROUNDは、 `gcclib.olb'が利用可能ではない場合の問題を回避するために、 VAX CによってGNU CCがコンパイルされるときには常に定義されています。

collect2

GNU CCは、 起動時にさまざまな初期化関数を呼び出すよう調整するために、 collect2という名前のユーティリティを、 ほとんどすべてのシステム上で使います。

プログラムcollect2は、 プログラムを一度リンクして、 リンカの出力ファイルの中から、 生成関数であることを示す特定の名前を持つシンボルを探し出すことによって機能します。 そのようなシンボルを見つけると、 それらのテーブルを含む新しい`.c'テンポラリ・ファイルを作成し、 それをコンパイルして、 そのファイルも含めて再度プログラムをリンクします。

生成関数の実際の呼び出しは、 __mainという名前のサブルーチンによって実行されます。 このサブルーチンは、 (GNU CCによってmainがコンパイルされたものとして) main本体の先頭において (自動的に) 呼び出されます。 __mainの呼び出しは、 Cのオブジェクト・コードとC++のオブジェクト・コードのリンクを可能にするために、 Cのコードをコンパイルしている場合であっても必要です。 (`-nostdlib'を指定すると、 __mainへの参照が未解決となります。 __mainが、 標準GCCライブラリの中で定義されているからです。 この参照を解決するためには、 コンパイラを起動するコマンドラインの末尾に`-lgcc'を入れます。)

プログラムcollect2ldと同様、 コンパイラの各パスのファイルがインストールされるディレクトリにインストールされます。 collect2本当のldを見つける必要があるときには、 以下のファイル名の使用が試みられます。

「コンパイラのサーチ・ディレクトリ」は、 gccがコンパイラの各パスのファイルを探すディレクトリすべてを意味しています。 この中には、 `-B'によって指定されたディレクトリが含まれます。

クロス・コンパイラは、 若干異なるものを探します。

collect2は、 collect2自身の起動に使われたファイル名によるldの呼び出しを回避します。 実際にcollect2は、 あるcollect2が、 サーチ・パスの中の別の場所にldという名前でインストールされた 別の (別のバージョンの) collect2を見つける場合に備えて、 そのような名前の一覧を記憶しています

collect2は、 上記のldの場合と同一のアルゴリズムを使って、 ユーティリティnmおよびstripを探します。

標準ヘッダ・ファイル・ディレクトリ

GCC_INCLUDE_DIRは、 ネイティブ・コンパイラ、 クロス・コンパイラのどちらにとっても同じことを意味します。 それは、 GNU CCが自分専用のインクルード・ファイルを置く場所であり、 また、 GNU CCが修正版のインクルード・ファイルを置く場所でもあります。 クロス・コンパイル用のGNU CCは、 `$(tooldir)/include'にあるヘッダ・ファイルに対して fixincludesを実行します。 (クロス・コンパイル用のヘッダ・ファイルを修正する必要があれば、 GNU CCをビルドする前にインストールしておかなければなりません。 クロス・コンパイル用のヘッダ・ファイルが、 ANSI CおよびGNU CCにとって既に適切なものであれば、 特別なことは何もする必要はありません。)

GPLUSPLUS_INCLUDE_DIRは、 ネイティブ・コンパイラ、 クロス・コンパイラのどちらにとっても同じことを意味します。 それは、 g++が最初にヘッダ・ファイルを探す場所です。 C++ライブラリは、 ターゲットに依存しないヘッダ・ファイルだけをこのディレクトリにインストールします。

LOCAL_INCLUDE_DIRは、 ネイティブ・コンパイラに対してのみ使われます。 それは通常は`/usr/local/include'です。 ユーザがヘッダ・ファイルを`/usr/local/include'にインストールできるよう、 GNU CCはこのディレクトリを探索します。

CROSS_INCLUDE_DIRは、 クロス・コンパイラに対してのみ使われます。 GNU CCは、 ここには何もインストールしません。

TOOL_INCLUDE_DIRは、 ネイティブ・コンパイラ、 クロス・コンパイラの両方に対して使われます。 それは、 他のパッケージが、 GNU CCの使うヘッダ・ファイルをインストールする場所です。 クロス・コンパイラにとっては、 これは`/usr/include'と同等です。 クロス・コンパイラをビルドする際に、 このディレクトリにあるヘッダ・ファイルはすべてfixincludesによって処理されます。


[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]