是否可以使用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 ]
答案 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命令的默认行为。