Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengintegrasikan CMake ke dalam setup.py untuk Membina Sambungan Python?

Bagaimana untuk Mengintegrasikan CMake ke dalam setup.py untuk Membina Sambungan Python?

Susan Sarandon
Susan Sarandonasal
2024-10-27 12:11:02800semak imbas

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

Cara Mengintegrasikan CMake dalam setup.py untuk setuptools Extension

Membina Sambungan Python dan Keperluan untuk CMake

Bila membangunkan sambungan Python yang menyepadukan perpustakaan C, CMake menyediakan alat yang komprehensif untuk mengurus proses binaan. Walau bagaimanapun, aliran kerja biasa melibatkan penyusunan perpustakaan secara manual dengan CMake sebelum menjalankan setup.py bdist_wheel. Ini boleh menyusahkan dan memakan masa.

Menyebut CMake dalam setup.py

Untuk mengatasinya, adalah mungkin untuk memasukkan CMake ke dalam proses binaan setup.py . Kuncinya ialah mencipta perintah build_ext tersuai yang menggunakan CMake untuk mengkonfigurasi dan membina sambungan.

Menyesuaikan arahan build_ext

Dalam fail setup.py, gantikan build_ext kelas arahan dan daftarkannya dalam kelas arahan. Dalam pelaksanaan tersuai anda, konfigurasikan dan gunakan CMake untuk membina modul sambungan.

Contoh Projek dan Skrip Persediaan

Untuk menunjukkan konsep, pertimbangkan projek ringkas dengan C sambungan (foo) dan modul Python (spam.eggs). Skrip setup.py memanfaatkan kelas CMakeExtension yang merangkum sambungan tanpa menggunakan build_ext asal. Kaedah build_cmake mengendalikan konfigurasi CMake dan langkah membina.

<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>

Pengujian dan Pengesahan

Dengan membina roda projek dan memasangnya, anda boleh mengesahkan sama ada perpustakaan itu berjaya dipasang dan berfungsi. Menjalankan fungsi pembungkus daripada modul spam.eggs harus menghasilkan output yang diharapkan.

Atas ialah kandungan terperinci Bagaimana untuk Mengintegrasikan CMake ke dalam setup.py untuk Membina Sambungan Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn