2017-02-28 41 views
1

我维护一个Cython绑定到一些OCaml代码(通过他们各自的C接口)。对于以前的版本,我设法通过交叉编译为Windows分发轮盘文件。现在,我最终管理一个干净的本地方式来生成Windows 64位库。如何更改setuptools构建过程(msvc)中的链接命令?

对于32位交叉编译版本,我在我的setup.py中有一个特定的目标,并带有正确的命令来执行。返回在Windows上,我想坚持做的setuptoolsic方式,但事情是我需要用不同的工具来取代常规的链接命令link.exe(RESP。flexlink.exe,与OCaml的附带在Windows上)

不要惊慌:flexlink.exe只是在编译和连接正常的link.exe之前编译一些汇编程序狗屎。这是在Windows下链接OCaml可执行文件和共享库的正确方式。

为MacOS和Linux,传统Extension图案就像一个魅力如下(mlobject由OCaml的一些时间戳检查后产生的文件中前面一点,asmrunlib是的python36.dll为OCaml的等效的完整路径):

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

比方说,我限制自己的Python> = 3.5,我想(通过与像NumPy这样过大的项目比较),我需要通过扩展distutils._msvccompiler.MSVCCompiler启动和基于flexlink.exe东西代替self.linker = _find_exe("link.exe", paths)

问题是,我不知道他们如何管理接下来的管道工作(连接此扩展编译器,并使其看起来像正常的msvc到安装过程)。我认为它在任何地方都没有完整的记录,如果他们能够做的比NumPy更多,我应该能够以某种方式达到我的目标。

我的setup.py仍然是合理的基础,并且将整个建筑/包装过程保存在一个单一文件中的解决方案将非常棒!

+1

万一你没有得到回答在这里,也尝试setuptools的邮件列表:https://mail.python.org/pipermail/distutils-sig/ –

+0

发现这个答案有点相关,提到MSVC distutils编译器:http://stackoverflow.com/questions/36212494/get-the-commands-distutils-passes-to-the-compiler/36710903#36710903 –

+0

问题也可以在邮件列表上找到:https://mail.python.org/pipermail/distutils-sig/2017-March/030211.html – xoolive

回答

-1

的代码没有进行测试,但你可以尝试:

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}, 
    ... 
)