Ninjaをユニバーサルバイナリにする

ようはlipoの使い方を覚えたのでメモっておくわけです。
普段GCC-arch i386 -arch x86_64を与えればユニバーサルバイナリを生成してくれますが、GCCの一部オプション使用時には複数の-archを与えるとエラーになります。Ninjaのビルドでは-MMDなどを付けるためこの制限にひっかかります:

g++-4.2: -E, -S, -save-temps and -M options are not allowed with multiple -arch flags

そこで、-arch i386-arch x86_64でそれぞれバイナリを作り、lipoというコマンドで一つにすることでユニバーサルバイナリを作れます。以下自分のMac OS Xでのビルドの仕方。Homebrewを$HOME/local以下にインストールしているため、環境変数経由でそのことを伝えています:

% env CFLAGS="-arch i386 -I$HOME/local/include" LDFLAGS="-arch i386 -L$HOME/local/lib" ./bootstrap.sh
(中略)
% mv ninja{,-i386}
% env CFLAGS="-arch x86_64 -I$HOME/local/include" LDFLAGS="-arch x86_64 -L$HOME/local/lib" ./bootstrap.sh
(中略)
% mv ninja{,-x86_64}
% lipo -create -output ninja ninja-{i386,x86_64}
% file ninja
ninja: Mach-O universal binary with 2 architectures
ninja (for architecture i386):	Mach-O executable i386
ninja (for architecture x86_64):	Mach-O 64-bit executable x86_64