Use linked-libraries to decide what linker to use

Sometimes you want to link to a C++ library that exports C API, which
means the linker must link in the C++ stdlib, and we must use a C++
compiler for linking. The same is also applicable for objc/objc++ etc,
so we can keep using clike_langs for the priority order.

Closes https://github.com/mesonbuild/meson/issues/1653
pull/1654/head
Nirbheek Chauhan 8 years ago committed by Dylan Baker
parent 723884a369
commit 22c4cd6e25
  1. 37
      mesonbuild/build.py

@ -868,6 +868,28 @@ You probably should put it in link_with instead.''')
def get_aliases(self):
return {}
def get_langs_used_by_deps(self):
'''
Sometimes you want to link to a C++ library that exports C API, which
means the linker must link in the C++ stdlib, and we must use a C++
compiler for linking. The same is also applicable for objc/objc++, etc,
so we can keep using clike_langs for the priority order.
See: https://github.com/mesonbuild/meson/issues/1653
'''
langs = []
# Check if any of the external libraries were written in this language
for dep in self.external_deps:
if dep.language not in langs:
langs.append(dep.language)
# Check if any of the internal libraries this target links to were
# written in this language
for link_target in self.link_targets:
for language in link_target.compilers:
if language not in langs:
langs.append(language)
return langs
def get_clike_dynamic_linker(self):
'''
We use the order of languages in `clike_langs` to determine which
@ -878,9 +900,20 @@ You probably should put it in link_with instead.''')
that can link compiled C. We don't actually need to add an exception
for Vala here because of that.
'''
# Populate list of all compilers, not just those being used to compile
# sources in this target
if self.is_cross:
all_compilers = self.environment.coredata.cross_compilers
else:
all_compilers = self.environment.coredata.compilers
# Languages used by dependencies
dep_langs = self.get_langs_used_by_deps()
# Pick a compiler based on the language priority-order
for l in clike_langs:
if l in self.compilers:
return self.compilers[l]
if l in self.compilers or l in dep_langs:
return all_compilers[l]
m = 'Could not get a dynamic linker for build target {!r}'
raise AssertionError(m.format(self.name))
def get_using_msvc(self):
'''

Loading…
Cancel
Save