2016-04-07 3 views
2

Ich schreibe eine Python-Erweiterung in C++. Ich kompilieren es durch eine Liste der konstituierenden Quelldateien in meiner setup.py Datei definieren, etwa so:Distutils: Kompilieren einer Objective-C++ - Quelldatei als Teil einer C++ - Erweiterung

extensions = { 
    'im': [ 
     "im/src/buffer.cpp", 
     "im/src/detail.cpp", 
     "im/src/gil.cpp", 
     "im/src/halideimage.cpp", 
     "im/src/hybrid.cpp", 
     "im/src/hybridimage.cpp", 
     "im/src/options.cpp", 
     "im/src/pybuffer.cpp", 
     "im/src/pycapsule.cpp", 
     "im/src/structcode.cpp", 
     "im/src/typecode.cpp", 
     "im/src/module.cpp" 
    ], 
} 

... diese verwendet werden, um eine Instanz von setuptools.Extension zu definieren, die letztlich zur setup() Funktion übergeben wird. Dies hat alle während des gesamten Projekts ganz gut gearbeitet, bis jetzt, als ich versuchte, eine plattformspezifische Bit hinzuzufügen:

preview_source = (sys.platform == 'darwin') and 'im/src/plat/preview_mac.mm' or \ 
        (sys.platform == 'linux') and 'im/src/plat/preview_linux.cpp' or \ 
        (sys.platform == 'win32') and 'im/src/plat/preview_windows.cpp' or \ 
               'im/src/plat/preview.cpp' 

extensions = { 
    'im': [ 
     "im/src/buffer.cpp", 
     "im/src/detail.cpp", 
     "im/src/gil.cpp", 
     "im/src/halideimage.cpp", 
     "im/src/hybrid.cpp", 
     "im/src/hybridimage.cpp", 
     "im/src/options.cpp", 
     preview_source, 
     "im/src/pybuffer.cpp", 
     "im/src/pycapsule.cpp", 
     "im/src/structcode.cpp", 
     "im/src/typecode.cpp", 
     "im/src/module.cpp" 
    ], 
} 

... Hinzufügen dieser neuen Bit die richtige Datei für die Kompilierung wählt - aber es funktioniert nicht überhaupt kompilieren

unknown file type '.mm'

error: unknown file type '.mm'

ich bin kein Experte, wenn es um distutils kommt ein: Offenbar distutils/setuptools nicht die „.mm“ Erweiterung als Quelldatei erkennen auf Mac OS X. nd setuptools plattformspezifische Konfiguration - Was ist eine einfache Möglichkeit, diese eine Quelldatei bedingt der Quelldateiliste auf dem Mac hinzuzufügen?

Antwort

2

Ich stieß auf das gleiche Problem, haben Sie jemals eine Lösung gefunden?

Es sieht aus wie '.mm' wird nicht in meiner Version von distutils unterstützt, aber '.m' ist. Also habe ich die C++ - Teile der .mm-Datei in eine .cpp-Datei getrennt und einen kleinen C-Header erstellt, um auf die .m-Datei von dieser .cpp zuzugreifen.

+0

Die Sache, die ich am Ende getan habe, war das Umbenennen '.mm' von Dateien in' .m' Dateien und dann '-x objective-C++' zu den Compilerargs - eine Lösung, die weder portierbar ist (ich denke '- x 'ist ein nur-drang-nur-Ding) noch zugänglich (in Anbetracht der Dateien sind im Wesentlichen jetzt falsch benannt). Ihre Lösung klingt sauberer, aber auf lange Sicht auch nicht mehr ... Ich suche immer noch eine echte Lösung für das Problem. – fish2000

+1

Danke für die Rückmeldung an mich. Was ist das Problem der Verwendung von .m-Dateien, scheint es gut zu funktionieren. Es scheint ein langer ausstehender Fehler zu sein, dass distutils nicht mit .mm umgehen kann. Ich habe einen Fehlerbericht + Patch von 2001 (vor 16 Jahren !!!) darüber gefunden: https://mail.python.org/pipermail/distutils-sig/2001-December/002695.html –

+0

Ein Problem mit der Benutzung '.m' ist das, in Fällen, in denen die Implementation an der Spitze von Objective-C++ steht - und als solche nicht ohne Weiteres in Übersetzungseinheiten nach Sprache zerlegt werden kann, wie Sie es konnten - enden Sie mit einer Bastard-von-Winterfell Art von Datei, die nicht schön mit zB spielt Xcode oder cmake, etc. In Wirklichkeit ist es nicht, wie du bemerkst, das Ende der Welt - es ist die Art von Problem, das die OCD meines Programmierers jedoch entflammt; Während das Dateisuffix nur ein Datum ist, bleibt es das zuverlässigste Metadatum, das Sie für eine Datei haben, und so. Aber trotzdem: 16-jähriger Bug, was? – fish2000

Verwandte Themen