mattintosh note

どこかのエンジニアモドキの備忘録

Mac OS X に GCC 4.8 をインストール

Mac OS X 10.6 で GCC のセルフビルド。

ローカルで使うなら MacPorts の gcc47 とか gcc48 を使うのが簡単。というかそもそも 10.6 ではまだ GCC 4.2 があるのであまり使う機会はないかもしれない。

今回 GCC をビルドしようと思ったのは MacPortsGCC をインストールすると libstdc++6.dylib が別途インストールされ、システムに存在する /usr/lib/libstdc++.6.dylib と相性が悪かったから。


もう少し具体的に書くと RawTherapee を OpenMP 有りでビルドしようとすると GCC 4.5 以上が必要(というかそもそも auto_ptr.h が必要なわけで)で、ビルドそのものは出来るけど実行する際に GTK+ で使われている libclearlooks.so が /opt/local/lib/libstdc++.6.dylib の後に依存関係で /usr/lib/libstdc++.6.dylib を呼び出してしまい RawTherapee がクラッシュする。ld に /usr/lib/libstdc++.6.dylib を優先して渡したり、DYLD_LIBRARY_PATH による誘導で対応できるけど他の部分に影響が出ることがある。


m4、autoconf、automake、libtool、pkg-config などは最近のものをすでにインストール済みでの状態です。最近の GCC は依存関係を GCC のソースディレクトリに入れておくと勝手にビルドしてくれるみたいですが個別にビルドしています。

環境変数

ヘッダーとライブラリの検索パスのルートを変更していますが自分の環境だけで使用するのであればなくても大丈夫だと思います。コンパイラはビルドに失敗しないものを適当に選んで下さい。

# インストール先用の変数
prefix=/usr/local
triple=x86_64-apple-darwin$(uname -r)
configure_args="--prefix=$prefix --build=$triple"

# 環境変数
export MACOSX_DEPLOYMENT_TARGET=$(sw_vers -productVersion | cut -d. -f-2)
export SDKROOT=$(xcodebuild -version -sdk macosx$MACOSX_DEPLOYMENT_TARGET | sed -n '/^Path: /s///p')
export CC=$(xcrun -find gcc-4.2)
export CXX=$(xcrun -find g++-4.2)
export CFLAGS="-pipe -O3 -march=core2 -mtune=core2 -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET
export CXXFLAGS="$CFLAGS"
export CPPFLAGS="-isysroot $SDKROOT -I$prefix/include"
export LDFLAGS="-Wl,-syslibroot,$SDKROOT -L$prefix/lib"


MacBook Air の場合 unamei386 で、configure 時に i386-apple-darwin と認識されることがあるので --build=x86_64-apple-darwin としています。

GMP 5.1.1

--enable-cxx を必ず追加。

tar -xf gmp-5.1.1.tar.bz2
cd gmp-5.1.1
./configure --prefix=$prefix --enable-cxx ABI=64
make
make check
make install

GMP (Mercurial)

GMP のリポジトリは2つあり、gmp と gmp-5.1 があります。

hg clone http://gmplib.org:8000/gmp-5.1 gmp-5.1
cd gmp-5.1

そのままビルドしようとすると最後に version.texi が無いというエラーになるので .bootstrap を実行するか自分で作成します。version.texi の内容は .bootstrap にヒアドキュメントで記載されているのでそれを抜き出せばいいだけです。

# 自動生成
sh .bootstrap

# 手動生成
sed -n '/^@set/p' /usr/local/src/repos/gmp-5.1/.bootstrap > doc/version.texi

.bootstrap の実行だけでいいような気がしますが、うまくビルドできない場合は autoreconf するといいかもしれません。

autoreconf -i

これ以降は tarball 版と同じです。

MPFR 3.1.2

tar -xf mpfr-3.1.2.tar.bz2
cd mpfr-3.1.2
./configure $configure_args
make
make check
make install

MPC 1.0.1

tar -xf mpc-1.0.1.tar.gz
cd mpc-1.0.1
./configure $configure_args
make
make check
make install

ISL 0.11.2

tar -xf isl-0.11.2.tar.bz2
cd isl-0.11.2
./configure $configure_args
make
make check
make install

Cloog 0.18.0

tar xf cloog-0.18.0.tar.gz
cd cloog-0.18.0
./configure $configure_args
make
make check
make install

GCC 4.8 (Git)

  • --disable-multilib を忘れると無理矢理 i386 のビルドをしようとします。
  • PPL ありの場合は最近のものだとバージョンが合わないので --disable-ppl-version-check が必要かも。
  • ここではインストール先を /usr/local/gcc48、ファイル名を ***-4.8 にしています。
git clone git://gcc.gnu.org/git/gcc.git
cd gcc
git checkout -f gcc-4_8-branch
cd -
mkdir build
cd build
../gcc/configure \
    --prefix=$prefix/gcc48 \
    --build=$triple \
    --program-suffix=-4.8 \
    --enable-languages=c,c++,fortran,lto,objc,obj-c++,java \
    --enable-lto \
    --enable-libstdcxx-time \
    --disable-multilib \
    --disable-nls \
    --disable-bootstrap \
    --with-{gmp,mpfr,mpc,isl,cloog}=$prefix \
    --enable-cloog-backend=isl \
    --disable-{cloog,isl}-version-check
make
make install