「HOWTO: Compiling Python Modules with MPW」(Python 2.0:Mac:Demo:mpwextensions.html)と「Creating a C extension module on the Macintosh」(Python 2.0:Mac:Demo:plugins.html)をもとに作成。
Python 2.0 sourceにあるxxmodule.cをMPWでコンパイルしてみた。interslipLib.c、interslipLib.h、それとinterslipmodule.cを作成してMPWでコンパイルした。
MPWのStartup Items
フォルダにPython
という新しいファイルを作り、次のように書き込む:
set Python "Performa HD:Python 2.0:" set PythonIncludes "{Python}Include" set PythonMacIncludes "{Python}Mac:Include" set PythonCore "{Python}PythonCore" export Python PythonIncludes PythonMacIncludes PythonCore
1行目はPythonインタプリタの置いてあるディレクトリを指定した。2行目の{Python}Include
に合うよう、Python 2.0 source
フォルダ内のInclude
をPerforma HD:Python 2.0
フォルダ内に置いた。3行目の{Python}Mac:Include
に合うよう、Python 2.0 source:Mac
フォルダ内のInclude
をPerforma HD:Python 2.0:Mac
フォルダ内に置いた。4行目はPythonCore
を指定している。
次に、MPWのMrC
コンパイラのためにPython 2.0:Mac:Include
フォルダ内のconfig.h
を書き換えた。手入力で以下の行を、__MWERKS__
と__SC__
の似たような記述の後に加えた:
#ifdef __MRC__ #define BAD_STATIC_FORWARD #endif
”このステップは重要です:標準のディストリビューションに含まれる多くのモジュールは、この変更なしではコンパイルされません(下の問題点を参照)。”
C拡張モジュールのコンパイルの準備ができたと仮定すると、以下の手順になる。
ということはつまり、@「Cによる拡張機能とPythonのためのラッパーが書かれたCのソースファイル」ができている、あるいはA「拡張機能のみが書かれたCのソースファイル」と、「Cで書かれたPython用のラッパー」ができている場合である。B「拡張機能のみが書かれたCのソースファイル」しかできていない場合は、modulator
を使ってCによるPythonのラッパーファイルを作成できる。
コンパイルの前に以下のことを確認しておく:
import xx
と呼び出せるようにする)ではxxmodule.c
という名前で、MPWのカレントワーキングディレクトリにあるする。
xx
で、shared libraryファイルの名前はxx.ppc.slb
となる
init
で始まる。例ではinitxx
であり、自分で書き加える必要はなし。Cのソースコードと同じディレクトリにmakefileを置きたいので、先に進む前にMPWのワーキングディレクトリをCのソースコードのあるディレクトリに設定する。必要無ければ特にしなくてもよい。
例題の拡張モジュールxxmodule.c
のmakefileを作るには:
makefileができたら、編集する必要がある。カレントディレクトリの"xx.ppc.slb.make"ファイルを開いて、以下の変更をする:
Includes =
変更後
Includes = -i "{PythonIncludes}" -i "{PythonMacIncludes}"
もし、CreateMakeコマンドで必要なヘッダーファイルを加えていなかったら、同じようにここでインクルードできる。
ヘッダーファイルを追加するには、ここでの変更後のように-i
オプションとディレクトリを加える。
PPCCOptions = {Includes} {Sym•PPC}
変更後
PPCCOptions = -w off -d HAVE_CONFIG_H {Includes} {Sym•PPC}
-xm s ∂
以下を加える。
-d ∂ "{PythonCore}" ∂
他のshared libraryにリンクする必要があるなら、PythonCoreの前の行に追記し、その各行をそれぞれ∂
で終える。(注:各行の最後の文字は"partial derivative"のシンボルで、option-dでタイプでき、MPWの継続行を意味する。)
以上のmakefileの書き換えを自動的に行うスクリプトchangeMakeFile4Python.pyを作った。
ファイルを保存する。これでビルドする準備ができた。
"Build"あるいは"Full Build"メニューを選び、xx.ppc.slbとタイプ(CreateMakeコマンドを実行したすぐ後だと、自動的に入力されている)すると、MPWがビルドを開始する。ソースファイルを訂正したりして、shared libraryをりビルドする必要がある時は、もう一度"Build"か"Full Build"をすればよい。
拡張モジュールをコンパイルしたら、Pythonにその場所を教えなければならない。しかし、できたモジュール(xx.ppc.slb)をMacの他のモジュールが入っているサーチパス-:Mac:Plugins
フォルダ-に移動するのが楽。EditPythonPrefs
アプレットを使って、モジュールのある場所をパスに加えてもよい。
Python 2.0 source:Tools:modulator
フォルダ内のmodulator.pyを使う。modulatorフォルダをPython 2.0フォルダ内にコピーした。modulator.pyはTkを使っている。私のMacではTkを使うと何故かシステムエラーが出る。それでHowtoの通り、下記のPythonスクリプトを作って実行した。
import addpack addpack.addpack('Tools') addpack.addpack('modulator') import genmodule m = genmodule.module() m.name = 'interslip' #モジュール名に合わせて設定する m.abbrev = 'pyis' #このままでよい m.methodlist = ['open', 'connect', 'disconnect', 'status', \ 'getconfig', 'setconfig'] #Pythonで呼び出すメソッドのリスト m.objects = [] #Pythonで呼び出すクラスのリスト? fp = open('@interslipmodule.c', 'w') #'@interslipmodule.c'の名前でこのスクリプトと同じディレクトリに書き込む genmodule.write(fp, m)このプログラムをダブルクリックあるいはPythonインタプリタにドロップすれば、Pythonのラッパー(スケルトン・モジュール)の結果が得られる。