最近 Mac 上で darwin port を使ったパッケージ管理に嫌気を感じ、全部コンパイルしてインストールし始めてみた。今の Macbook は Core 2 なので、せっかくだから i386 と x86_64 両方の architecture に対応したライブラリを作ってみた。
作ってみたというよりは、実際過去に i386 でコンパイルした物があり、それにリンクしているライブラリが x86_64 をインストールしたことで動かなくなったので、やらざるをえなかったわけだけど。
例としてここでは openssl-0.9.8o をインストールしてみる。コンパイラは gcc-4.5.1 を使用。
openssl は configure の仕方が若干違うが、 target を強制的に選択させるようになっているため、個人的には好み。とりあえず tar を展開したら以下のように configure する。
$ CC=gcc ./Configure --prefix=/usr/local enable-all shared darwin64-x86_64-cc
このまま make と行きたい所だけど、 make をすると gcc に存在しない -arch オプションでエラーになる。
cc1: error: unrecognized command line option "-arch"
なので Makefile を少し書き換える。 CFLAG=... のラインを探して、 -arch x86_64 となっている所を -m64 にする。
CFLAG= -fPIC -fno-common -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -Ot-frame-pointer -DL_ENDIAN -DMD32_REG_T=int -Wall
そして make してインストール。
$ make; sudo make install
ここまでやると x86_64 のライブラリやその他実行ファイル、ヘッダーファイルが /usr/local にインストールされる。そして次に i386 用のコンパイル。
ここまでやったら x86_64 をビルドしたディレクトリをそのまま使っても良いけど、新しく tar を展開してクリーンな状態でやってもいいかも。そのままのディレクトリでやる場合は、 make distclean して、余分なファイルを削除する。
$ make distclean; rm libssl.* libcrypto.*
そして i386 用の configure を実行。
$ CC=gcc ./Configure --prefix=/usr/local enable-all shared darwin-i386-cc
先ほど同様 Makefile の -arch i386 を -m32 に変更して、 make 。ここでインストールをしてしまうと、先ほどのファイルが上書きされてしまうので、 make で止める。
make が成功した段階で x86_64 用ライブラリが /usr/local/lib に配置され、 i386 用がビルドディレクトリに配置されている。
最後にこの二つの shared lib を lipo コマンドでコンバインする。
$ lipo -create -arch i386 libssl.0.9.8.dylib -arch x86_64 /usr/local/lib/libssl.0.9.8.dylib -output libssl.0.9.8.dylib.fat $ lipo -create -arch i386 libcrypto.0.9.8.dylib -arch x86_64 /usr/local/lib/libcrypto.0.9.8.dylib -output libcrypto.0.9.8.dylib.fat
念のため、出来上がったファイルをコピーする前に確認しておく。
$ lipo -info libssl.0.9.8.dylib Architectures in the fat file: libssl.0.9.8.dylib are: i386 x86_64
正常にできあがってる。そしたら出来上がったファイルを /usr/local/lib に配置して完了。
$ sudo cp libcrypto.0.9.8.dylib.fat /usr/local/lib/libcrypto.0.9.8.dylib sudo cp libssl.0.9.8.dylib.fat /usr/loca/lib/libssl.0.9.8.dylib