Homebrew環境下で野良Pythonをビルドしても大丈夫か?

結論

 少し手を加える必要があったが問題ない。

レシピ

前準備

Readlineとロケール問題を回避したPythonをインストールする - 日々の御伽噺
Python2.6.4をreadlineと文字ロケール問題を回避してSnow Leopardに入れる - 日々の御伽噺


 基本的な考えとして、Macportsで入れていたライブラリがHomebrewで入れたライブラリに置き換わると考えてもらえばOK。

readlineを入れる
brew install readline
brew link readline

 これだけ。ちなみにreadlineは32bit・64bit両対応で入れてくれます。インストール後、「OSXに入ってるlibeditとかち合っちゃうので、パスが通ってるところにリンクを張りたいときは"brew link readline"としてくれ」と英語で書かれているのでその通りに実行すればよし。

gettextを入れる

 そのままPythonをビルドすると、自分の環境ではlibintlで転けてしまったので急遽インストール。ただ、gettextは32bit・64bit両対応でビルドしてくれないので、ちょこっと弄りました。

brew edit gettext


 上記コマンドを打ち込んで実行すると……


f:id:raydive:20100925191529p:image:left


 という感じで、環境変数EDITORに設定されたエディタを起動して、gettext.rbを開いてくれます。ちなみにこのgettext.rbはHomebrewではFormulaって呼ぶそうな。Formula Cookbook · mxcl/homebrew Wiki · GitHubで自前のFormulaのつくり方とか乗っていたりするので参考にするといい。


 で、デフォルトではgettextは32bit・64bit両対応でビルドしてくれない」ので、両対応でビルドしてくれるreadlineのFormulaを確認しながら、gettextのFormulaに手を加える。
 ちなみにbrew updateで更新をかけると変更した部分は消えちゃうので要注意。新しくFormulaを作るのがいいんじゃないかなぁ。(未確認なのであまり当てにはしない方がよい)


 ということで閑話休題。話を元に戻す。



 まず、こちらreadlineがFormula。

require 'formula'

class Readline <Formula
  url 'ftp://ftp.cwru.edu/pub/bash/readline-6.1.tar.gz'
  md5 'fc2f7e714fe792db1ce6ddc4c9fb4ef3'
  homepage 'http://tiswww.case.edu/php/chet/readline/rltop.html'

  keg_only <<-EOS
OS X provides the BSD Readline library. In order to prevent conflicts when
programs look for libreadline we are defaulting this GNU Readline installation
to keg-only.
EOS

  def patches
    patches = (1..2).collect { |n| "ftp://ftp.gnu.org/gnu/readline/readline-6.1-patches/readline61-%03d"%n }
    { :p0 => patches }
  end

  def install
    # Always build universal, per http://github.com/mxcl/homebrew/issues/issue/899
    ENV.universal_binary
    system "./configure", "--prefix=#{prefix}",
                          "--mandir=#{man}",
                          "--infodir=#{info}",
                          "--enable-multibyte"
    system "make install"
  end
end


 こちらがgettextのFormula

equire 'formula'

class Gettext <Formula
  url 'http://ftp.gnu.org/pub/gnu/gettext/gettext-0.17.tar.gz'
  md5 '58a2bc6d39c0ba57823034d55d65d606'
  homepage 'http://www.gnu.org/software/gettext/'

  keg_only "OS X provides the BSD gettext library and some software gets confused if both are in the library path."

  def patches
    'http://gist.github.com/raw/186336/2fe65fab894f94a03aab2f03349ae7f1febcd301/mac-osx-105-environ.patch'
  end

  def options
    [['--with-examples', 'Keep example files.']]
  end

  def install
    ENV.libxml2
    ENV.O3 # Issues with LLVM & O4 on Mac Pro 10.6

    system "./configure", "--disable-dependency-tracking", "--disable-debug",
                          "--prefix=#{prefix}",
                          "--without-emacs",
                          "--without-included-gettext",
                          "--without-included-glib",
                          "--without-included-libcroco",
                          "--without-included-libxml"
    system "make"
    ENV.deparallelize # install doesn't support multiple make jobs
    system "make install"

    (doc+'examples').rmtree unless ARGV.include? '--with-examples'
  end
end


 readlineのFormulaにある「ENV.universal_binary」というそのものずばりな変数が怪しいですね。gettextのほうにも同様に追加してビルドしてみると……

>>$ file /usr/local/lib/libintl.*
/usr/local/lib/libintl.8.0.2.dylib: Mach-O universal binary with 2 architectures
/usr/local/lib/libintl.8.0.2.dylib (for architecture i386):	Mach-O dynamically linked shared library i386
/usr/local/lib/libintl.8.0.2.dylib (for architecture x86_64):	Mach-O 64-bit dynamically linked shared library x86_64
/usr/local/lib/libintl.8.dylib:     Mach-O universal binary with 2 architectures
/usr/local/lib/libintl.8.dylib (for architecture i386):	Mach-O dynamically linked shared library i386
/usr/local/lib/libintl.8.dylib (for architecture x86_64):	Mach-O 64-bit dynamically linked shared library x86_64
/usr/local/lib/libintl.a:           Mach-O universal binary with 2 architectures
/usr/local/lib/libintl.a (for architecture i386):	current ar archive random library
/usr/local/lib/libintl.a (for architecture x86_64):	current ar archive random library
/usr/local/lib/libintl.dylib:       Mach-O universal binary with 2 architectures
/usr/local/lib/libintl.dylib (for architecture i386):	Mach-O dynamically linked shared library i386
/usr/local/lib/libintl.dylib (for architecture x86_64):	Mach-O 64-bit dynamically linked shared library x86_64


 無事に両対応のビルドが完了しました。(brew link gettextを忘れずに)

Pythonをビルド!

 ここまで来たら後はPythonをビルドするだけ。ちなみに今回はPython2.7及び2.6.6をビルド。

./configure --enable-framework --with-universal-archs=intel --enable-universalsdk=/
make
make install


 これだけでOK。

Homebrew面白そうだ

 野良ビルドの管理も出来そうでこりゃいいねぇ。