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

が、予感通りMAMPPHPは動かない。

[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 binaryImageMagickをビルドしたい。
ググって出てきた記事では、

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時間ほどかかってしまった・・・。