mirror of https://github.com/python/cpython
Fixed #5372: .o files are now always rebuilt because file age test don't work in some case
This commit is contained in:
parent
102d70e06c
commit
dc0f487c3b
|
@ -337,10 +337,7 @@ class CCompiler:
|
||||||
|
|
||||||
def _setup_compile(self, outdir, macros, incdirs, sources, depends,
|
def _setup_compile(self, outdir, macros, incdirs, sources, depends,
|
||||||
extra):
|
extra):
|
||||||
"""Process arguments and decide which source files to compile.
|
"""Process arguments and decide which source files to compile."""
|
||||||
|
|
||||||
Merges _fix_compile_args() and _prep_compile().
|
|
||||||
"""
|
|
||||||
if outdir is None:
|
if outdir is None:
|
||||||
outdir = self.output_dir
|
outdir = self.output_dir
|
||||||
elif not isinstance(outdir, str):
|
elif not isinstance(outdir, str):
|
||||||
|
@ -370,41 +367,6 @@ class CCompiler:
|
||||||
output_dir=outdir)
|
output_dir=outdir)
|
||||||
assert len(objects) == len(sources)
|
assert len(objects) == len(sources)
|
||||||
|
|
||||||
# XXX should redo this code to eliminate skip_source entirely.
|
|
||||||
# XXX instead create build and issue skip messages inline
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
pp_opts = gen_preprocess_options(macros, incdirs)
|
pp_opts = gen_preprocess_options(macros, incdirs)
|
||||||
|
|
||||||
build = {}
|
build = {}
|
||||||
|
@ -413,10 +375,7 @@ class CCompiler:
|
||||||
obj = objects[i]
|
obj = objects[i]
|
||||||
ext = os.path.splitext(src)[1]
|
ext = os.path.splitext(src)[1]
|
||||||
self.mkpath(os.path.dirname(obj))
|
self.mkpath(os.path.dirname(obj))
|
||||||
if skip_source[src]:
|
build[obj] = (src, ext)
|
||||||
log.debug("skipping %s (%s up-to-date)", src, obj)
|
|
||||||
else:
|
|
||||||
build[obj] = src, ext
|
|
||||||
|
|
||||||
return macros, objects, extra, pp_opts, build
|
return macros, objects, extra, pp_opts, build
|
||||||
|
|
||||||
|
@ -463,56 +422,6 @@ class CCompiler:
|
||||||
|
|
||||||
# _fix_compile_args ()
|
# _fix_compile_args ()
|
||||||
|
|
||||||
|
|
||||||
def _prep_compile(self, sources, output_dir, depends=None):
|
|
||||||
"""Decide which souce files must be recompiled.
|
|
||||||
|
|
||||||
Determine the list of object files corresponding to 'sources',
|
|
||||||
and figure out which ones really need to be recompiled.
|
|
||||||
Return a list of all object files and a dictionary telling
|
|
||||||
which source files can be skipped.
|
|
||||||
"""
|
|
||||||
# Get the list of expected output (object) files
|
|
||||||
objects = self.object_filenames(sources, output_dir=output_dir)
|
|
||||||
assert len(objects) == len(sources)
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
return objects, skip_source
|
|
||||||
|
|
||||||
# _prep_compile ()
|
|
||||||
|
|
||||||
|
|
||||||
def _fix_object_args (self, objects, output_dir):
|
def _fix_object_args (self, objects, output_dir):
|
||||||
"""Typecheck and fix up some arguments supplied to various methods.
|
"""Typecheck and fix up some arguments supplied to various methods.
|
||||||
Specifically: ensure that 'objects' is a list; if output_dir is
|
Specifically: ensure that 'objects' is a list; if output_dir is
|
||||||
|
@ -679,7 +588,6 @@ class CCompiler:
|
||||||
|
|
||||||
Raises CompileError on failure.
|
Raises CompileError on failure.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# A concrete compiler class can either override this method
|
# A concrete compiler class can either override this method
|
||||||
# entirely or implement _compile().
|
# entirely or implement _compile().
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,10 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #5372: Drop the reuse of .o files in Distutils' ccompiler (since
|
||||||
|
Extension extra options may change the output without changing the .c
|
||||||
|
file). Initial patch by Collin Winter.
|
||||||
|
|
||||||
|
|
||||||
What's New in Python 2.7 alpha 2?
|
What's New in Python 2.7 alpha 2?
|
||||||
=================================
|
=================================
|
||||||
|
|
Loading…
Reference in New Issue