禁用distutils Extension的链接步骤

时间:2017-09-18 17:26:37

标签: python swig distutils

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

我正在调用一个原生文件,它会创建一个目标文件和一个python文件。我还有其他代码要编译,我稍后会链接到这个目标文件,所以我不想在.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类?或者有没有办法纠缠Extension类?

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     ]

2 个答案:

答案 0 :(得分:0)

如果不修改基础ccompiler对象,则无法停止链接步骤。从理论上讲,理论上可以覆盖基础link_shared_object的{​​{1}}函数,不执行任何操作(请参阅ccompiler source)。

但是,为了回答这个问题背后的原始意图,可以使用Swig接口文件将C / C ++文件传递给Extension,而无需单独编译它们并在以后链接。没有必要将swig文件生成和库编译分开。

答案 1 :(得分:0)

您可以执行以下操作:

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