2013年6月9日日曜日

ARM用クロスコンパイラのビルド(Windows8+Cygwin)

更新版はコチラへ

ARM用のGCCをWindows8上でビルドしてみたので備忘録として。

Cygwinのインストール

setup.exeをダウンロードしてきて実行。
ドライブ直下が吉ですのでディフォルトのままで。
適当なフォルダを指定
通常のブロードバンド環境ならディフォルトでOK
わざわざ海外サーバを選ぶ必要はないでしょ。
Devel以下を一括でインストールしてしまいます。 GCCのビルドには不要なものもインストールされてしまいますが、何が必須なのか良く分からないもので・・・

あとは「次へ」だけで無事にインストール完了

◆関連ソースを入手

GCCコンパイラ
binutils(アセンブラやリンカーなど)
Newlib(組み込み向け標準ライブラリ)

GCC4.5以降は以下の演算ライブラリが必要らしいので入手。
任意精度計算ライブラリ(GMP)
複素数演算ライブラリ(MPC)

今回入手したファイル(バージョン)は以下の通りです。

ダウンロードしたソースを展開します。(何処へ展開するかはご自由に)
$ mkdir -p /usr/local/src/gnu
$ cd /usr/local/src/gnu
$ tar zxvf ~/Download/gcc-4.7.3.tar.gz
 :
$ tar vxvf ~/Download/gmp-5.1.2.tar.bz2

◆ビルド

$export LANG=C この定義が無いとエラーが発生しました。
$export TARGET=arm-eabi
$export PREFIX=/usr/local/gnu

①binutilsのビルド
$ mkdir -p ~/tools/build-binutils-2.23.2
$ cd ~/tools/build-binutils-2.23.2
$ /usr/local/src/gnu/build-binutils-2.23.2/configure --target=$TARGET --prefix=$PREFIX --enable-interwork --enable-multilib
$ make all
$ make install

②インストールしたbinutilsへのパスを通します。
$ export PATH=/usr/local/gnu/bin:$PATH

③GMPのビルド
$ mkdir -p ~/tools/gmp-5.1.2
$ cd ~/tools/gmp-5.1.2
$ /usr/local/src/gnu/gmp-5.1.2/configure --prefix=$PREFIX
$ make all
$ make install

④MPFRのビルド
$ mkdir -p ~/tools/mpfr-3.1.2
$ cd ~/tools/mpfr-3.1.2
$ /usr/local/src/gnu/mpfr-3.1.2/configure --prefix=$PREFIX --with-gmp=$PREFIX
$ make all
$ make install

⑤MPCのビルド
$ mkdir -p ~/tools/mpc-1.0.1
$ cd ~/tools/mpc-1.0.1
$ /usr/local/src/gnu/mpc-1.0.1/configure --prefix=$PREFIX --with-gmp=$PREFIX --with-mpfr=$PREFIX --enable-static --disable-shared
$ make all
$ make install

⑥GCCのビルド1パス目(Newlibのビルドに必要)
$ mkdir -p ~/tools/gcc-4.7.3
$ cd ~/tools/gcc-4.7.3
$ /usr/local/src/gnu/gcc-4.7.3/configure --prefix=$PREFIX --target=$TARGET --enable-interwork --enable-multilib --enable-languages="c,c++" --with-newlib --with-headers=/usr/local/src/gnu/newlib-2.0.0/newlib/libc/include --with-gmp=/usr/local/gnu --with-mpfr=$PREFIX --with-mpc=$PREFIX
$ make all-gcc
$ make install-gcc

⑦Newlibのビルド
$ mkdir -p ~/tools/newlib-2.0.0
$ cd ~/tools/newlib-2.0.0
$ /usr/local/src/gnu/newlib-2.0.0/configure --target=$TARGET --prefix=$PREFIX --enable-interwork --enable-multilib
$ make all
$ make install

⑧GCCのビルド2パス目
$ cd ~/tools/gcc-4.7.3
$ make all
$ make install

Finish!
HelloWorld をコンパイルしてみた。

12 件のコメント:

  1. 「⑥GCCのビルド1パス目(Newlibのビルドに必要)」にて、
    $ cd /usr/local/src/gnu/gcc-4.7.3
    の後に、
    $ mkdir build
    などでサブディレクトを作ってその中でビルドする必要があります。
    $ cd build
    $ ../configure hoge hoge hoge
    $make all-gcc
    $make install-gcc

    v4.3以降は、ソースディレクトのトップ以外のディレクトリでビルドしないと以下のエラーになる仕様だそうです。
    ⑧の手順も同様です。

    エラー
    ---
    Makefile:make[2]: Entering directory `/usr/local/src/gnu/gcc-4.7.3/arm-eabi/libgcc'
    161: ../.././gcc/libgcc.mvars: No such file or directory
    make[2]: *** No rule to make target `../.././gcc/libgcc.mvars'. Stop.
    make[2]: Leaving directory `/usr/local/src/gnu/gcc-4.7.3/arm-eabi/libgcc'
    make[1Makefile:10055: recipe for target `all-target-libgcc' failed
    ]: *** [all-target-libgcc] Error 2
    make[1]: Leaving directory `/usr/local/src/gnu/gcc-4.7.3'
    makeMakefile:870: recipe for target `all' failed
    : *** [all] Error 2
    ---

    返信削除
    返信
    1. 匿名さん
      御免なさいm(--)m
      ビルド手順の記述を手抜きしていました。
      実際に行った手順に訂正しました。

      削除
  2. dygwin起動時に毎回一通りの設定をしなければコンパイルすることができません。設定を保存して起動してすぐコンパイルできる方法はありませんか?

    返信削除
    返信
    1. 環境変数設定を自動化してしまえばOKです。

      具体的には、export hogehogeをcygwinのホームディレクトリにある、.bashrcの中に記述して保存します。

      cygwinを再起動するか、$source ~/.bashrc を実行すると反映されます。

      削除
    2. 無知ですみません。.bashrcとは.bashrc_historyのことでしょうか。.bashrcというファイルがなくて困っています。

      削除
  3. .bashrcファイルが無い場合は、nanoやvimなどのテキストエディタで
    export hogehoge1
    export hogehoge2

    と列記したファイルを新規作成されればOKですよ!

    返信削除
  4. Cygwin Setup - Select Packages の Libs 内にある gmp, mpfr, mpc 関連パッケージ(devel も、ただし、doc は不要)入れたら、gmp, mpfr, mpc のビルドは不要だよ。
    探すの面倒だから、Search ボックス使えば良いさ。

    返信削除
  5. binutils-2.23.2がビルド出来ません。
    申し訳ありませんが、最新のcygwinで検証頂けると嬉しいです。

    返信削除
    返信
    1. 今度の休みにでも試してみますね。

      削除
  6. お返事ありがとうございます。
    Cygwinでクロスコンパイルは情報が少なくて…
    期待しています。

    返信削除
    返信
    1. 最新のCygwin2.1.0上で、binutils2.25、gcc5.2のクロスコンパイラをビルドしてみましたがエラー無く完了しました。
      本記事とほぼ同じ手順ですが、若干簡略化しましたので、近日中に具体的な手順をアップいたしますので参考にしてみてください。

      削除
    2. 記事をアップしましたのでご参考まで

      削除