at_yasu's blog

ロード的なことを

Mac OSX 10.6 SnowLeopard に PIL をインストールする。


はまったのでメモ。

GoogleAppEngine でPILがいると怒られたので、PILをインストールしました。ただ、MBA に XCode4 しか入ってない状態で、PILを入れようとすると下記のような感じでコケます。なお、Xcode3は入れたことありませんので、gcc4.0 は使えません。

環境

  • MacBookAir 2st 11inch
  • XCode4 Version: 4.0.2 Build: 4A2002a
  • gcc version 4.2.1 (Apple Inc. build 5666) (dot 3)
lipo: can't open input file: /var/tmp//ccn4osTA.out (No such file or directory)
error: command 'gcc-4.2' failed with exit status 1


ですので下記のように回避。そしてPILの都合により、_images.so は i386/x86_64のユニバーサルバイナリにする。

手順

  • libjpeg の i386を作成して/usr/localにインストール
  • libjpeg の x86_64を作成して /usr/local/x8664 にインストール
  • libjpeg の i386 と x86_64 のライブラリとコマンドを合体してユニバーサルバイナリを作成
  • freetype も同様にして、ユニバーサルバイナリを作成
  • PIL のインストール
  • Pythonのユニバーサルバイナリを、i386とx86_64のみにする

とりあえず、これでPILが使えるようになったはずです。。。あんま自身ないですけど。



libjpeg とか freetype をインストール。

  • libjpen version: 8c
  • freetype version:2.4.4
  • PIL version: 1.1.7


./configure を動かすときに、環境変数で無理やりi386系しかコンパイルしないようにする。一度にユニバーサルバイナリを作れないので、一つづつ作って後で合体。

libjpeg を作成

[yasui@yasui-MBA: ~/Downloads/jpeg-8c][17:35] $ bash
bash-3.2$ CC="gcc -arch i386" ./configure --prefix=/usr/local --enable-shared --enable-static
checking build system type... i386-apple-darwin10.7.0
checking host system type... i386-apple-darwin10.7.0
checking target system type... i386-apple-darwin10.7.0
checking for a BSD-compatible install... /usr/bin/install -c
..
bash-3.2$ make
make  all-am
  CC     jaricom.lo
..
bash-3.2$ sudo make install
test -z "/usr/local/lib" || ./install-sh -c -d "/usr/local/lib"
 /bin/sh ./libtool   --mode=install /usr/bin/install -c   libjpeg.la '/usr/local/lib'
..
bash-3.2$ exit

x86_64 を作成

[yasui@yasui-MBA: ~/Downloads/jpeg-8c][18:36] $ setenv CFLAGS '-arch x86_64'
[yasui@yasui-MBA: ~/Downloads/jpeg-8c][18:36] $ ./configure --prefix=/usr/local/x8664 --enable-shared --enable-static
checking build system type... i386-apple-darwin10.7.0
checking host system type... i386-apple-darwin10.7.0
checking target system type... i386-apple-darwin10.7.0
checking for a BSD-compatible install... /usr/bin/install -c
..
config.status: executing depfiles commands
config.status: executing libtool commands
[yasui@yasui-MBA: ~/Downloads/jpeg-8c][18:36] $ make
make  all-am
  CC     jaricom.lo
  CC     jcapimin.lo
..
[yasui@yasui-MBA: ~/Downloads/jpeg-8c][18:39] $ sudo make install
Password:
test -z "/usr/local/x8664/lib" || ./install-sh -c -d "/usr/local/x8664/lib"
 /bin/sh ./libtool   --mode=install /usr/bin/install -c   libjpeg.la '/usr/local/x8664/lib'
