homebrewでuniversal binaryなImageMagickをビルド
勢いでパッケージ管理をMacPortからhomebrewに切り替えて予想通りつまづいたのでメモ。
環境
後先考えずにMacPortをアンインストールして、homebrewをインストール。
開発環境を整えようとImageMagickを入れる。
[massat@massat-mbp.local ~]$ brew install imagemagick [massat@massat-mbp.local ~]$ sudo MACOSX_DEPLOYMENT_TARGET=10.6 CFLAGS="-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp" CCFLAGS="-arch i386 -arch x86_64 -g -Os -pipe" CXXFLAGS="-arch i386 -arch x86_64 -g -Os -pipe" LDFLAGS="-arch i386 -arch x86_64 -bind_at_load" /Applications/MAMP/bin/php5/bin/pecl install imagick
[massat@massat-mbp.local ~]$ /Applications/MAMP/bin/php5/bin/php -i dyld: lazy symbol binding failed: Symbol not found: _MagickWandGenesis Referenced from: /Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20060613/imagick.so Expected in: flat namespace dyld: Symbol not found: _MagickWandGenesis Referenced from: /Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20060613/imagick.so Expected in: flat namespace Trace/BPT trap
以前も書いたとおり、
MAMPに載ってるPHPは64bit環境用にビルドされていない。
[massat@massat-mbp.local ~]$ file /Applications/MAMP/bin/php5/bin/php /Applications/MAMP/bin/php5/bin/php: Mach-O universal binary with 2 architectures /Applications/MAMP/bin/php5/bin/php (for architecture ppc): Mach-O executable ppc /Applications/MAMP/bin/php5/bin/php (for architecture i386): Mach-O executable i386
これに対してhomebrewでインスコしたImageMagickは64bit環境向けにビルドされる。
[massat@massat-mbp.local ~]$ file /usr/local/Cellar/imagemagick/6.6.7-1/bin/convert /usr/local/Cellar/imagemagick/6.6.7-1/bin/convert: Mach-O 64-bit executable x86_64
ので、homebrewでuniversal binaryなImageMagickをビルドしたい。
ググって出てきた記事では、
For your own personal usage you can try to get a universal binary by calling: ENV.universal in that formula's install function.
って言ってるが、自分の環境ではこれは動かなかった。
homebrewのソースを確認してみると、
[massat@massat-mbp.local ~]$ vim /usr/local/Library/Homebrew/extend/ENV.rb
ENV.universal_binary があった。
# i386 and x86_64 only, no PPC def universal_binary append_to_cflags '-arch i386 -arch x86_64' self.O3 if self['CFLAGS'].include? '-O4' # O4 seems to cause the build to fail append 'LDFLAGS', '-arch i386 -arch x86_64' # Can't mix "-march" for a 32-bit CPU with "-arch x86_64" remove_from_cflags(/-march=\S*/) if Hardware.is_32_bit? end
ので、手元のformulaを修正して、
[massat@massat-mbp.local ~]$ cp /usr/local/Library/Formula/imagemagick.rb /usr/local/Library/Formula/imagemagick.rb.org [massat@massat-mbp.local ~]$ brew edit imagemagick
"ENV.universal_binary"を追加。
[massat@massat-mbp.local ~]$ diff -u /usr/local/Library/Formula/imagemagick.rb.org /usr/local/Library/Formula/imagemagick.rb --- /usr/local/Library/Formula/imagemagick.rb.org 2011-02-05 17:02:46.000000000 +0900 +++ /usr/local/Library/Formula/imagemagick.rb 2011-02-05 17:03:07.000000000 +0900 @@ -75,6 +75,7 @@ def install ENV.x11 # Add to PATH for freetype-config on Snow Leopard ENV.O3 # takes forever otherwise + ENV.universal_binary args = [ "--disable-osx-universal-binary", "--without-perl", # I couldn't make this compile
んで、再度ビルドする。
[massat@massat-mbp.local ~]$ sudo pecl uninstall imagick [massat@massat-mbp.local ~]$ brew uninstall imagemagick [massat@massat-mbp.local ~]$ brew install imagemagick [massat@massat-mbp.local ~]$ sudo MACOSX_DEPLOYMENT_TARGET=10.6 CFLAGS="-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp" CCFLAGS="-arch i386 -arch x86_64 -g -Os -pipe" CXXFLAGS="-arch i386 -arch x86_64 -g -Os -pipe" LDFLAGS="-arch i386 -arch x86_64 -bind_at_load" /Applications/MAMP/bin/php5/bin/pecl install imagick
したら、動いたー。
[massat@massat-mbp.local ~]$ /Applications/MAMP/bin/php5/bin/php -i | grep imagick imagick imagick module => enabled imagick module version => 3.0.1 imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator imagick.locale_fix => 0 => 0 imagick.progress_monitor => 0 => 0
これ解決するのに3時間ほどかかってしまった・・・。