lynxeyedの電音鍵盤

MBDとFPGAと車載で使うデバイスの備忘録

arm-elf-g++でC++がなぜかコンパイルできなかったからarm-elf-gcc-4.6.1を野良ビルド(Mac OS X 編)

ここに記した内容はSnow Leopardで試したものです。Lionでは動かなかったのでこちらでLionの時のarm-elf-gccの野良ビルドを試しましたので併せてご覧ください。
Mac OSXで動作するARMクロスコンパイラはMacPortsで簡単に

$ sudo port install arm-elf-gcc

で、gmp、mpfr、mpcもろともインストールしてくれる超便利君なんですけど何故か自分の環境ではC++が動かなかったので自前でビルドしました。
現状ではMacPortsのarm-elf-gccは4.6.0ですけど、4.6.1でコンパイル出来るのでなんか得した気分になれます(オントカヨ

「悪いが氏んでもらうぜ」
とりあえず、いまインストールされているarm-elf-gccをアンインストール

sudo port uninstall arm-elf-gcc

ここからインストール作業に入ります。google検索するとよくubuntuでのビルド方法が書いてありますが、OSXだと途中でビルド失敗して悲しい目に。(詳細後述)


【参考】
ほぼここのサイト様を参考にしています。感謝。
組み込みサイドターン::Blog-ARM用のGCC環境(arm-none-eabi-gcc + newlib )ビルド in Mac


【用意したもの】
Mac OSXではMacPortsがパッケージを提供してくれるので、なるべくそちらを使う方が無難です。
たとえば、mpc、mpfr、gmpといったパッケージはMacPortsに頼った方が作業が効率よく進みます。
他にtarボールで準備したもの

・gcc-4.6.1.tar.bz2
・newlib-1.19.0.bz2
・binutils-2.21.tar.bz2

作業フォルダはどこでも良いので、
~/ARMProj
(絶対パス→/User/[user_name]/ARMProj)
で行いました。
以下、「lynxeyed」って書いてあるフォルダは適宜、自分の好みのフォルダ名に書き換えた方が良いと思います。「hoge-20110723」みたいに日付入りでコンパイルすると見分けがつくので後々便利かも。


【作業】
mpfr mpc gmpについては別コンパイルするといろいろ設定が煩雑になるので、MacPortsが提供するパッケージを利用

$ sudo port install libmpc

これにより依存関係にある、mpfr,gmpは/opt/local/配下にインストールされる
これらをi686-apple-darwin10-gccが認識するように、PATHを通しておく
CFLAGS(gccへの引数)の"-O2"では、最適化レベル2を指定

$ export CFLAGS="-I/opt/local/include -O2"
$ export LDFLAGS="-L/opt/local/lib"

【binutilsの展開】

$ cd binutils-2.21
$ mkdir build
$ cd build
$ ../configure --target=arm-elf --prefix=/usr/local/lynxeyed/arm-elf --enable-multilib --with-gmp= --with-mpfr
$ make
$ sudo make install

【newlibの解凍】

$ tar xvf newlib-1.19.0.tar.bz2

【次にgccのコンパイルを行う】
newlibのシンボリックリンクを忘れずに貼ります。
貼らないと、30分くらいコンパイルしたあとに「ん?stdio.hないよ?」という、悲しすぎて笑ってしまうエラーメッセージが出て終了します。

$ cd ~/ARMProj/
$ tar xvf gcc-4.6.1.tar.bz2
$ cd gcc-4.6.1
$ ln -s ../newlib-1.19.0/newlib .
$ mkdir build
$ cd build
$ ../configure --target=arm-elf --prefix=/usr/local/lynxeyed/arm-elf --with-float=soft --disable-shared --with-newlib --enable-languages=c,c++ --enable-multilib --with-gmp --with-mpfr --disable-nls --with-mpc --with-system-zlib CFLAGS_FOR_TARGET="-Os -mthumb -msoft-float" 

$ make
$ sudo make install 

--disable-nlsを付けないと、警告が日本語で出力されてEclipse IDEを使うと(設定で回避できるようですが)正常コンパイルが出来ているのにエラー表示を出すのでこのようにした方が良いと思います。
ついでに.bash_profileにPATHを通しておく

export PATH=/usr/local/lynxeyed/arm-elf/bin:$PATH

Mac OSXで動くarm-elf-gcc-4.6.1が完成

とりあえず、コンパイル後の儀式を(笑

$ arm-elf-gcc -v
 組み込み spec を使用しています。
 COLLECT_GCC=arm-elf-gcc
 COLLECT_LTO_WRAPPER=/usr/local/lynxeyed/arm-elf/libexec/gcc/arm-elf/4.6.1/lto-wrapper
 ターゲット: arm-elf
 configure 設定: ../configure --target=arm-elf --prefix=/usr/local/lynxeyed/arm-elf --with-float=soft --disable-shared --with-newlib --enable- languages=c,c++ --enable-multilib --with-gmp --with-mpfr --with-mpc --with-system-zlib 'CFLAGS_FOR_TARGET=-Os -mthumb -msoft-float'
 スレッドモデル: single
 gcc バージョン 4.6.1 (GCC) 

(この後、C++の動作も確認しました)
C++向けのMakefileは後ほど。
ちょっとだけ、mbed風クラスを載せてます。
とりあえず、I2S+DMA LLIの確認中です。