Fixed #5372: .o files are now always rebuilt because file age test don't work in some case

This commit is contained in:
Tarek Ziadé 2010-01-11 22:50:29 +00:00
parent 102d70e06c
commit dc0f487c3b
2 changed files with 6 additions and 94 deletions

View File

@ -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().

View File

@ -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?
================================= =================================