aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/backend
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/backend
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/backend')
-rw-r--r--mesonbuild/backend/backends.py13
-rw-r--r--mesonbuild/backend/ninjabackend.py8
2 files changed, 9 insertions, 12 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index ed7c118..6499105 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -318,21 +318,18 @@ class Backend:
self.write_benchmark_file(datafile)
return test_data, benchmark_data
- def determine_linker(self, target):
+ def determine_linker_and_stdlib_args(self, target):
'''
If we're building a static library, there is only one static linker.
Otherwise, we query the target for the dynamic linker.
'''
if isinstance(target, build.StaticLibrary):
if target.is_cross:
- return self.build.static_cross_linker
+ return self.build.static_cross_linker, []
else:
- return self.build.static_linker
- l = target.get_clike_dynamic_linker()
- if not l:
- m = "Couldn't determine linker for target {!r}"
- raise MesonException(m.format(target.name))
- return l
+ return self.build.static_linker, []
+ l, stdlib_args = target.get_clike_dynamic_linker_and_stdlibs()
+ return l, stdlib_args
def rpaths_for_bundled_shared_libraries(self, target):
paths = []
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 6dd04da..1d8d011 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -470,8 +470,8 @@ int dummy;
if is_unity:
for src in self.generate_unity_files(target, unity_src):
obj_list.append(self.generate_single_compile(target, outfile, src, True, unity_deps + header_deps))
- linker = self.determine_linker(target)
- elem = self.generate_link(target, outfile, outname, obj_list, linker, pch_objects)
+ linker, stdlib_args = self.determine_linker_and_stdlib_args(target)
+ elem = self.generate_link(target, outfile, outname, obj_list, linker, pch_objects, stdlib_args=stdlib_args)
self.generate_shlib_aliases(target, self.get_target_dir(target))
elem.write(outfile)
@@ -2485,7 +2485,7 @@ rule FORTRAN_DEP_HACK%s
return guessed_dependencies + absolute_libs
- def generate_link(self, target, outfile, outname, obj_list, linker, extra_args=[]):
+ def generate_link(self, target, outfile, outname, obj_list, linker, extra_args=[], stdlib_args=[]):
if isinstance(target, build.StaticLibrary):
linker_base = 'STATIC'
else:
@@ -2496,7 +2496,6 @@ rule FORTRAN_DEP_HACK%s
if target.is_cross:
crstr = '_CROSS'
linker_rule = linker_base + crstr + '_LINKER'
-
# Create an empty commands list, and start adding link arguments from
# various sources in the order in which they must override each other
# starting from hard-coded defaults followed by build options and so on.
@@ -2602,6 +2601,7 @@ rule FORTRAN_DEP_HACK%s
custom_target_libraries = self.get_custom_target_provided_libraries(target)
commands += extra_args
commands += custom_target_libraries
+ commands += stdlib_args # Standard library arguments go last, because they never depend on anything.
# Convert from GCC-style link argument naming to the naming used by the
# current compiler.
commands = commands.to_native()