禁用 distutils 扩展的 link 步骤

Disable link step of distutils Extension

是否可以使用 distutils.core.Extension 禁用共享对象的创建?我想在 linking(即 g++ -c ...)之前停止编译器。

我正在使用一个本地文件,它创建一个目标文件和一个 python 文件。我还有其他代码要编译,稍后我将 link 使用此目标文件,因此我不希望在 .o 编译后继续进行此操作。

$ python setup.py build
running build
....
building 'foo' extension
swigging src/foobar.i to src/foobar.cpp
swig -python -c++ -o src/foobar.cpp src/foobar.i

我想就此打住,但它还在继续。

creating build/temp.linux-x86_64-2.7
creating build/temp.linux-x86_64-2.7/src
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -Isrc -I/usr/include/python2.7 -c src/foobar.cpp -o build/temp.linux-x86_64-2.7/src/foobar.o
g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro build/temp.linux-x86_64-2.7/src/foobar.o -o build/lib.linux-x86_64-2.7/foobar.so

我需要直接使用 CCompiler class 吗?或者有没有办法解决 Extension class?

23     ext_modules=[
24         # Swig
25         Extension(
26             name='foobar',
27             sources=['src/foobar.i'],
28             include_dirs=['src'],
29             swig_opts=['-c++'],
30         ),
31     ]

如果不修改底层 ccompiler object. One could theoretically override the link_shared_object function of the underlying ccompiler to do nothing (See the build_ext source),则无法停止 linking 步骤。

不过,要回答这个问题背后的初衷,C/C++文件可以通过Swig接口文件传递给Extension,而不需要单独编译它们,link稍后。 swig文件生成和库编译没有必要分开。

你可以这样做:

from distutils.command import build_ext

def cmd_ex(command_subclass):
    orig_ext = command_subclass.build_extension

    def build_ext(self, ext):
        sources = self.swig_sources(list(ext.sources), ext)

    command_subclass.build_extension = build_ext
    return command_subclass

@cmd_ex
class build_ext_ex(build_ext):
    pass

setup(
    name = ...,
    cmdclass = {'build_ext': build_ext_ex},
    ext_modules = ...
)

覆盖 distutils 命令的默认行为。

Setuptools – run custom code in setup.py