Distutils は、可能なときにはいつでも、 setup.py スクリプトを 実行する Python インタプリタが提供する設定情報を使おうとします。 例えば、拡張モジュールをコンパイルする際には、コンパイラやリンカの フラグには Python をコンパイルした際と同じものが使われます。 通常、この設定はうまくいきますが、状況が複雑になると不適切な 設定になることもあります。この節では、通常の Distutils の動作を オーバライドする方法について議論します。
C や C++ で書かれた Python 拡張をコンパイルする際、しばしば 特定のライブラリを使ったり、特定の種類のオブジェクトコードを 生成したりする上で、コンパイラやリンカに与えるフラグをカスタマイズ する必要があります。ある拡張モジュールが自分のプラットフォームでは テストされていなかったり、クロスコンパイルを行わねばならない 場合にはこれが当てはまります。
最も一般的なケースでは、拡張モジュールの作者はすでに 拡張モジュールのコンパイルが複雑になることを見越していて、 Setup ファイルを提供して編集できるようにしています。 Setup ファイルの編集は、モジュール配布物に多くの個別の拡張 モジュールがあったり、コンパイラに拡張モジュールをコンパイルさせる ために細かくフラグをセットする必要があるような場合にのみ行うことに なるでしょう。
Setup ファイルが存在する場合、ビルドするべき拡張モジュールの リストを得るために解釈されます。Setup ファイルの各行には 単一のモジュールを書きます。各行は以下のような構造をとります:
module ... [sourcefile ...] [cpparg ...] [library ...]
特定のプラットフォームにおいて、プラットフォーム上の特殊なライブラリ
が必要な場合、 Setup ファイルを編集して
python setup.py build
を実行すればライブラリを追加できます。
例えば、以下の行
foo foomodule.c
foo foomodule.c -lm
foo foomodule.c -Xcompiler -o32 -Xlinker -shared -lm
-x c++
を渡すには、
Setup ファイルには -Xcompiler -x -Xcompiler c++
を渡さねばなりません。
コンパイラフラグは、環境変数 CFLAGS の設定でも与えられます。 CFLAGS が設定されていれば、Setup ファイル内で指定 されているコンパイラフラグに CFLAGS の内容が追加されます。
この小節では、 Borland C++ コンパイラのバージョン 5.5 で Distutils を使うために必要な手順について述べています。
まず、 Borland のオブジェクトファイル形式 (OMF) は、Python 公式サイトや ActiveState の Web サイトからダウンロード できるバージョンの Python が使っている形式とは違うことを知って おかねばなりません (Python は通常、 Microsoft Visual C++ でビルド されています。Microsoft Visual C++ は COFF をオブジェクトファイル 形式に使います。) このため、以下のようにして、 Python のライブラリ python25.lib を Borland の形式に変換する必要があります:
coff2omf python25.lib python25_bcpp.lib
変換されたファイルは、通常のライブラリと同じディレクトリに置かねば なりません。
さて、 Distutils は異なる名前を持つこれらのライブラリをどのように 扱うのでしょうか? 拡張モジュールで (例えば foo という名の) ライブラリが必要な場合、 Distutils はまず _bcpp が後ろに 付いたライブラリ (例えば foo_bcpp.lib) が見つかるかどうか 調べ、あればそのライブラリを使います。該当するライブラリがなければ、 デフォルトの名前 (foo.lib) を使います1。
Borland C++ を使って Distutils に拡張モジュールをコンパイル させるには、以下のように入力します:
python setup.py build --compiler=bcpp
Borland C++ コンパイラをデフォルトにしたいなら、自分用、または システム全体向けに、 Distutils の設定ファイルを書くことを検討した 方がよいでしょう ( 5 節を参照してください)。
参考:
この手引きは2.4.1 以降のPython と 3.0.0 (binutils-2.13.90-20030111-1) 以上の MinGW でのみ有効です。
この節では、 Cygwin や MinGW 2配布物中の GNU C/C++ コンパイラ で Distutils を使うために必要な手順について述べます。 Cygwin 向けにビルドされている Python インタプリタを使っているなら、 以下の手順をとらなくても Distutils はまったく問題なく動作します。
上記のコンパイラは、いくつかの特殊なライブラリを必要とします。 この作業は Borland の C++ よりもやや複雑です。というのは、 ライブラリを変換するためのプログラムが存在しないからです。
まず、 Python DLL が公開している全てのシンボルからなるリストを 作成しなければなりません。 (この作業むけのプログラムは、 http://starship.python.net/crew/kernr/mingw32/Notes.htmlにあります。そのページで PExports 0.42h を探してください。)
pexports python25.dll >python25.def
インストールされた python25.dllの位置はインストールオプションと、 Windowsのバージョンと言語に依存します。''自分だけのため''のインストー ルの場合には、インストールディレクトリのルートに配置されます。 共有インストールの場合にはシステムディレクトリに配置されます。
dlltool --dllname python25.dll --def python25.def --output-lib libpython25.a
拡張モジュールが他のライブラリ (zlib, ... ) を必要とする場合、 それらのライブラリも変換しなければなりません。 変換されたファイルは、それぞれ通常のライブラリが置かれているのと 同じディレクトリに置かねばなりません。
Cygwin を使って Distutils に拡張モジュールをコンパイルさせるには、
python setup.py build --compiler=cygwin
python setup.py build --compiler=mingw32
上記のオプションやコンパイラをデフォルトにしたいなら、自分用、または システム全体向けに、 Distutils の設定ファイルを書くことを検討した 方がよいでしょう ( 5 節を参照してください)。
参考: