「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(とmodulator)でPythonモジュールをコンパイルする


PythonモジュールのコンパイルのためにMPWをセットアップする
モジュールをコンパイルする
CreateMakeを使う
拡張モジュールを使う
Pythonラッパーをmodulatorで作成する

Pythonモジュールのコンパイルのために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フォルダ内のIncludePerforma HD:Python 2.0フォルダ内に置いた。3行目の{Python}Mac:Includeに合うよう、Python 2.0 source:Macフォルダ内のIncludePerforma 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のラッパーファイルを作成できる。

コンパイルの前に以下のことを確認しておく:

CreateMakeを使う

Cのソースコードと同じディレクトリにmakefileを置きたいので、先に進む前にMPWのワーキングディレクトリをCのソースコードのあるディレクトリに設定する。必要無ければ特にしなくてもよい。

例題の拡張モジュールxxmodule.cのmakefileを作るには:

makefileができたら、編集する必要がある。カレントディレクトリの"xx.ppc.slb.make"ファイルを開いて、以下の変更をする:

以上の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ラッパーをmodulatorで作成する

Interslipの例題を実行するためにPythonラッパーをmodulatorで作成するには、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のラッパー(スケルトン・モジュール)の結果が得られる。
また、モジュール名、接頭辞、メソッド名を入力することにより、以上のスクリプトと同じ働きをする"スクリプト"を作った。