ホームページ >バックエンド開発 >C++ >Python 拡張機能を構築するために CMake を setup.py に統合するにはどうすればよいですか?

Python 拡張機能を構築するために CMake を setup.py に統合するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-27 12:11:02804ブラウズ

How to Integrate CMake into setup.py for Building Python Extensions?

setuptools 拡張機能の setup.py に CMake を統合する方法

Python 拡張機能の構築と CMake の必要性

の場合C ライブラリを統合する Python 拡張機能を開発する場合、CMake はビルド プロセスを管理するための包括的なツールを提供します。ただし、一般的なワークフローでは、setup.py bdist_wheel を実行する前に、CMake を使用してライブラリを手動でコンパイルする必要があります。これは不便で時間がかかる可能性があります。

setup.py での CMake の呼び出し

これに対処するには、CMake を setup.py ビルド プロセスに組み込むことができます。 。重要なのは、CMake を利用して拡張機能を構成およびビルドするカスタム build_ext コマンドを作成することです。

build_ext コマンドのカスタマイズ

setup.py ファイルで、 build_extコマンドクラスを作成し、コマンドクラスに登録します。カスタム実装内で、CMake を構成して呼び出し、拡張モジュールをビルドします。

サンプル プロジェクトとセットアップ スクリプト

概念を実証するために、C を使用した単純なプロジェクトを考えてみましょう。拡張子 (foo) と Python モジュール (spam.eggs)。 setup.py スクリプトは、元の build_ext を呼び出すことなく拡張機能をカプセル化する CMakeExtension クラスを利用します。 build_cmake メソッドは、CMake の構成とビルド ステップを処理します。

<code class="python">import os
import pathlib

from setuptools import setup, Extension
from setuptools.command.build_ext import build_ext_orig

class CMakeExtension(Extension):

    def __init__(self, name):
        # don't invoke the original build_ext for this special extension
        super().__init__(name, sources=[])

class build_ext(build_ext_orig):

    def run(self):
        for ext in self.extensions:
            self.build_cmake(ext)
        super().run()

    def build_cmake(self, ext):
        cwd = pathlib.Path().absolute()

        # these dirs will be created in build_py, so if you don't have
        # any python sources to bundle, the dirs will be missing
        build_temp = pathlib.Path(self.build_temp)
        build_temp.mkdir(parents=True, exist_ok=True)
        extdir = pathlib.Path(self.get_ext_fullpath(ext.name))
        extdir.mkdir(parents=True, exist_ok=True)

        # example of cmake args
        config = 'Debug' if self.debug else 'Release'
        cmake_args = [
            '-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + str(extdir.parent.absolute()),
            '-DCMAKE_BUILD_TYPE=' + config
        ]

        # example of build args
        build_args = [
            '--config', config,
            '--', '-j4'
        ]

        os.chdir(str(build_temp))
        self.spawn(['cmake', str(cwd)] + cmake_args)
        if not self.dry_run:
            self.spawn(['cmake', '--build', '.'] + build_args)

setup(
    name='spam',
    version='0.1',
    packages=['spam'],
    ext_modules=[CMakeExtension('spam/foo')],
    cmdclass={
        'build_ext': build_ext,
    }
)</code>

テストと検証

プロジェクトのホイールをビルドしてインストールすることで、ライブラリが適切であるかどうかを確認できます。正常にインストールされ、機能しています。 spam.eggs モジュールからラッパー関数を実行すると、期待どおりの出力が生成されるはずです。

以上がPython 拡張機能を構築するために CMake を setup.py に統合するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。