aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/build.py
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2018-04-25 22:25:55 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2018-05-02 22:50:15 +0300
commit1918c0d231f0c04b1a57c2fdf057b50c8aa7312b (patch)
tree074fd9ede2fe8ee8c3e63822b1c89de39cd967ff /mesonbuild/build.py
parent77b72e8573bbd8d6d04cb11aacdba604b8649f4d (diff)
downloadmeson-1918c0d231f0c04b1a57c2fdf057b50c8aa7312b.zip
meson-1918c0d231f0c04b1a57c2fdf057b50c8aa7312b.tar.gz
meson-1918c0d231f0c04b1a57c2fdf057b50c8aa7312b.tar.bz2
Can combine D and C++ in a single target. Closes #3125.
Diffstat (limited to 'mesonbuild/build.py')
-rw-r--r--mesonbuild/build.py16
1 files changed, 13 insertions, 3 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index a2d024a..5d1163b 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -989,6 +989,8 @@ You probably should put it in link_with instead.''')
langs = []
# Check if any of the external libraries were written in this language
for dep in self.external_deps:
+ if dep.language is None:
+ continue
if dep.language not in langs:
langs.append(dep.language)
# Check if any of the internal libraries this target links to were
@@ -999,7 +1001,7 @@ You probably should put it in link_with instead.''')
langs.append(language)
return langs
- def get_clike_dynamic_linker(self):
+ def get_clike_dynamic_linker_and_stdlibs(self):
'''
We use the order of languages in `clike_langs` to determine which
linker to use in case the target has sources compiled with multiple
@@ -1021,12 +1023,19 @@ You probably should put it in link_with instead.''')
for l in clike_langs:
if l in self.compilers or l in dep_langs:
try:
- return all_compilers[l]
+ linker = all_compilers[l]
except KeyError:
raise MesonException(
'Could not get a dynamic linker for build target {!r}. '
'Requires a linker for language "{}", but that is not '
'a project language.'.format(self.name, l))
+ stdlib_args = []
+ added_languages = set()
+ for dl in itertools.chain(self.compilers, dep_langs):
+ if dl != linker.language:
+ stdlib_args += all_compilers[dl].language_stdlib_only_link_flags()
+ added_languages.add(dl)
+ return linker, stdlib_args
m = 'Could not get a dynamic linker for build target {!r}'
raise AssertionError(m.format(self.name))
@@ -1049,7 +1058,8 @@ You probably should put it in link_with instead.''')
2. If the target contains only objects, process_compilers guesses and
picks the first compiler that smells right.
'''
- linker = self.get_clike_dynamic_linker()
+ linker, _ = self.get_clike_dynamic_linker_and_stdlibs()
+ # Mixing many languages with MSVC is not supported yet so ignore stdlibs.
if linker and linker.get_id() == 'msvc':
return True
return False