aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Adam <jakub.adam@collabora.com>2019-03-06 15:45:14 +0100
committerJakub Adam <jakub.adam@collabora.com>2019-10-09 15:50:20 +0200
commit1bf17824766230a8ad0b2fe56040ff860c841d50 (patch)
tree58ea79617302c036adf42b6eae7696f23fca0723
parent217036f2d9d7f90b47e6d9cad43f3144882a3b91 (diff)
downloadmeson-1bf17824766230a8ad0b2fe56040ff860c841d50.zip
meson-1bf17824766230a8ad0b2fe56040ff860c841d50.tar.gz
meson-1bf17824766230a8ad0b2fe56040ff860c841d50.tar.bz2
Fix *.pdb files missing in meson introspect --installed output
On Windows, make sure the introspect command lists all Program database (PDB) files containing debugging information that Meson will install.
-rw-r--r--mesonbuild/backend/backends.py41
-rw-r--r--mesonbuild/build.py34
-rw-r--r--mesonbuild/minstall.py5
-rwxr-xr-xrun_unittests.py14
4 files changed, 72 insertions, 22 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index 4d3f5d9..947be1c 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -1091,22 +1091,31 @@ class Backend:
t.get_aliases(), should_strip, mappings,
t.install_rpath, install_mode)
d.targets.append(i)
- # On toolchains/platforms that use an import library for
- # linking (separate from the shared library with all the
- # code), we need to install that too (dll.a/.lib).
- if isinstance(t, (build.SharedLibrary, build.SharedModule, build.Executable)) and t.get_import_filename():
- if custom_install_dir:
- # If the DLL is installed into a custom directory,
- # install the import library into the same place so
- # it doesn't go into a surprising place
- implib_install_dir = outdirs[0]
- else:
- implib_install_dir = self.environment.get_import_lib_dir()
- # Install the import library; may not exist for shared modules
- i = TargetInstallData(self.get_target_filename_for_linking(t),
- implib_install_dir, {}, False, {}, '', install_mode,
- optional=isinstance(t, build.SharedModule))
- d.targets.append(i)
+
+ if isinstance(t, (build.SharedLibrary, build.SharedModule, build.Executable)):
+ # On toolchains/platforms that use an import library for
+ # linking (separate from the shared library with all the
+ # code), we need to install that too (dll.a/.lib).
+ if t.get_import_filename():
+ if custom_install_dir:
+ # If the DLL is installed into a custom directory,
+ # install the import library into the same place so
+ # it doesn't go into a surprising place
+ implib_install_dir = outdirs[0]
+ else:
+ implib_install_dir = self.environment.get_import_lib_dir()
+ # Install the import library; may not exist for shared modules
+ i = TargetInstallData(self.get_target_filename_for_linking(t),
+ implib_install_dir, {}, False, {}, '', install_mode,
+ optional=isinstance(t, build.SharedModule))
+ d.targets.append(i)
+
+ if not should_strip and t.get_debug_filename():
+ debug_file = os.path.join(self.get_target_dir(t), t.get_debug_filename())
+ i = TargetInstallData(debug_file, outdirs[0],
+ {}, False, {}, '',
+ install_mode, optional=True)
+ d.targets.append(i)
# Install secondary outputs. Only used for Vala right now.
if num_outdirs > 1:
for output, outdir in zip(t.get_outputs()[1:], outdirs[1:]):
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 267bd16..68fbd18 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -1488,6 +1488,8 @@ class Executable(BuildTarget):
self.vs_import_filename = None
# The import library that GCC would generate (and prefer)
self.gcc_import_filename = None
+ # The debugging information file this target will generate
+ self.debug_filename = None
# Check for export_dynamic
self.export_dynamic = False
@@ -1500,12 +1502,13 @@ class Executable(BuildTarget):
if self.export_dynamic and kwargs.get('implib') is False:
raise InvalidArguments('"implib" keyword argument must not be false for if "export_dynamic" is true')
+ m = environment.machines[for_machine]
+
# If using export_dynamic, set the import library name
if self.export_dynamic:
implib_basename = self.name + '.exe'
if not isinstance(kwargs.get('implib', False), bool):
implib_basename = kwargs['implib']
- m = environment.machines[for_machine]
if m.is_windows() or m.is_cygwin():
self.vs_import_filename = '{0}.lib'.format(implib_basename)
self.gcc_import_filename = 'lib{0}.a'.format(implib_basename)
@@ -1514,6 +1517,11 @@ class Executable(BuildTarget):
else:
self.import_filename = self.gcc_import_filename
+ if m.is_windows() and ('cs' in self.compilers or
+ self.get_using_rustc() or
+ self.get_using_msvc()):
+ self.debug_filename = self.name + '.pdb'
+
# Only linkwithable if using export_dynamic
self.is_linkwithable = self.export_dynamic
@@ -1540,6 +1548,14 @@ class Executable(BuildTarget):
return [self.vs_import_filename, self.gcc_import_filename]
return []
+ def get_debug_filename(self):
+ """
+ The name of debuginfo file that will be created by the compiler
+
+ Returns None if the build won't create any debuginfo file
+ """
+ return self.debug_filename
+
def is_linkable_target(self):
return self.is_linkwithable
@@ -1619,6 +1635,8 @@ class SharedLibrary(BuildTarget):
self.vs_import_filename = None
# The import library that GCC would generate (and prefer)
self.gcc_import_filename = None
+ # The debugging information file this target will generate
+ self.debug_filename = None
super().__init__(name, subdir, subproject, for_machine, sources, objects, environment, kwargs)
if 'rust' in self.compilers:
# If no crate type is specified, or it's the generic lib type, use dylib
@@ -1673,6 +1691,7 @@ class SharedLibrary(BuildTarget):
"""
prefix = ''
suffix = ''
+ create_debug_file = False
self.filename_tpl = self.basic_filename_tpl
# NOTE: manual prefix/suffix override is currently only tested for C/C++
# C# and Mono
@@ -1680,6 +1699,7 @@ class SharedLibrary(BuildTarget):
prefix = ''
suffix = 'dll'
self.filename_tpl = '{0.prefix}{0.name}.{0.suffix}'
+ create_debug_file = True
# C, C++, Swift, Vala
# Only Windows uses a separate import library for linking
# For all other targets/platforms import_filename stays None
@@ -1692,11 +1712,13 @@ class SharedLibrary(BuildTarget):
prefix = ''
# Import library is called foo.dll.lib
self.import_filename = '{0}.dll.lib'.format(self.name)
+ create_debug_file = True
elif self.get_using_msvc():
# Shared library is of the form foo.dll
prefix = ''
# Import library is called foo.lib
self.import_filename = self.vs_import_filename
+ create_debug_file = True
# Assume GCC-compatible naming
else:
# Shared library is of the form libfoo.dll
@@ -1753,6 +1775,8 @@ class SharedLibrary(BuildTarget):
self.suffix = suffix
self.filename = self.filename_tpl.format(self)
self.outputs = [self.filename]
+ if create_debug_file:
+ self.debug_filename = os.path.splitext(self.filename)[0] + '.pdb'
@staticmethod
def _validate_darwin_versions(darwin_versions):
@@ -1866,6 +1890,14 @@ class SharedLibrary(BuildTarget):
"""
return self.import_filename
+ def get_debug_filename(self):
+ """
+ The name of debuginfo file that will be created by the compiler
+
+ Returns None if the build won't create any debuginfo file
+ """
+ return self.debug_filename
+
def get_import_filenameslist(self):
if self.import_filename:
return [self.vs_import_filename, self.gcc_import_filename]
diff --git a/mesonbuild/minstall.py b/mesonbuild/minstall.py
index 731e093..9311e8d 100644
--- a/mesonbuild/minstall.py
+++ b/mesonbuild/minstall.py
@@ -460,11 +460,6 @@ class Installer:
print('Stdout:\n%s\n' % stdo)
print('Stderr:\n%s\n' % stde)
sys.exit(1)
- pdb_filename = os.path.splitext(fname)[0] + '.pdb'
- if not should_strip and os.path.exists(pdb_filename):
- pdb_outname = os.path.splitext(outname)[0] + '.pdb'
- self.do_copyfile(pdb_filename, pdb_outname)
- set_mode(pdb_outname, install_mode, d.install_umask)
if fname.endswith('.js'):
# Emscripten outputs js files and optionally a wasm file.
# If one was generated, install it as well.
diff --git a/run_unittests.py b/run_unittests.py
index 9f8f576..45b8887 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -4424,6 +4424,20 @@ class WindowsTests(BasePlatformTests):
return
self.build()
+ def test_install_pdb_introspection(self):
+ testdir = os.path.join(self.platform_test_dir, '1 basic')
+
+ env = get_fake_env(testdir, self.builddir, self.prefix)
+ cc = env.detect_c_compiler(MachineChoice.HOST)
+ if cc.get_argument_syntax() != 'msvc':
+ raise unittest.SkipTest('Test only applies to MSVC-like compilers')
+
+ self.init(testdir)
+ installed = self.introspect('--installed')
+ files = [os.path.basename(path) for path in installed.values()]
+
+ self.assertTrue('prog.pdb' in files)
+
@unittest.skipUnless(is_osx(), "requires Darwin")
class DarwinTests(BasePlatformTests):
'''