2017-02-28 2 views
1

Ich behalte eine Cython-Bindung an etwas OCaml-Code (über ihre jeweilige C-Schnittstelle). Für frühere Versionen habe ich es geschafft, eine Wheel-Datei für Windows durch Cross-Compilation zu betrügen und zu verteilen. Jetzt habe ich es endlich geschafft, die Bibliothek für Windows 64 Bit sauber und nativ zu erstellen.Wie ändere ich den Verknüpfungsbefehl in einem SetupTools-Buildprozess (msvc)?

Für die 32-Bit kompilierte Version hatte ich ein spezifisches Ziel in meinem setup.py mit den richtigen Befehlen auszuführen. Zurück auf Windows, würde Ich mag zu einer setuptoolsic Weise haften zu tun, aber die Sache ist, ich brauche den regelmäßige Verknüpfung Befehl link.exe mit einem anderen Werkzeug zu ersetzen (resp. flexlink.exe, ausgeliefert mit OCaml auf Windows)

Keine Panik: flexlink.exe baut nur einige Assembler Scheiße vor dem Kompilieren und Verknüpfen mit dem regulären link.exe. Es ist der richtige Weg, OCaml-Executables und Shared Libraries unter Windows zu verknüpfen.

Für MacOS und Linux, das traditionelle arbeitet Extension Muster wie ein Zauber wie folgt (mlobject von OCaml etwas früher erzeugt wird nach einigen Zeitstempel überprüft in der Datei, asmrunlib auf das Äquivalent von python36.dll für OCaml der vollständige Pfad ist):

extensions = [ 
    Extension("foo", 
       ["foo.pyx", "interface_c.c"], 
       language="c", 
       include_dirs=INCLUDE, 
       extra_compile_args=compileargs, 
       extra_link_args=[mlobject, asmrunlib, ] 
      ) 
] 

sagen wir, ich beschränke mich auf Python> = 3.5, ich denke, (im Vergleich zu großen Projekten wie NumPy) ich würde durch die Erweiterung distutils._msvccompiler.MSVCCompiler beginnen müssen, und die self.linker = _find_exe("link.exe", paths) mit etwas auf flexlink.exe Basis zu ersetzen.

Das Problem ist, dass ich keine Ahnung habe, wie sie die Klempnerarbeit, die als nächstes kommt, verwalten (diesen erweiterten Compiler verbinden und ihn wie die normale msvc zum Setup-Prozess aussehen lassen). Ich nehme an, dass es nirgendwo gründlich dokumentiert ist und dass, wenn sie mehr als das in NumPy machen könnten, ich irgendwie mein Ziel erreichen könnte.

Meine setup.py ist immer noch einigermaßen einfach und eine Lösung, die den gesamten Gebäude/Verpackungsprozess in einer einzigen Datei hält, wäre großartig!

+1

Gerade falls Sie nicht bekommen, hier zu beantworten, versuchen auch die Setuptools-Mailingliste: https://mail.python.org/pipermail/distutils-sig/ –

+0

Diese Antwort wurde etwas verwandt gefunden, erwähnt MSVC distutils Compiler: http://stackoverflow.com/questions/36212494/get-the-commands-distutils-passe-to-the-compiler/36710903#36710903 –

+0

Die Frage ist auch auf der Mailing-Liste verfügbar: https://mail.python.org/pipermail/distutils-sig/2017-March/030211.html – xoolive

Antwort

-1

Der Code ist nicht getestet, aber man kann versuchen:

from setuptools import setup 
from Cython.Distutils import build_ext as _build_ext 
# To modify regular setuptools extension: 
# from setuptools.command.build_ext import build_ext as _build_ext 

class build_ext(_build_ext): 
    def build_extension(self, ext): 
     self.compiler.linker = "mylinker.exe" 
     return super(build_ext, self).build_extension(ext) 

setup(
    cmdclass={'build_ext': build_ext}, 
    ... 
) 
Verwandte Themen