aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2013-11-17 21:44:58 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2013-11-17 21:44:58 +0200
commit17b5920aa8f2b23a78dbd501be255f68fd5bd868 (patch)
treed9683a960f4d679c99213da684b6f21938d2df22
parent8ef713843f6559593082bf6411d81a6d9cd87ffd (diff)
downloadmeson-17b5920aa8f2b23a78dbd501be255f68fd5bd868.zip
meson-17b5920aa8f2b23a78dbd501be255f68fd5bd868.tar.gz
meson-17b5920aa8f2b23a78dbd501be255f68fd5bd868.tar.bz2
Determine and use the proper linker based on input source languages.
-rw-r--r--backends.py31
-rw-r--r--build.py4
2 files changed, 29 insertions, 6 deletions
diff --git a/backends.py b/backends.py
index 2f3df55..2474ed4 100644
--- a/backends.py
+++ b/backends.py
@@ -166,10 +166,13 @@ class Backend():
obj_list.append(self.generate_single_compile(target, outfile, src, True))
else:
header_deps.append(src)
+ src_list = []
for src in gen_src_deps:
+ src_list.append(src)
obj_list.append(self.generate_single_compile(target, outfile, src, True))
for src in target.get_sources():
if not self.environment.is_header(src):
+ src_list.append(src)
obj_list.append(self.generate_single_compile(target, outfile, src, False, header_deps))
for obj in target.get_objects():
if isinstance(obj, str):
@@ -179,10 +182,32 @@ class Backend():
obj_list += self.determine_ext_objs(obj)
else:
raise MesonException('Unknown data type in object list.')
- elem = self.generate_link(target, outfile, outname, obj_list)
+ linker = self.determine_linker(target, src_list)
+ elem = self.generate_link(target, outfile, outname, obj_list, linker)
self.generate_shlib_aliases(target, self.get_target_dir(target), outfile, elem)
self.processed_targets[name] = True
+ def determine_linker(self, target, src):
+ if isinstance(target, build.StaticLibrary):
+ return self.build.static_linker
+ if len(self.build.compilers) == 1:
+ return self.build.compilers[0]
+ # Currently a bit naive. C++ must
+ # be linked with a C++ compiler, but
+ # otherwise we don't care. This will
+ # become trickier if and when Fortran
+ # and the like become supported.
+ cpp = None
+ for c in self.build.compilers:
+ if c.get_language() == 'cpp':
+ cpp = c
+ break
+ if cpp is not None:
+ for s in src:
+ if c.can_compile(s):
+ return cpp
+ return self.build.compilers[0]
+
def determine_ext_objs(self, extobj):
result = []
targetdir = self.get_target_private_dir(extobj.target)
@@ -859,12 +884,10 @@ class NinjaBackend(Backend):
elem.add_item('CROSS', '--cross-host=' + self.environment.cross_info['name'])
elem.write(outfile)
- def generate_link(self, target, outfile, outname, obj_list):
+ def generate_link(self, target, outfile, outname, obj_list, linker):
if isinstance(target, build.StaticLibrary):
- linker = self.build.static_linker
linker_base = 'STATIC'
else:
- linker = self.build.compilers[0]
linker_base = linker.get_language() # Fixme.
if isinstance(target, build.SharedLibrary):
self.generate_shsym(outfile, target)
diff --git a/build.py b/build.py
index 08d6e28..cc4e2db 100644
--- a/build.py
+++ b/build.py
@@ -350,12 +350,12 @@ class Generator():
if hasattr(args[0], 'held_object'):
exe = args[0].held_object
+ if not isinstance(exe, Executable):
+ raise InvalidArguments('First generator argument must be an executable.')
elif hasattr(args[0], 'ep'):
exe = args[0].ep
else:
raise InvalidArguments('First generator argument must be an executable object.')
- if not isinstance(exe, Executable):
- raise InvalidArguments('First generator argument must be an executable.')
self.exe = exe
self.process_kwargs(kwargs)