きりかノート 3冊め

おあそびプログラミング

MacPorts の Portfile における ruby 用の拡張

Portfile を書くときには、似たようなのを見つくろって真似することが多い。で、わからないことがあれば MacPortsWiki-JP の Portfile(7) を見ればよい。

でも Ruby のライブラリなんかの Portfile をつくろうとして適当な Portfile を見てみると、

 ruby.setup        uconv 0.4.12 extconf.rb {README README.ja}

などと、のっけから書いてある。ruby.setup なんて man のどこにもないよ!と思うものの、なんとなくフィーリングで書けてしまったりするわけだ。

さすがに知らないままなのもどうかと思ったので、ちょっと調べてみた。答えはすべてソース(port1.0/resources/group/ruby-1.0.tcl)にあるのだから。

"proc" が手続きの定義、"set" が変数の代入だということくらい意識しておけば、おおむね雰囲気で読める。

ruby-1.0.tcl を使うために必要なこと(2007.04.15 追加)

Portfile に PortGroup の設定を書くこと。

 PortGroup    ruby 1.0

ruby-1.0.tcl で定義される手続き

次のたった2つだ(v1.4.0)。

前者は Config::CONFIG の値を取り出すもの、後者はインストール手順を簡易設定するためのものだ。意外と少なくて拍子抜け。

ruby.setup のひみつ

手続き ruby.setup の定義を見てみよう。

 # ruby group setup procedure
proc ruby.setup {module vers {type "install.rb"} {docs {}} {source "custom"}}

すると、ruby.setup の引数は

  • module
  • vers
  • type (省略値 install.rb)
  • docs (省略値 {})
  • source (省略値 "custom")

ということになる。省略値のない module, vers は必須だ。

module

module は対象のパッケージの名称だ。通常、ruby/ 以下にある port は rb-module という名称になる。対象のツール・アプリがたまたま ruby で書かれているだけで、port 名には "rb-" とはつけたくない、でも ruby.setup は利用したい、と考えたならば、答えは簡単だ。あとで name で port 名を上書きしてやればよい。

 ruby.setup   myapp 1.0
name myapp # override "rb-myapp"

ruby.setup での指示は Portfile の内容に変換されているだけなので、このようにあとで変更することもできる。いくつかの設定を一括でしておいて、ルールに沿わないもの、複雑なものは別途コードを書けばよい。

vers

vers はバージョンだ。それ以上の説明はいらないよね。

type

type はインストール方式を指定する。これにより、extract/config/build などの設定をほとんど省略することができる。

指定できる値は次のいずれか(念押すけど v1.4.0)。

basic_install.rb
???
copy_install
ライブラリ専用の単純なコピー。 copy_install:lib とすると、展開した lib/ 以下のファイルが ruby のライブラリディレクトリにインストールされる。
install.rb
その名の通り
setup.rb
その名の通り
extconf.rb
その名の通り
gnu
いわゆる configure & make
gem
その名の通り
docs

docs は ${prefix}/share/doc/${portname}/ にインストールするドキュメント類を指定する。どのファイルをインストールすればよいか悩んだら、README だけでもよいと思う。

source

source はアーカイブの取得方法を指定する。指定できる値は次のいずれか。

rubyforge
"rubyforge:12345" のように rubyforgeアーカイブ番号を指定する。プロジェクト名が module と異なるときは "rubyforge:12345:myproj" のようにするか、ruby.project 変数で指定できる。
rubyforge_gem
rubyforge の gem を指定する。module とプロジェクト名が異なるときは ruby.project 変数で指定できる。
sourceforge
プロジェクト名が module と異なるときは "sourceforge:myproj" のようにするか、ruby.project 変数で指定できる。

上記以外を指定したいときは、通常の Portfile と同様に master_sites で指定すればよい。

設定される・利用できる変数

MacPorts によりインストールされた ruby についての情報。

インストール動作の設定として、次の変数が利用できる。

ruby.module
ruby.setup に渡した module の値。
ruby.filename
アーカイブファイル名に利用。初期値は module の指定値。
ruby.project
rubyforgesourceforge のプロジェクト名。初期値は module の指定値。
ruby.docs
ruby.setup に渡した docs の値。
ruby.srcdir
copy_install でのみ利用される、コピー対象のファイルの場所。

その他の豆知識

shebang を変更するには reinplace を利用するとよい。rb-rabbit だとこんな感じ。

 post-build {
reinplace "s|^#!.*ruby|#!${ruby.bin}|" ${worksrcpath}/bin/rabbit
reinplace "s|^#!.*ruby|#!${ruby.bin}|" \
${worksrcpath}/bin/rabbit-theme-manager
reinplace "s|^#!.*ruby|#!${ruby.bin}|" ${worksrcpath}/bin/rabrick
}

おわり

resources/group/ には ruby 以外の環境向けにも便利な機能が用意されているので、ちょっとのぞいてみるのもおもしろいかもしれない。xcode-1.0.tcl なんてのもあったりする。

さあ、これで ruby の Portfile がじゃんじゃん書ける。みんなよろしく。