[yasui@yasui-MBA: /usr/local][18:52] $ cd /usr/local
[yasui@yasui-MBA: /usr/local][18:52] $ cd bin
[yasui@yasui-MBA: /usr/local/bin][18:52] $ sudo lipo -create cjpeg -arch x86_64 ../x8664/bin/cjpeg -output cjpeg.new
Password:
[yasui@yasui-MBA: /usr/local/bin][18:53] $ sudo lipo -create djpeg -arch x86_64 ../x8664/bin/djpeg -output djpeg.new
[yasui@yasui-MBA: /usr/local/bin][18:53] $ sudo lipo -create jpegtran -arch x86_64 ../x8664/bin/jpegtran -output jpegtran.new
[yasui@yasui-MBA: /usr/local/bin][18:53] $ sudo lipo -create rdjpgcom -arch x86_64 ../x8664/bin/rdjpgcom -output rdjpgcom.new
[yasui@yasui-MBA: /usr/local/bin][18:53] $ sudo lipo -create wrjpgcom -arch x86_64 ../x8664/bin/rdjpgcom -output wrjpgcom.new
[yasui@yasui-MBA: /usr/local/bin][18:54] $ sudo mv cjpeg.new cjpeg
[yasui@yasui-MBA: /usr/local/bin][18:54] $ sudo mv djpeg.new djpeg
[yasui@yasui-MBA: /usr/local/bin][18:54] $ sudo mv jpegtran.new jpegtran
[yasui@yasui-MBA: /usr/local/bin][18:54] $ sudo mv rdjpgcom.new rdjpgcom
[yasui@yasui-MBA: /usr/local/bin][18:54] $ sudo mv wrjpgcom.new wrjpgcom


ユニバーサルバイナリの作成

[yasui@yasui-MBA: ~/Downloads/jpeg-8c][18:39] $ cd /usr/local/lib
[yasui@yasui-MBA: /usr/local/lib][18:39] $ ls
./                   libfreetype.6.dylib* libfreetype.dylib@   libjpeg.8.dylib*     libjpeg.dylib@       pkgconfig/
../                  libfreetype.a        libfreetype.la*      libjpeg.a            libjpeg.la*
[yasui@yasui-MBA: /usr/local/lib][18:39] $ file libjpeg.a
libjpeg.a: current ar archive random library
[yasui@yasui-MBA: /usr/local/lib][18:39] $ file libjpeg.8.dylib 
libjpeg.8.dylib: Mach-O dynamically linked shared library i386
[yasui@yasui-MBA: /usr/local/lib][18:41] $ sudo lipo -create libjpeg.a -arch x86_64 ../x8664/lib/libjpeg.a -output libjpeg.new.a
[yasui@yasui-MBA: /usr/local/lib][18:41] $ sudo lipo libjpeg.8.dylib -create -arch x86_64 ../x8664/lib/libjpeg.8.dylib -output libjpeg.8.new.dylib
[yasui@yasui-MBA: /usr/local/lib][18:42] $ sudo mv libjpeg.8.new.dylib libjpeg.8.dylib 
[yasui@yasui-MBA: /usr/local/lib][18:42] $ sudo mv libjpeg.new.a libjpeg.a
[yasui@yasui-MBA: /usr/local/lib][18:42] $ ls
./                   libfreetype.6.dylib* libfreetype.dylib@   libjpeg.8.dylib*     libjpeg.dylib@       pkgconfig/
../                  libfreetype.a        libfreetype.la*      libjpeg.a            libjpeg.la*
[yasui@yasui-MBA: /usr/local/lib][18:42] $ 

Freetype の作成

i386版のみ。

[yasui@yasui-MBA: ~/Downloads/jpeg-8c][17:36] $ cd ..
[yasui@yasui-MBA: ~/Downloads][17:40] $ tar zxf freetype-2.4.4.tar.gz 
[yasui@yasui-MBA: ~/Downloads][17:40] $ cd freetype-2.4.4
[yasui@yasui-MBA: ~/Downloads/freetype-2.4.4][17:40] $ setenv CFLAGS '-arch i386'
[yasui@yasui-MBA: ~/Downloads/freetype-2.4.4][17:40] $ setenv CPPFLAGS '-arch i386'
[yasui@yasui-MBA: ~/Downloads/freetype-2.4.4][17:40] $ ./configure --prefix=/usr/local--enable-shared --enable-static

FreeType build system -- automatic system detection

