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