我维护一些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
仍然是相当基本的,并且将整个建筑/包装过程保持在一个文件中的解决方案将非常棒!
答案 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},
...
)