The following settings are used:
..
[yasui@yasui-MBA: ~/Downloads/freetype-2.4.4][17:40] $ make
./builds/unix/libtool --mode=compile gcc -pedantic -ansi  -I/Users/yasui/Downloads/freetype-2.4.4/objs -I./builds/unix -I/Users/yasui/Downloads/freetype-2.4.4/include -c -Wall -arch i386 -DFT_CONFIG_OPTION_SYSTEM_ZLIB -DDARWIN_NO_CARBON -DFT_CONFIG_CONFIG_H="<ftconfig.h>" -DFT2_BUILD_LIBRARY -DFT_CONFIG_MODULES_H="<ftmodule.h>"  -o /Users/yasui/Downloads/freetype-2.4.4/objs/ftsystem.lo builds/unix/ftsystem.c
lib
..
[yasui@yasui-MBA: ~/Downloads/freetype-2.4.4][17:41] $ sudo make install
./builds/unix/mkinstalldirs /usr/local/lib                               \
                         /usr/local/lib/pkgconfig                     \
                         /usr/local/include/freetype2/freetype/config \
                         /usr/local/include/freetype2/freetype/cache  \
                         /usr/local/bin                               \
                         /usr/local/share/aclocal
[yasui@yasui-MBA: ~/Downloads/freetype-2.4.4][17:41] $ cd ../Imaging-1.1.7

x86_86版を作成

[yasui@yasui-MBA: ~/Downloads/freetype-2.4.4][18:56] $ setenv CPPFLAGS '-arch x86_64'
[yasui@yasui-MBA: ~/Downloads/freetype-2.4.4][18:58] $ setenv CFLAGS '-arch x86_64'
[yasui@yasui-MBA: ~/Downloads/freetype-2.4.4][18:58] $ ./configure --prefix=/usr/local/x8664 --enable-shared --enable-static

FreeType build system -- automatic system detection
..
[yasui@yasui-MBA: ~/Downloads/freetype-2.4.4][18:59] $ make
./builds/unix/libtool --mode=compile gcc -pedantic -ansi -arch x86_64 -I/Users/yasui/Downloads/freetype-2.4.4/objs -I./builds/unix -I/Users/yasui/Downloads/freetype-2.4.4/include -c -Wall -arch x86_64 -DFT_CONFIG_OPTION_SYSTEM_ZLIB -DDARWIN_NO_CARBON -DFT_CONFIG_CONFIG_H="<ftconfig.h>" -DFT2_BUILD_LIBRARY -DFT_CONFIG_MODULES_H="<ftmodule.h>"  -o /Users/yasui/Downloads/freetype-2.4.4/objs/ftsystem.lo builds/unix/ftsystem.c
..
[yasui@yasui-MBA: ~/Downloads/freetype-2.4.4][18:59] $ sudo make install
./builds/unix/mkinstalldirs /usr/local/x8664/lib                               \
                         /usr/local/x8664/lib/pkgconfig                     \
                         /usr/local/x8664/include/freetype2/freetype/config \
                         /usr/local/x8664/include/freetype2/freetype/cache  \
                         /usr/local/x8664/bin                               \
                         /usr/local/x8664/share/aclocal
..

FreeType のユニバーサルバイナリーを作成

[yasui@yasui-MBA: /usr/local][19:00] $ ls x8664/lib/
./                   ../                  libfreetype.6.dylib* libfreetype.a        libfreetype.dylib@   libfreetype.la*      pkgconfig/
[yasui@yasui-MBA: /usr/local][19:00] $ ls x8664/bin
./               ../              freetype-config*
[yasui@yasui-MBA: /usr/local][19:00] $ cd lib
[yasui@yasui-MBA: /usr/local/lib][19:02] $ sudo lipo -create libfreetype.6.dylib -arch x86_64 ../x8664/lib/libfreetype.6.dylib -output libfreetype.6.new.dylib
[yasui@yasui-MBA: /usr/local/lib][19:02] $ sudo lipo -create libfreetype.a -arch x86_64 ../x8664/lib/libfreetype.a -output libfreetype.new.a
[yasui@yasui-MBA: /usr/local/lib][19:03] $ sudo mv libfreetype.6.new.dylib libfreetype.6.dylib 
[yasui@yasui-MBA: /usr/local/lib][19:04] $ sudo mv libfreetype.new.a libfreetype.a
[yasui@yasui-MBA: /usr/local/lib][19:04] $ file libfreetype.6.dylib 
libfreetype.6.dylib: Mach-O universal binary with 2 architectures
libfreetype.6.dylib (for architecture i386):	Mach-O dynamically linked shared library i386
libfreetype.6.dylib (for architecture x86_64):	Mach-O 64-bit dynamically linked shared library x86_64

