擅长:python、mysql、java
<p>已经5年了,但我找到了一个比我的“CC”包装更喜欢的解决方案</p>
<p>“build_ext”命令创建一个self.compiler实例。compile.compile()方法获取要编译的所有源文件的列表。基类进行一些设置,然后有一个编译器。_compile()钩子用于具体的编译器子类,以实现实际的每个文件编译步骤</p>
<p>我觉得这是足够稳定的,我可以拦截代码在那一点上</p>
<p>我从distutils.command.build\u ext.build\u ext派生了一个新命令,该命令调整了self.compiler.\u compile以包装绑定类方法,并将一个一次性函数附加到实例:</p>
<pre><code>class build_ext_subclass(build_ext):
def build_extensions(self):
original__compile = self.compiler._compile
def new__compile(obj, src, ext, cc_args, extra_postargs, pp_opts):
if src != "src/popcount_SSSE3.c":
extra_postargs = [s for s in extra_postargs if s != "-mssse3"]
return original__compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
self.compiler._compile = new__compile
try:
build_ext.build_extensions(self)
finally:
del self.compiler._compile
</code></pre>
<p>然后,我告诉setup()使用以下命令类:</p>
<pre><code>setup(
...
cmdclass = {"build_ext": build_ext_subclass}
)
</code></pre>