Add the object file generated by MSVS pch compilation to the link command line as it is apparently required on some versions.

pull/15/head
Jussi Pakkanen 10 years ago
parent 64b01354fb
commit 21fb06087f
  1. 3
      environment.py
  2. 24
      ninjabackend.py

@ -890,7 +890,8 @@ class VisualStudioCCompiler(CCompiler):
return ['/DLL'] return ['/DLL']
def gen_pch_args(self, header, source, pchname): def gen_pch_args(self, header, source, pchname):
return ['/Yc' + header, '/Fp' + pchname] objname = os.path.splitext(pchname)[0] + '.obj'
return (objname, ['/Yc' + header, '/Fp' + pchname, '/Fo' + objname ])
def sanity_check(self, work_dir): def sanity_check(self, work_dir):
source_name = os.path.join(work_dir, 'sanitycheckc.c') source_name = os.path.join(work_dir, 'sanitycheckc.c')

@ -177,7 +177,9 @@ class NinjaBackend(backends.Backend):
use_pch = self.environment.coredata.use_pch use_pch = self.environment.coredata.use_pch
is_unity = self.environment.coredata.unity is_unity = self.environment.coredata.unity
if use_pch and target.has_pch(): if use_pch and target.has_pch():
self.generate_pch(target, outfile) pch_objects = self.generate_pch(target, outfile)
else:
pch_objects = []
header_deps = gen_other_deps header_deps = gen_other_deps
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.
@ -241,7 +243,7 @@ class NinjaBackend(backends.Backend):
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) linker = self.determine_linker(target, src_list)
# Sort object list to preserve command line over multiple invocations. # Sort object list to preserve command line over multiple invocations.
elem = self.generate_link(target, outfile, outname, sorted(obj_list), linker) elem = self.generate_link(target, outfile, outname, sorted(obj_list), linker, pch_objects)
self.generate_shlib_aliases(target, self.get_target_dir(target), outfile, elem) self.generate_shlib_aliases(target, self.get_target_dir(target), outfile, elem)
self.processed_targets[name] = True self.processed_targets[name] = True
@ -1105,10 +1107,10 @@ class NinjaBackend(backends.Backend):
commands = [] commands = []
commands += self.generate_basic_compiler_args(target, compiler) commands += self.generate_basic_compiler_args(target, compiler)
just_name = os.path.split(header)[1] just_name = os.path.split(header)[1]
commands += compiler.gen_pch_args(just_name, source, dst) (objname, pch_args) = compiler.gen_pch_args(just_name, source, dst)
commands += pch_args
dep = dst + '.' + compiler.get_depfile_suffix() dep = dst + '.' + compiler.get_depfile_suffix()
return (commands, dep, dst) return (commands, dep, dst, [objname])
def generate_gcc_pch_command(self, target, compiler, pch): def generate_gcc_pch_command(self, target, compiler, pch):
commands = [] commands = []
@ -1116,10 +1118,11 @@ class NinjaBackend(backends.Backend):
dst = os.path.join(self.get_target_private_dir(target), dst = os.path.join(self.get_target_private_dir(target),
os.path.split(pch)[-1] + '.' + compiler.get_pch_suffix()) os.path.split(pch)[-1] + '.' + compiler.get_pch_suffix())
dep = dst + '.' + compiler.get_depfile_suffix() dep = dst + '.' + compiler.get_depfile_suffix()
return (commands, dep, dst) return (commands, dep, dst, []) # Gcc does not create an object file during pch generation.
def generate_pch(self, target, outfile): def generate_pch(self, target, outfile):
cstr = '' cstr = ''
pch_objects = []
if target.is_cross: if target.is_cross:
cstr = '_CROSS' cstr = '_CROSS'
for lang in ['c', 'cpp']: for lang in ['c', 'cpp']:
@ -1131,12 +1134,13 @@ class NinjaBackend(backends.Backend):
compiler = self.get_compiler_for_lang(lang) compiler = self.get_compiler_for_lang(lang)
if compiler.id == 'msvc': if compiler.id == 'msvc':
src = os.path.join(self.build_to_src, target.get_source_subdir(), pch[-1]) src = os.path.join(self.build_to_src, target.get_source_subdir(), pch[-1])
(commands, dep, dst) = self.generate_msvc_pch_command(target, compiler, pch) (commands, dep, dst, objs) = self.generate_msvc_pch_command(target, compiler, pch)
extradep = os.path.join(self.build_to_src, target.get_source_subdir(), pch[0]) extradep = os.path.join(self.build_to_src, target.get_source_subdir(), pch[0])
else: else:
src = os.path.join(self.build_to_src, target.get_source_subdir(), pch[0]) src = os.path.join(self.build_to_src, target.get_source_subdir(), pch[0])
(commands, dep, dst) = self.generate_gcc_pch_command(target, compiler, pch[0]) (commands, dep, dst, objs) = self.generate_gcc_pch_command(target, compiler, pch[0])
extradep = None extradep = None
pch_objects += objs
rulename = compiler.get_language() + cstr + '_PCH' rulename = compiler.get_language() + cstr + '_PCH'
elem = NinjaBuildElement(dst, rulename, src) elem = NinjaBuildElement(dst, rulename, src)
if extradep is not None: if extradep is not None:
@ -1144,6 +1148,7 @@ class NinjaBackend(backends.Backend):
elem.add_item('ARGS', commands) elem.add_item('ARGS', commands)
elem.add_item('DEPFILE', dep) elem.add_item('DEPFILE', dep)
elem.write(outfile) elem.write(outfile)
return pch_objects
def generate_shsym(self, outfile, target): def generate_shsym(self, outfile, target):
target_name = self.get_target_filename(target) target_name = self.get_target_filename(target)
@ -1154,7 +1159,7 @@ class NinjaBackend(backends.Backend):
elem.add_item('CROSS', '--cross-host=' + self.environment.cross_info['name']) elem.add_item('CROSS', '--cross-host=' + self.environment.cross_info['name'])
elem.write(outfile) elem.write(outfile)
def generate_link(self, target, outfile, outname, obj_list, linker): def generate_link(self, target, outfile, outname, obj_list, linker, extra_args=[]):
if isinstance(target, build.StaticLibrary): if isinstance(target, build.StaticLibrary):
linker_base = 'STATIC' linker_base = 'STATIC'
else: else:
@ -1196,6 +1201,7 @@ class NinjaBackend(backends.Backend):
target.get_rpaths(), target.install_rpath) target.get_rpaths(), target.install_rpath)
if self.environment.coredata.coverage: if self.environment.coredata.coverage:
commands += linker.get_coverage_link_args() commands += linker.get_coverage_link_args()
commands += extra_args
dep_targets = [self.get_dependency_filename(t) for t in dependencies] dep_targets = [self.get_dependency_filename(t) for t in dependencies]
dep_targets += [os.path.join(self.environment.source_dir, dep_targets += [os.path.join(self.environment.source_dir,
target.subdir, t) for t in target.link_depends] target.subdir, t) for t in target.link_depends]

Loading…
Cancel
Save