PIL をインストール

PILをインストールする。コンパイル時にCFLAGSとかでi386系しかコンパイルをさせる。これがないと、asコマンドがppcをサポートしてないのに、ppc系のコンパイルをしようとしてコケる。

[yasui@yasui-MBA: ~/Downloads/Imaging-1.1.7][17:44] $ sudo ARCHFLAGS='-arch i386 -arch x86_64' CFLAGS='-arch i386 -arch x86_64' python setup.py install
running install
running build
..
running install_egg_info
Writing /Library/Python/2.6/site-packages/PIL/PIL-1.1.7-py2.6.egg-info
creating /Library/Python/2.6/site-packages/PIL.pth
[yasui@yasui-MBA: ~/Downloads/Imaging-1.1.7][17:44] $ 

Python をいじくる

Pythonのユニバーサルバイナリを、i386とx86_64のみにする。

[yasui@yasui-MBA: /System/Library/Frameworks/Python.framework/Versions/2.6/bin][18:26] $ ls
./                2to3@             idle@             pydoc@            python@           python2.6*        pythonw@          smtpd.py@
../               2to32.6*          idle2.6*          pydoc2.6*         python-config@    python2.6-config* pythonw2.6*       smtpd2.6.py*
[yasui@yasui-MBA: /System/Library/Frameworks/Python.framework/Versions/2.6/bin][18:26] $ sudo lipo -remove ppc7400 python2.6 -output python2.6.intel
[yasui@yasui-MBA: /System/Library/Frameworks/Python.framework/Versions/2.6/bin][18:26] $ sudo cp python2.6 python2.6.original
[yasui@yasui-MBA: /System/Library/Frameworks/Python.framework/Versions/2.6/bin][18:27] $ sudo mv python2.6.intel python2.6
[yasui@yasui-MBA: /System/Library/Frameworks/Python.framework/Versions/2.6/bin][18:27] $ ls
./                  2to3@               idle@               pydoc@              python@             python2.6*          python2.6.original* pythonw2.6*         smtpd2.6.py*
../                 2to32.6*            idle2.6*            pydoc2.6*           python-config@      python2.6-config*   pythonw@            smtpd.py@
[yasui@yasui-MBA: /System/Library/Frameworks/Python.framework/Versions/2.6/bin][18:27] $ file python2.6
python2.6: Mach-O universal binary with 2 architectures
python2.6 (for architecture x86_64):	Mach-O 64-bit executable x86_64
python2.6 (for architecture i386):	Mach-O executable i386

最後にちょっとしたテスト

[yasui@yasui-MBA: ~/Downloads/Imaging-1.1.7][19:20] $ cd Scripts/
[yasui@yasui-MBA: ~/Downloads/Imaging-1.1.7/Scripts][19:20] $ ls
./              README          explode.py      painter.py      pildriver.py    pilfont.py      player.py       viewer.py
../             enhancer.py     gifmaker.py     pilconvert.py   pilfile.py      pilprint.py     thresholder.py
[yasui@yasui-MBA: ~/Downloads/Imaging-1.1.7/Scripts][19:23] $ python viewer.py /System/Library//CoreServices/loginwindow.app/Contents/Resources/loginwindow.png

上のコマンドを実行して、「i」の文字が表示されたらとりあえず動いてる証拠です。