2008年3月14日金曜日

setup.py bdist_rpm with SWIGのはまりどころ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
setup.pyをいろいろ書き間違えて学んだ。結局、MANIFESTをちゃんとかく(setuptoolsを使えばそうでもないのかもしれないが・・・)、とext_modulesの名前の付け方に注意することだ。

今回の方法でインストールすると、site-package下にhogehoge.pyと_hogehoge.soが配置される。hogehogeというdirectoryを掘ってその下に入れてほしい場合はまた考える必要がありそうだが、Extensionがfileを生成すると思っていれば多分ただしくsetup.pyをかけるだろう。

hogehoge.cをhogehoge.iを書いて, site-packageからimport hogehogeできるようにするには次のようにする。


MANIFEST

hogehoge.c
hogehoge.i
hogehgoe.h
setup.py


setup.py

from distutils.core import setup, Extension

setup(
name='hogehoge',
version='0.1',
description='hogehoge module',
ext_modules=[
Extension(
'_hogehoge',
[
'hogehoge.i',
'hogehoge.c',
],
),
],
py_modules=['hogehgoe'],
)


解説:

MANIFEST
buildに必要なファイルは全部書きます。
ここにhogehoge.pyが入っていないことに注意(SWIGが生成するから)。

setup.py
setupの引数のname='hogehoge'だが、import hogehogeしたいのだから必然
Extension の第一引数のnameが'_hogehoge'になっているのに注意。SWIGは.soの名前が_XXX.soになることを期待しているので、こうしなければならない。

第2引数はソースリストだが、これはSWIGに渡すものとgccに渡すファイルを指定する。こうすると勝手にSWIGを呼び出してhogehoge_wrap.cとhogehoge.pyを生成し、次にgccを呼び出してhogehoge.cとhogehoge_wrap.cをコンパイルし、リンカを呼び出してそれらの.oから_hogehoge.soを生成してくれる。ここで注意しなければならないのは.cを指定し忘れてもpackgaeが生成でき、.soがインストールされてしまうということだ。もちろん.c内で定義されているものを呼び出すことはできないのでimport先でexceptionを起こして止まってしまう。

最後にsetup.pyのpy_modulesで、hogehoge.pyを指定しているが、これによりSWIGの生成したhogehgoe.pyがsite-package下にコピーされます。これがないとhogehoge.pyがコピーされません。setupの途中、手元にないpyを指定するのでエラーが出ますが続行されます。最終的にはSWIGが生成したpyがコピーされるので問題はないですが。

5 件のコメント:

nori さんのコメント...

うが。

error: Installed (but unpackaged) file(s) found:
/usr/lib64/python2.4/site-packages/FIBSCookieMonster.pyo

buildbotではsetup.cfgに
[install]
optimize=1
としてやっても、pyが生成される前なのでエラーになってしまう。

.pydistutils.cfgを用意しないと駄目?しかもこれをリモート環境に要求するんだよね、当たり前なんだけど。

ヤレヤレ。

nori さんのコメント...

うは・・・
/var/tmp/FIBSCookieMonster/
に残骸が残っていて消せない。

とりあえずsudoして消して実験したら読みどおり。う~~む。どんどんbad know howな方向に進んでいてやだなぁ。

nori さんのコメント...

てか、/var/tmpの下もuser名でdir掘って使ってほしい・・・。

nori さんのコメント...

buildbot-slaveと開発マシンが同じなのでこれは対処したほうがよさそう。

体に悪い。

nori さんのコメント...

.pydistutils.cfg
を用意したらうまくいった。なんだかなぁ。