ninja: Fix header deps of generated source compiles
Because we were iterating over all generated sources of a target in one go, we weren't adding the correct header_deps for generated source compiles. We need to aggregate the header_deps first before generating source compile targets for generated source files.
This commit is contained in:
parent
ca507cdcdf
commit
cfbffc6ba1
|
@ -270,18 +270,25 @@ int dummy;
|
||||||
unity_src = []
|
unity_src = []
|
||||||
unity_deps = [] # Generated sources that must be built before compiling a Unity target.
|
unity_deps = [] # Generated sources that must be built before compiling a Unity target.
|
||||||
header_deps += self.get_generated_headers(target)
|
header_deps += self.get_generated_headers(target)
|
||||||
generator_output_sources = [] # Needed to determine the linker
|
|
||||||
|
# Get a list of all generated *sources* (sources files, headers,
|
||||||
|
# objects, etc). Needed to determine the linker.
|
||||||
|
generated_output_sources = []
|
||||||
|
# Get a list of all generated headers that will be needed while building
|
||||||
|
# this target's sources (generated sources and pre-existing sources).
|
||||||
|
# This will be set as dependencies of all the target's sources. At the
|
||||||
|
# same time, also deal with generated sources that need to be compiled.
|
||||||
|
generated_source_files = []
|
||||||
for gensource in target.get_generated_sources():
|
for gensource in target.get_generated_sources():
|
||||||
if isinstance(gensource, build.CustomTarget):
|
if isinstance(gensource, build.CustomTarget):
|
||||||
for src in gensource.output:
|
for src in gensource.output:
|
||||||
src = os.path.join(self.get_target_dir(gensource), src)
|
src = os.path.join(self.get_target_dir(gensource), src)
|
||||||
generator_output_sources.append(src)
|
generated_output_sources.append(src)
|
||||||
if self.environment.is_source(src) and not self.environment.is_header(src):
|
if self.environment.is_source(src) and not self.environment.is_header(src):
|
||||||
if is_unity:
|
if is_unity:
|
||||||
unity_deps.append(os.path.join(self.environment.get_build_dir(), RawFilename(src)))
|
unity_deps.append(os.path.join(self.environment.get_build_dir(), RawFilename(src)))
|
||||||
else:
|
else:
|
||||||
obj_list.append(self.generate_single_compile(target, outfile, RawFilename(src), True,
|
generated_source_files.append(RawFilename(src))
|
||||||
header_deps))
|
|
||||||
elif self.environment.is_object(src):
|
elif self.environment.is_object(src):
|
||||||
obj_list.append(src)
|
obj_list.append(src)
|
||||||
elif self.environment.is_library(src):
|
elif self.environment.is_library(src):
|
||||||
|
@ -293,7 +300,7 @@ int dummy;
|
||||||
header_deps.append(RawFilename(src))
|
header_deps.append(RawFilename(src))
|
||||||
else:
|
else:
|
||||||
for src in gensource.get_outfilelist():
|
for src in gensource.get_outfilelist():
|
||||||
generator_output_sources.append(src)
|
generated_output_sources.append(src)
|
||||||
if self.environment.is_object(src):
|
if self.environment.is_object(src):
|
||||||
obj_list.append(os.path.join(self.get_target_private_dir(target), src))
|
obj_list.append(os.path.join(self.get_target_private_dir(target), src))
|
||||||
elif not self.environment.is_header(src):
|
elif not self.environment.is_header(src):
|
||||||
|
@ -306,8 +313,15 @@ int dummy;
|
||||||
abs_src = os.path.join(self.environment.get_build_dir(), rel_src)
|
abs_src = os.path.join(self.environment.get_build_dir(), rel_src)
|
||||||
unity_src.append(abs_src)
|
unity_src.append(abs_src)
|
||||||
else:
|
else:
|
||||||
|
generated_source_files.append(src)
|
||||||
|
# These are the generated source files that need to be built for use by
|
||||||
|
# this target. We create the Ninja build file elements for this here
|
||||||
|
# because we need `header_deps` to be fully generated in the above loop.
|
||||||
|
for src in generated_source_files:
|
||||||
obj_list.append(self.generate_single_compile(target, outfile, src, True,
|
obj_list.append(self.generate_single_compile(target, outfile, src, True,
|
||||||
header_deps=header_deps))
|
header_deps=header_deps))
|
||||||
|
# Generate compilation targets for sources belonging to this target that
|
||||||
|
# are generated by other rules (this is only used for Vala right now)
|
||||||
src_list = []
|
src_list = []
|
||||||
for src in gen_src_deps:
|
for src in gen_src_deps:
|
||||||
src_list.append(src)
|
src_list.append(src)
|
||||||
|
@ -324,6 +338,7 @@ int dummy;
|
||||||
header_deps.append(src)
|
header_deps.append(src)
|
||||||
else:
|
else:
|
||||||
obj_list.append(self.generate_single_compile(target, outfile, src, True, [], header_deps))
|
obj_list.append(self.generate_single_compile(target, outfile, src, True, [], header_deps))
|
||||||
|
# Generate compile targets for all the pre-existing sources for this target
|
||||||
for src in target.get_sources():
|
for src in target.get_sources():
|
||||||
if src.endswith('.vala'):
|
if src.endswith('.vala'):
|
||||||
continue
|
continue
|
||||||
|
@ -339,7 +354,7 @@ int dummy;
|
||||||
if is_unity:
|
if is_unity:
|
||||||
for src in self.generate_unity_files(target, unity_src):
|
for src in self.generate_unity_files(target, unity_src):
|
||||||
obj_list.append(self.generate_single_compile(target, outfile, src, True, unity_deps + header_deps))
|
obj_list.append(self.generate_single_compile(target, outfile, src, True, unity_deps + header_deps))
|
||||||
linker = self.determine_linker(target, src_list + generator_output_sources)
|
linker = self.determine_linker(target, src_list + generated_output_sources)
|
||||||
elem = self.generate_link(target, outfile, outname, obj_list, linker, pch_objects)
|
elem = self.generate_link(target, outfile, outname, obj_list, linker, pch_objects)
|
||||||
self.generate_shlib_aliases(target, self.get_target_dir(target))
|
self.generate_shlib_aliases(target, self.get_target_dir(target))
|
||||||
elem.write(outfile)
|
elem.write(outfile)
|
||||||
|
|
Loading…
Reference in New Issue