Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I build a setup.py to compile C++ extension using Python, pybind11 and Mingw-w64?

I'm currently trying to write a 'setup.py' script that when the user installs the python package automatically compiles my C++ extension bound with 'pybind11'. In Windows, I haven't got any problem making it happen with the 'VS19 MSVC' compiler. But I'm trying to make it happen if the user has installed 'MinGW-w64' instead.

These are the package files:

**main.cpp**

    #include <pybind11/pybind11.h>
    
    int add(int i, int j) {
        return i + j;
    }
    
    namespace py = pybind11;
    
    PYBIND11_MODULE(pybind11_example, m) {
    
        m.def("add", &add);
    }
**setup.py**

    from setuptools import setup, Extension
    import pybind11
    
    ext_modules = [
        Extension(
            'pybind11_example',
            sources = ['main.cpp'],
            include_dirs=[pybind11.get_include()],
            language='c++'
        ),
    ]
    
    setup(
        name='pybind11_example',
        ext_modules=ext_modules
    )

Having the two files in the same folder and running from the command prompt:

    python setup.py build

If the user has VS19 MSVC compiler installed it successfully generates **pybind11_example.pyd** that can be tested to work running with python:

    import pybind11_example as m
    print(m.add(1, 2))

But if the user has a Mingw-w64 compiler installed raises an error saying that Visual Studio 2015 is required.

Note that I can easily compile **main.cpp** in to **pybind11_example.pyd** manually with Mingw-w64 running:

    g++ -static -shared -std=c++11 -DMS_WIN64 -fPIC -I C:\...\Python\Python38\Lib\site-packages\pybind11\include -I C:\ ... \Python\Python38\include -L C:\ ... \Python\Python38\libs main.cpp -o pybind11_example.pyd -lPython38

Is there a way to write **setup.py** in a way that if the user has Windows with a MinGW-w64 compiler automatically compile **main.cpp** into **pybind11_example.pyd** when installing the package without needing to make it manually?

like image 316
Rafael Avatar asked Jun 11 '20 13:06

Rafael


Video Answer


1 Answers

Chek the answer to this question. They try to solve the opposite case, force msvc instead of mingw, but the approach with setup.cfg might help you.

And here the answer demonstrates how to specify command line parameters depending on the choice made by setup tools: if it is msvc then one set of parameters, and another set for mingw.

I belive the second approach should suite your needs - whichever compier is installled, you have the proper command line to build your module.

like image 150
Pak Uula Avatar answered Sep 23 '22 10:09

Pak Uula