ninjabackend: Add support for installing .pdb files

.pdb files are files created by MSVC which have debug symbols. These are
created when /ZI or /Zi is passed to the compiler and /DEBUG to the
linker.
pull/684/head
Nirbheek Chauhan 9 years ago
parent 4228a6dab6
commit 0840a908f2
  1. 6
      mesonbuild/backend/backends.py
  2. 7
      mesonbuild/backend/ninjabackend.py
  3. 37
      mesonbuild/build.py

@ -118,6 +118,12 @@ class Backend():
return os.path.join(self.get_target_dir(target), target.get_filename()) return os.path.join(self.get_target_dir(target), target.get_filename())
raise AssertionError('BUG: Tried to link to something that\'s not a library') raise AssertionError('BUG: Tried to link to something that\'s not a library')
def get_target_debug_filename(self, target):
fname = target.get_debug_filename()
if not fname:
raise AssertionError("BUG: Tried to generate debug filename when it doesn't exist")
return os.path.join(self.get_target_dir(target), fname)
def get_target_dir(self, target): def get_target_dir(self, target):
if self.environment.coredata.get_builtin_option('layout') == 'mirror': if self.environment.coredata.get_builtin_option('layout') == 'mirror':
dirname = target.get_subdir() dirname = target.get_subdir()

@ -523,6 +523,13 @@ int dummy;
else: else:
# XXX: Add BuildTarget-specific install dir cases here # XXX: Add BuildTarget-specific install dir cases here
outdir = self.environment.get_libdir() outdir = self.environment.get_libdir()
if isinstance(t, build.SharedLibrary) or isinstance(t, build.Executable):
if t.get_debug_filename():
# Install the debug symbols file in the same place as
# the target itself. It has no aliases, should not be
# stripped, and doesn't have an install_rpath
i = [self.get_target_debug_filename(t), outdir, [], False, '']
d.targets.append(i)
i = [self.get_target_filename(t), outdir, t.get_aliaslist(),\ i = [self.get_target_filename(t), outdir, t.get_aliaslist(),\
should_strip, t.install_rpath] should_strip, t.install_rpath]
d.targets.append(i) d.targets.append(i)

@ -205,6 +205,8 @@ class BuildTarget():
self.link_targets = [] self.link_targets = []
self.link_depends = [] self.link_depends = []
self.filename = 'no_name' self.filename = 'no_name'
# The file with debugging symbols
self.debug_filename = None
self.need_install = False self.need_install = False
self.pch = {} self.pch = {}
self.extra_args = {} self.extra_args = {}
@ -466,6 +468,15 @@ class BuildTarget():
def get_filename(self): def get_filename(self):
return self.filename return self.filename
def get_debug_filename(self):
"""
The name of the file that contains debugging symbols for this target
Returns None if there are no debugging symbols or if they are embedded
in the filename itself
"""
return self.debug_filename
def get_extra_args(self, language): def get_extra_args(self, language):
return self.extra_args.get(language, []) return self.extra_args.get(language, [])
@ -708,6 +719,11 @@ class Executable(BuildTarget):
self.filename = self.name self.filename = self.name
if self.suffix: if self.suffix:
self.filename += '.' + self.suffix self.filename += '.' + self.suffix
# See determine_debug_filenames() in build.SharedLibrary
buildtype = environment.coredata.get_builtin_option('buildtype')
if compiler_is_msvc(self.sources, is_cross, environment) and \
buildtype.startswith('debug'):
self.debug_filename = self.prefix + self.name + '.pdb'
def type_suffix(self): def type_suffix(self):
return "@exe" return "@exe"
@ -733,6 +749,11 @@ class StaticLibrary(BuildTarget):
else: else:
self.suffix = 'a' self.suffix = 'a'
self.filename = self.prefix + self.name + '.' + self.suffix self.filename = self.prefix + self.name + '.' + self.suffix
# See determine_debug_filenames() in build.SharedLibrary
buildtype = environment.coredata.get_builtin_option('buildtype')
if compiler_is_msvc(self.sources, is_cross, environment) and \
buildtype.startswith('debug'):
self.debug_filename = self.prefix + self.name + '.pdb'
def type_suffix(self): def type_suffix(self):
return "@sta" return "@sta"
@ -755,6 +776,7 @@ class SharedLibrary(BuildTarget):
self.suffix = None self.suffix = None
self.basic_filename_tpl = '{0.prefix}{0.name}.{0.suffix}' self.basic_filename_tpl = '{0.prefix}{0.name}.{0.suffix}'
self.determine_filenames(is_cross, environment) self.determine_filenames(is_cross, environment)
self.determine_debug_filenames(is_cross, environment)
def determine_filenames(self, is_cross, env): def determine_filenames(self, is_cross, env):
""" """
@ -846,6 +868,21 @@ class SharedLibrary(BuildTarget):
self.suffix = suffix self.suffix = suffix
self.filename = self.filename_tpl.format(self) self.filename = self.filename_tpl.format(self)
def determine_debug_filenames(self, is_cross, env):
"""
Determine the debug filename(s) using the prefix/name/etc detected in
determine_filenames() above.
"""
buildtype = env.coredata.get_builtin_option('buildtype')
if compiler_is_msvc(self.sources, is_cross, env) and buildtype.startswith('debug'):
# Currently we only implement separate debug symbol files for MSVC
# since the toolchain does it for us. Other toolchains embed the
# debugging symbols in the file itself by default.
if self.soversion:
self.debug_filename = '{0.prefix}{0.name}-{0.soversion}.pdb'.format(self)
else:
self.debug_filename = '{0.prefix}{0.name}.pdb'.format(self)
def process_kwargs(self, kwargs, environment): def process_kwargs(self, kwargs, environment):
super().process_kwargs(kwargs, environment) super().process_kwargs(kwargs, environment)
# Shared library version # Shared library version

Loading…
Cancel
Save