[英]Python distutils builds extensions differently on different machines
我一直在研究带有许多文件的Python扩展模块。 在一台机器上python setup.py build
时, python setup.py build
会很高兴地检测到更改的文件,仅构建那些文件,并将整个对象链接在一起,就像make一样。 但是,在另一台计算机上,对任何文件的单个更改将触发所有源的重新编译。
只是要清楚。 两台机器都会检测包装何时更新,并且什么也不做。 仅当单个文件更改时,它们的行为才会发生变化。
为什么第二台机器这样做?
Python 2.6.4 (r264:75706, Feb 15 2010, 17:06:03)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
setuptools-0.6c11-py2.6
LSB Version: :core-3.1-amd64:core-3.1-ia32:core-3.1-noarch:graphics-3.1-amd64:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5.4 (Final)
Release: 5.4
Codename: Final
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
setuptools-0.6c11-py2.6
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 10.04 LTS
Release: 10.04
Codename: lucid
我调查了Mercurial仓库,发现了这一变化:
问题#5372 :在Distutils的ccompiler中删除.o文件的重用(因为Extension的附加选项可能会在不更改.c文件的情况下更改输出)。
IOW,这是一个简单的优化,已被删除。
我已经将此归结为Python 2.6.4和Python 2.6.5之间的distutils发生了变化。 distutils.ccompiler.CCompiler
两个方法_setup_compile
和_prep_compile
删除了相同的代码块:
if self.force:
skip_source = {} # rebuild everything
for source in sources:
skip_source[source] = 0
elif depends is None:
# If depends is None, figure out which source files we
# have to recompile according to a simplistic check. We
# just compare the source and object file, no deep
# dependency checking involving header files.
skip_source = {} # rebuild everything
for source in sources: # no wait, rebuild nothing
skip_source[source] = 1
n_sources, n_objects = newer_pairwise(sources, objects)
for source in n_sources: # no really, only rebuild what's
skip_source[source] = 0 # out-of-date
else:
# If depends is a list of files, then do a different
# simplistic check. Assume that each object depends on
# its source and all files in the depends list.
skip_source = {}
# L contains all the depends plus a spot at the end for a
# particular source file
L = depends[:] + [None]
for i in range(len(objects)):
source = sources[i]
L[-1] = source
if newer_group(L, objects[i]):
skip_source[source] = 0
else:
skip_source[source] = 1
此代码对照其目标对象检查每个源文件,如果它比目标文件旧,则将其标记为跳过。 我不知道为什么要删除它,但是它解释了差异。 当我将其放回测试中时,编译器将还原为按源进行依赖关系分析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.