diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2013-11-17 21:44:58 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2013-11-17 21:44:58 +0200 |
commit | 17b5920aa8f2b23a78dbd501be255f68fd5bd868 (patch) | |
tree | d9683a960f4d679c99213da684b6f21938d2df22 | |
parent | 8ef713843f6559593082bf6411d81a6d9cd87ffd (diff) | |
download | meson-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.py | 31 | ||||
-rw-r--r-- | build.py | 4 |
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) @@ -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) |