7

拡張機能をビルドするために必要な C コードを含む python パッケージがあります (重要なビルドのニーズがあります)。私は SCons をビルド システムとして使用しました。SCons は非常に優れていて柔軟性があるからです。

distutils で配布する準備ができている SCons を使用して Python 拡張機能をコンパイルする方法を探しています。ユーザーが単純に setup.py install と入力して、デフォルトの distutils ビルド エンジンの代わりに SCons でコンパイルされた拡張機能を取得することを望んでいます。

頭に浮かぶアイデアは、distutils で build_ext コマンドを再定義することですが、詳細なドキュメントが見つかりません。

なにか提案を?

4

4 に答える 4

1

ページを参照してください: http://www.scons.org/wiki/PythonExtensions

Python用のpyrex-c拡張機能を構築するために、わずかに変更されたバージョンを使用しています。

于 2010-04-13T09:20:20.287 に答える
0

scons を使用して setup.py ファイルを生成します。そこで、setup.py.in というテンプレートを作成し、scons を使用してテンプレートを展開し、setup.py を生成します。

これを行う私のプロジェクトへのリンクを次に示します。

setup.py.in テンプレート

Sコンストラクト

これは、キーと値のペアの辞書を計算して、setup.py.in テンプレートに代入し、setup.py を生成します。

したがって、エンド ユーザーは次の 2 つのことを行います。

scons setup.py
python setup.py install

警告: 少し前に書いたように、私の sconstruct は少し乱雑ですが、概念を示す必要があります。

適切な scons ツールの書き方を学べば、次のように単一のターゲットに変換できます。

scons --pymod

SWIG で Python ラッパーを生成する scons ツールを次に示します。

import SCons.Action
from SCons.Script import EnsureSConsVersion

SCons.Script.EnsureSConsVersion(0,96,92)

SwigGenAction = SCons.Action.Action('$SWIGGENCOM', '$SWIGGENCOMSTR')

def emitter(target, source, env):
    """
    Add dependency from target to source
    """

    env.Depends(target, source)

    return target, source


def generate(env):
    """
    Add builders and construction variables for the SwigGen builder.
    """

    if 'SWIGCOM' not in env:
        raise SystemError("SCons build environment could not detect tool: swig")

    bld = env.Builder(
        action = SwigGenAction,
        emitter = emitter,
        target_factory = env.fs.File)

    env['BUILDERS']['SwigGen'] = bld

    env['SWIGGENCOM'] = env['SWIGCOM']


def exists(env):
    return env.Detect('swig')

SConstruct ファイルから、ラッパー コードを生成できます。

foobar_cc = env.SwigGen("foobar_wrap.cc", "foobar.i")

foob​​ar.i を変更すると、foobar_wrap.cc が再生成されます。これを取得したら、実際に python setup.py install を実行するための他のツールを作成できるので、 --pymod が提供されると、python モジュールがビルドされます。

于 2013-08-22T16:20:42.687 に答える