如何在setuptools构建过程(msvc)中更改链接命令?

时间:2017-02-28 21:48:21

标签: python numpy visual-studio-2015 cython distutils

我维护一些Cyam绑定到一些OCaml代码(通过它们各自的C接口)。对于过去的版本,我设法通过交叉编译来欺骗和分发Windows的wheel文件。现在,我终于以一种干净的本地方式来生成用于Windows 64位的库。

对于32位交叉编译版本,我在setup.py中有一个具有正确命令的特定目标。回到Windows,我想坚持 setuptoolsic 的做法,但问题是我需要用不同的工具替换常规链接命令link.exe(分别为{{1在Windows上附带OCaml)

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

对于MacOS和Linux,传统的link.exe模式的工作方式如下所示(Extension由OCaml在文件中稍早一些时间戳检查后产生,mlobject是相当于OCaml的asmrunlib的完整路径:

python36.dll

假设我将自己限制为Python> = 3.5,我猜(通过与NumPy这样的大项目进行比较)我需要首先扩展extensions = [ Extension("foo", ["foo.pyx", "interface_c.c"], language="c", include_dirs=INCLUDE, extra_compile_args=compileargs, extra_link_args=[mlobject, asmrunlib, ] ) ] 并将distutils._msvccompiler.MSVCCompiler替换为基于self.linker = _find_exe("link.exe", paths)

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

我的flexlink.exe仍然是相当基本的,并且将整个建筑/包装过程保持在一个文件中的解决方案将非常棒!

1 个答案:

答案 0 :(得分:-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},
    ...
)