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