macOSでのクロスコンパイラのビルド方法

macOSでのクロスコンパイラのビルド方法について書いていく。

gcc

この記事の執筆時点での最新バージョンのgcc9.1.0をビルドするが,よほど古くない限りは同じ方法でできるはずだ。

gcc-9.1.0のダウンロードと解凍:

$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-9.1.0/gcc-9.1.0.tar.gz
$ tar -zxvf gcc-9.1.0.tar.gz && rm -f gcc-9.1.0.tar.gz

そして,gcc-buildディレクトリを作ってconfigureする。ここで,Homebrewでbinutilsをインストールしている場合,ビルドに失敗することがあるため,brew unlink binutilsを実行する。それでもまだ失敗する場合は一時的にbrew uninstall binutilsでアンインストールして,rm -rf ./*gcc-build以下の全てのファイルを削除する(削除しないと,再configureに失敗する)。

$ mkdir gcc-build
$ cd gcc-build

gccのビルドに必要なgmp, mpfr, mpcはいずれもbrew installでインストールできるため,ない場合はインストールする。 gmp, mpfr, mpcのあるディレクトリのPathをbrew --prefix パッケージ名で表示し,そのPathをconfigure時に-with-パッケージ名="ディレクトリのPath"で引数として渡す。

configure:

$ ../gcc-9.1.0/configure --prefix=インストール先 --target="ターゲット名(例: x86_64-elf)" --with-gmp="gmpのPath" --with-mpfr="mpfrのPath" --with-mpc="mpcのPath" AR="/usr/bin/ar" RANLIB="/usr/bin/ranlib"

AR="/usr/bin/ar" RANLIB="/usr/bin/ranlib"の部分は,Homebrewでインストールされたbinutilsが影響を及ぼしている可能性があるため,/usr/bin以下のarとranlibを指定している。

そして,ビルド&インストールを実行する。

このとき,make all-gccに引数として,-jと,その後ろにCPUのコア数を渡すと,CPUに応じてビルドが最適化される。

$ make all-gcc
$ make install-gcc

binutils

binutilsも執筆時点での最新バージョンのbinutils2.32をビルドする。

binutils-2.32のダウンロードと解凍:

$ wget http://ftp.jaist.ac.jp/pub/GNU/binutils/binutils-2.32.tar.gz
$ tar -zxvf binutils-2.32.tar.gz && rm -f binutils-2.32.tar.gz

gccのビルドと同じように,binutils-buildディレクトリを作って,そこでビルドを行う。

$ mkdir binutils-build
$ cd binutils-build

そして,configureを行う。

$ ../binutils-2.32/configure --prefix="インストール先" --target="ターゲット名(例: x86_64-elf)"

ビルドは,gccとは違い,all-binutilsなどつけなくて良い。binutilsのビルドも,make -jコア数でCPUに対して最適化できる。

$ make
$ make install