フリーSolarisでここまでやれる!

山森丈範 YAMAMORI Takenori ●yamamori

gcc をクロスコンパイル


さて1大イベント gcc のインストールです.cc が付いていない Solaris 7 では,大抵の人はまずどこかから gcc バイナリを ftp したりするのでしょうが,筆者は SunOS 4.1.4 からクロスコンパイラでソースから make しました.
○GNU configure 系のディレクトリ構成

GNU のソースを make する時,ソースを展開後,普通に ./configure としてもいいのですが,同じソースに対して異なる configure や異なるプラットフォームで make を繰り返すため,ソースは,リードオンリーにし, 隣に作業ディレクトリを作って,セパレートソースで configure するようにします.

●configure方式のディレクトリ構成
configure

○環境変数設定

筆者は常に環境変数を,

    CC=gcc
    CFLAGS='-O2 -pipe -s'
    LDFLAGS=-s

と設定しています.こうすることにより, configuremake 時に,自動的に gcc や最適化オプションが設定されます.

○クロスアセンブラなどの作成

SunOS 4.1.4 上で,binutils-2.9.1 を,

    configure --target=sparc-sun-solaris2.7

として configure し,make し,インストールします.できたバイナリは,

    /usr/local/sparc-sun-solaris2.7/bin

以下,および,/usr/local/bin 以下には

    sparc-sun-solaris2.7-as

のようなコマンド名でインストールされます.

○Solaris 7 の include と lib の準備

SunOS 4.1.4上で,

    # cd /usr/local/sparc-sun-solaris2.7
    # mv lib lib-0
    # ln -s /diskless/solaris2.7/root/client/usr/lib .
    # ln -s /diskless/solaris2.7/root/client/usr/include .

として,Solaris 7 の include と lib が見えるようにします.

○クロスコンパイラの作成

SunOS 4.1.4 上には,同バージョンの gcc-2.8.1 がすでにインストールされているものとします.

SunOS 4.1.4 上で,gcc-2.8.1 を,

    configure --target=sparc-sun-solaris2.7

として configure します.Solaris 2.6 以前の場合,ここで,/usr/ccs/lib/values-Xa.o をカレントディレクトリにコピーする必要がありましたが, Solaris 7 では,values-Xa.o/usr/lib に存在するようになったため,その必要はありません.

それではクロスコンパイラを以下のスクリプトで make しましょう.
#!/bin/sh -x
(
  date
  time make -j3 LANGUAGES=c \
    CC=gcc \
    CFLAGS='-O2 -pipe -s' \
    LIBGCC1_TEST=''
  date
) 2>&1 | tee -a stage1-log
ちなみに,SPARCstation 2 で約1時間かかります.

make できたらインストールします.

    # make LANGUAGES=c install

ここで,LANGUAGES=c を付け忘れると g++ などの make が始まってしまうので注意して下さい.

○クロスコンパイラのテスト

    sunos4$ sparc-sun-solaris2.7-gcc -v -O2 -pipe -s hello.c -o hello
    solaris7$ ./hello
    Hello!!

上記のようにテストしてみて下さい.

○ネイティブコンパイラの作成

クロスコンパイラを使って Solaris7 ネイティブコンパイラを作成します.SunOS 4.1.4 上で,

  configure \
      --build=sparc-sun-sunos4.1.4 \
      --host=sparc-sun-solaris2.7

configure します.

make のためのスクリプトは,
#!/bin/sh -x
(
  date
  time make -j3 LANGUAGES=c \
    CC=sparc-sun-solaris2.7-gcc \
    CFLAGS='-O2 -pipe -s' \
    LIBGCC1_TEST='' \
    GCC_FOR_TARGET=sparc-sun-solaris2.7-gcc \
    build=sparc-sun-sunos4.1.4 \
    host=sparc-sun-solaris2.7
  date
) 2>&1 | tee -a stage1-log
です.CC としてクロスコンパイラを指定し,さらに GCC_FOR_TARGET も指定するのがポイントです.

また,configure の不具合か,make 時に Makefile 中の変数の buildhost を再度指定してやらない といけないようなので指定しています.

これで,Solaris 7 ネイティブコンパイラができました.これを,Solaris 7 上で,一旦インストールします.まだ Solaris 7 上では GNU make が出来ていないので,/usr/ccs/bin/make を使うことになるでしょう.

なお,ここで単に make installとやると,

    You have to install gcc on your target machine by hand. 

と表示されて何もせずに終ってしまうので,

    # /usr/ccs/bin/make \
     LANGUAGES=c INSTALL='/usr/ucb/install -c' \
     AR=/usr/ccs/bin/ar install-normal

とします.

○gcc の make を繰り返す・・

このあと,今出来た gcc をベースにして,Solaris 7 上でもう一度,今度は普通に gcc を make します.そして,この gcc を再度インストールします.

筆者の場合は,このあとさらに binutils-2.9.1 を make し,それを使ってまた gcc を make しなおし,それを使って binutils を make しなおすというところまでやりました.最後には,gcc の make を stage3 まで行ない,stage2 と stage3 のバイナリが完全に一致することを確認しました.これで, Solaris 7 の gcc-2.8.1+binutils-2.9.1 のインストールが完了となります.

■参考■ Solaris 2.5.1 で gcc-2.7.2.1 をクロスコンパイル


To 『フリー Solaris でここまでやれる!』index


このページは、技術評論社 SoftwareDesign 1999年2月号、『フリーSolarisでここまでやれる!』の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 Home
yamamori