From 0840a908f235ac3a4df271e2cd262cad0cfc5cbd Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 9 May 2016 17:11:45 +0530 Subject: [PATCH] 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. --- mesonbuild/backend/backends.py | 6 +++++ mesonbuild/backend/ninjabackend.py | 7 ++++++ mesonbuild/build.py | 37 ++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index 1f1c3ca01..81283dc80 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -118,6 +118,12 @@ class Backend(): 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') + 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): if self.environment.coredata.get_builtin_option('layout') == 'mirror': dirname = target.get_subdir() diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 28667b795..e00fe2f8f 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -523,6 +523,13 @@ int dummy; else: # XXX: Add BuildTarget-specific install dir cases here 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(),\ should_strip, t.install_rpath] d.targets.append(i) diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 61dace7c1..6dd2bde53 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -205,6 +205,8 @@ class BuildTarget(): self.link_targets = [] self.link_depends = [] self.filename = 'no_name' + # The file with debugging symbols + self.debug_filename = None self.need_install = False self.pch = {} self.extra_args = {} @@ -466,6 +468,15 @@ class BuildTarget(): def get_filename(self): 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): return self.extra_args.get(language, []) @@ -708,6 +719,11 @@ class Executable(BuildTarget): self.filename = self.name if 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): return "@exe" @@ -733,6 +749,11 @@ class StaticLibrary(BuildTarget): else: self.suffix = 'a' 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): return "@sta" @@ -755,6 +776,7 @@ class SharedLibrary(BuildTarget): self.suffix = None self.basic_filename_tpl = '{0.prefix}{0.name}.{0.suffix}' self.determine_filenames(is_cross, environment) + self.determine_debug_filenames(is_cross, environment) def determine_filenames(self, is_cross, env): """ @@ -846,6 +868,21 @@ class SharedLibrary(BuildTarget): self.suffix = suffix 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): super().process_kwargs(kwargs, environment) # Shared library version