pycomplete の続き。
Gentoo の ebuild に仕立てるには、というお話。
結果だけ見たい人は bitbucket に上げてある のを見て下さい。
元々 python-mode の ebuild はあるので、あとは pycomplete.{el,py} をインストールさせるだけ。
ではあるのだが。
難関は py の方である。
Python 関係の ebuild はいろいろ作法があってややこしい。
一応 Gentoo Python Developers Guide というのを読むと選択肢は示されているのだが、実際に今自分が書こうとしている ebuild ではどの選択肢を選ぶべきなのか、が簡単ではない。
いろいろややこしくなったのは Python に互換性の乏しい 2 系と 3 系が併存しているからなので Gentoo python herd を責めるのは筋が違うような気もするが、ともかくややこしい書き方が求められているのは間違いない。
最初に決めるのは PYTHON_DEPEND で、これはインストールしようとしているスクリプトがどのバージョンで使えるものなのかを設定する変数。
この段階で、スクリプトの作者ならざる身としては、悩むところである。
Python の各バージョンで何が導入されたか、その書き方が使われているかどうか、を調べないと判らない。
yield を使っているとか with を使っているとか、あるいは import されているライブラリーが…とか。
今回は、ぱっと見、素直に基本的な機能しか使っていなさそうなので、PYTHON_DEPEND="*" としておく。
Ebuilds should set SUPPORT_PYTHON_ABIS="1" before 'inherit'. などと書いてあり、inherit python の前に SUPPORT_PYTHON_ABIS を置かなければならない。
実はさっきの PYTHON_DEPEND もそう。
inherit が(せいぜい EAPI の設定の後に)一番上にあるものだという気分でいると面食らう。
ちなみに上の引用文は Supporting of installation for multiple versions of Python というセクションの最初の文であり、Python 2.7 でしか動かないというようなものに関しては SUPPORT_PYTHON_ABIS は設定しない。
今回は、まあどれでも動くんじゃない、という見通しなので設定しておく。
さらに、動かないことが判っている Python のバージョンがある場合、それを RESTRICT_PYTHON_ABIS に並べることになっている。
さっきの PYTHON_DEPEND の補集合ということになると思うが、そのように自動で計算はしてくれず、手で両方書くようである。
矛盾したらどうなるんだろう。
このぐらいが事前準備。
次からは src_* とか pkg_* の関数の中身を定義をしていく。
先ほど SUPPORT_PYTHON_ABIS を 1 にして、複数のバージョンに対応できることにしたので、pycomplete.py をそれぞれの Python バージョンに対してインストールしなければならない。
そのために、ビルドディレクトリをそれぞれのバージョン用に分ける、ということをしてもらう必要がある。
(本当は今回ライブラリとリンクするような工程はないので必要ないかもしれない。)
そのために使うのが python_copy_sources() 関数である。
pycomplete.py は completion サブディレクトリにあるので、
python_copy_sources completion のように指定する。
分けてしまったので、ビルドの作業もインストールの作業も Python のバージョンに応じて複数回こなさなければならない。
python_execute_function() 関数に作業関数を渡したりして、これを実現する。
先ほどのガイドで物足りなければこの辺りの関数を定義している python.eclass の文書もあるが、説明が簡潔すぎて動作を理解した後でないと説明が理解できなかったりする。
python_execute_function に渡す関数が必要になるのは、今回はインストールだけで、site-packages にコピーするだけの単純なものである。
install_pycomplete() {
insinto $(python_get_sitedir -f)
doins *.py || die
}
python_get_sitedir() も python.eclass に定義されている関数で -f は ABI ごとに違うものになるよ、ということを伝えるオプション。
insinto は Install Functions Reference にものすごく簡潔な説明があるが、次の doins がファイルを置く先を決める。
prefix を使っている身としては EPREFIX はどうなるのだ、とかいろいろ気になったりするが、よろしくやってくれるようだ。
.py をコンパイルした .pyc はいつ作るのか知らなかったのだが、pkg_postinst の中で python_mod_optimize() を呼び出すのが作法らしい。
引数にファイル名かパッケージ名を引き渡す。
逆に .pyc ファイルをアンインストールの際に消して回るのは python_mod_cleanup() で当然 pkg_postrm に書いておく。
ということで、何やら面倒な諸々を使って Python のスクリプトをインストールする ebuild を書くことができるまでをだらだら書いてきたが、他の人が作業する際の参考になればと願いながら、終わりにする。
|