diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index fa537adca..fe3be4ce1 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -329,13 +329,14 @@ int dummy; generated_source_files = [] for rel_src, gensrc in generated_sources.items(): generated_output_sources.append(rel_src) + raw_src = RawFilename(rel_src) if self.environment.is_source(rel_src) and not self.environment.is_header(rel_src): if is_unity: - unity_deps.append(rel_src) + unity_deps.append(raw_src) abs_src = os.path.join(self.environment.get_build_dir(), rel_src) unity_src.append(abs_src) else: - generated_source_files.append(RawFilename(rel_src)) + generated_source_files.append(raw_src) elif self.environment.is_object(rel_src): obj_list.append(rel_src) elif self.environment.is_library(rel_src): @@ -344,7 +345,7 @@ int dummy; # Assume anything not specifically a source file is a header. This is because # people generate files with weird suffixes (.inc, .fh) that they then include # in their source files. - header_deps.append(RawFilename(rel_src)) + header_deps.append(raw_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. @@ -356,10 +357,11 @@ int dummy; # sources. This can be extended to other $LANG->C compilers later if # necessary. This needs to be separate for at least Vala for src in vala_generated_sources: + raw_src = RawFilename(src) src_list.append(src) if is_unity: unity_src.append(os.path.join(self.environment.get_build_dir(), src)) - header_deps.append(src) + header_deps.append(raw_src) else: # Generated targets are ordered deps because the must exist # before the sources compiling them are used. After the first @@ -367,12 +369,12 @@ int dummy; # This should work in all cases. If it does not, then just # move them from orderdeps to proper deps. if self.environment.is_header(src): - header_deps.append(src) + header_deps.append(raw_src) else: # Passing 'vala' here signifies that we want the compile # arguments to be specialized for C code generated by # valac. For instance, no warnings should be emitted. - obj_list.append(self.generate_single_compile(target, outfile, src, 'vala', [], header_deps)) + obj_list.append(self.generate_single_compile(target, outfile, raw_src, 'vala', [], header_deps)) # Generate compile targets for all the pre-existing sources for this target for f, src in target_sources.items(): if not self.environment.is_header(src): @@ -386,7 +388,7 @@ int dummy; obj_list += self.flatten_object_list(target) if is_unity: 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, RawFilename(src), True, unity_deps + header_deps)) linker = self.determine_linker(target, src_list + generated_output_sources) elem = self.generate_link(target, outfile, outname, obj_list, linker, pch_objects) self.generate_shlib_aliases(target, self.get_target_dir(target)) @@ -1670,10 +1672,10 @@ rule FORTRAN_DEP_HACK """ Compiles only C/C++ and ObjC/ObjC++ sources """ - if(isinstance(src, str) and src.endswith('.h')): - raise RuntimeError('Fug') + if isinstance(src, str) and src.endswith('.h'): + raise AssertionError('BUG: sources should not contain headers') if isinstance(src, RawFilename) and src.fname.endswith('.h'): - raise RuntimeError('Fug') + raise AssertionError('BUG: sources should not contain headers') extra_orderdeps = [] compiler = self.get_compiler_for_source(src, target.is_cross) commands = [] @@ -1716,12 +1718,12 @@ rule FORTRAN_DEP_HACK break if isinstance(src, RawFilename): rel_src = src.fname - elif is_generated: - if self.has_dir_part(src): - rel_src = src + if os.path.isabs(src.fname): + abs_src = src.fname else: - rel_src = os.path.join(self.get_target_private_dir(target), src) - abs_src = os.path.join(self.environment.get_source_dir(), rel_src) + abs_src = os.path.join(self.environment.get_build_dir(), src.fname) + elif is_generated: + raise AssertionError('BUG: broken generated source file handling for {!r}'.format(src)) else: if isinstance(src, File): rel_src = src.rel_to_builddir(self.build_to_src) @@ -1805,6 +1807,7 @@ rule FORTRAN_DEP_HACK return rel_obj def has_dir_part(self, fname): + # FIXME FIXME: The usage of this is a terrible and unreliable hack return '/' in fname or '\\' in fname # Fortran is a bit weird (again). When you link against a library, just compiling a source file