handlename's blog

コード片など

homebrew の Formula を追加する

MacBook Air にしたときに macports から homebrew に乗り換えた、が、 macports に比べて homebrew ははじめから入っているパッケージが少ない。

入っていないものは自力でコンパイルすればいいのだけれど、 homebrew で入れたものと自力で入れたものが混ざってなんだかいやだ・・・。

そんなときは自分で Formula (パッケージ(のようなもの)を定義するRubyファイル) を書けばいいのです。

macports でもパッケージを追加したりできたんだろか…。
調べずに移行してしまったのでその辺はわからず。

参考ページ。本家。
https://github.com/mxcl/homebrew/wiki/Formula-Cookbook

以下は apache の Formula を書く手順。 内容は参考ページに書いてあることほぼそのまんま。

ソースのURLを指定してcreate

$ brew create http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.2.19.tar.gz

実行すると Formula のひな形が $EDITOR で開かれる。

require 'formula'

class Httpd < Formula
  url 'http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.2.19.tar.gz'
  homepage ''
  md5 'e9f5453e1e4d7aeb0e7ec7184c6784b5'

  # depends_on 'cmake'

  def install
    system "./configure", "--disable-debug", "--disable-dependency-tracking",
                          "--prefix=#{prefix}"
    # system "cmake . #{std_cmake_parameters}"
    system "make install"
  end
end

ひな形を編集

今回は、

  • homepage を指定
  • コメントアウトを削除
  • configure オプションを追加

を行って、結果以下のように。

require 'formula'

class Httpd < Formula
  url 'http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.2.19.tar.gz'
  homepage 'http://httpd.apache.org/'
  md5 'e9f5453e1e4d7aeb0e7ec7184c6784b5'

  def install
    system "./configure", *configure_args
    system "make"
    system "make install"
  end

  def configure_args
    return [
        "--prefix=#{prefix}",
        "--disable-debug",
        "--disable-dependency-tracking",
        "--enable-so",
        "--enable-rewrite",
        "--mandir=#{man}",
    ]
  end
end

homepage は必須ではないけど、本家のリポジトリに取り込まれたかったら書かないといけないらしい。

homebrew でインストール

$ brew install httpd

うまくいかなければ Formula をいじくってどうにかする。 たいていは configure オプションをいじればどうにかなるはず。 保存場所は /usr/local/Library/Formula/httpd.rb 。

パッチを当てたい場合

すでにパッチが公開されていて、それを適用しつつインストールしたい場合。 patches というメソッドを定義して、パッチをテキストで返したり、URLで返したりすればいいみたい。

以下の例は冒頭の参考ページのものをそのまま掲載。

URLで指定する場合。

def patches
  # fixes doc install on OS X 10.6
  "http://gist.github.com/623/my.patch/raw/"
end

patch コマンドのオプションを指定する場合。

def patches
  # back ported fix for memory leak in drawing functions
  { :p0 => "http://gist.github.com/623/my.patch/raw/" }
end

Forumla ファイルに書き込んでしまう場合。

class Foo < Formula
  def patches
    # fixes your mum (she was b0rked)
    DATA
  end
end

__END__
diff --git a/foo/showfigfonts b/foo/showfigfonts
index 643c60b..543379c 100644
--- a/foo/showfigfonts
+++ b/foo/showfigfonts
@@ -14,6 +14,7 @@

おわり

冒頭の参考ページにはほかにもいろいろ使える方法が書いてあるので、 読んでみるとおもしろいです。