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)。
- ruby.extract_config
- ruby.setup
前者は 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.bin
- ruby.version
- ruby.arch
- ruby.lib
- ruby.archlib
インストール動作の設定として、次の変数が利用できる。
- ruby.module
- ruby.setup に渡した module の値。
- ruby.filename
- アーカイブファイル名に利用。初期値は module の指定値。
- ruby.project
- rubyforge や sourceforge のプロジェクト名。初期値は 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 がじゃんじゃん書ける。みんなよろしく。
| 固定リンク
最近のコメント