diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2019-05-13 12:03:34 -0700 |
---|---|---|
committer | Nirbheek Chauhan <nirbheek.chauhan@gmail.com> | 2019-07-23 09:58:24 +0000 |
commit | 32c57ca7822fcba084afed8268789552b7ef11c3 (patch) | |
tree | 87977271431a4ddb9b26012e69c839243ca385d8 /mesonbuild | |
parent | 753587ee15a857df238d0c7a109eaf2613cb237f (diff) | |
download | meson-32c57ca7822fcba084afed8268789552b7ef11c3.zip meson-32c57ca7822fcba084afed8268789552b7ef11c3.tar.gz meson-32c57ca7822fcba084afed8268789552b7ef11c3.tar.bz2 |
linkers: simplify and annotate
I started out just annotating, but realized there is a lot of really
silly duplication of methods in this module. Nearly all of the methods
return [], but each class implemented the same methods over and over!
I've fixed this by moving the default implementation down into the
`StaticLinker` class, and then overriding as necessary in the derived
classes.
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/linkers.py | 234 |
1 files changed, 81 insertions, 153 deletions
diff --git a/mesonbuild/linkers.py b/mesonbuild/linkers.py index 648d1ef..20b513a 100644 --- a/mesonbuild/linkers.py +++ b/mesonbuild/linkers.py @@ -12,85 +12,117 @@ # See the License for the specific language governing permissions and # limitations under the License. +import typing + from .mesonlib import Popen_safe, is_windows from . import mesonlib +if typing.TYPE_CHECKING: + from .coredata import OptionDictType + from .environment import Environment + + class StaticLinker: - def can_linker_accept_rsp(self): + + def __init__(self, exelist: typing.List[str]): + self.exelist = exelist + + def can_linker_accept_rsp(self) -> bool: """ Determines whether the linker can accept arguments using the @rsp syntax. """ return mesonlib.is_windows() + def get_exelist(self) -> typing.List[str]: + return self.exelist.copy() -class VisualStudioLikeLinker: - always_args = ['/NOLOGO'] + def get_std_link_args(self) -> typing.List[str]: + return [] - def __init__(self, exelist, machine): - self.exelist = exelist - self.machine = machine + def get_buildtype_linker_args(self, buildtype: str) -> typing.List[str]: + return [] - def get_exelist(self): - return self.exelist.copy() + def get_output_args(self, target: str) -> typing.List[str]: + return[] - def get_std_link_args(self): + def get_coverage_link_args(self) -> typing.List[str]: return [] - def get_buildtype_linker_args(self, buildtype): + def build_rpath_args(self, build_dir: str, from_dir: str, rpath_paths: str, + build_rpath: str, install_rpath: str) -> typing.List[str]: return [] - def get_output_args(self, target): - args = [] - if self.machine: - args += ['/MACHINE:' + self.machine] - args += ['/OUT:' + target] - return args + def thread_link_flags(self, env: 'Environment') -> typing.List[str]: + return [] - def get_coverage_link_args(self): + def openmp_flags(self) -> typing.List[str]: return [] - def get_always_args(self): - return self.always_args.copy() + def get_option_link_args(self, options: 'OptionDictType') -> typing.List[str]: + return [] - def get_linker_always_args(self): - return self.always_args.copy() + @classmethod + def unix_args_to_native(cls, args: typing.List[str]) -> typing.List[str]: + return args - def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath): + def get_link_debugfile_args(self, targetfile: str) -> typing.List[str]: + # Static libraries do not have PDB files return [] - def thread_link_flags(self, env): + def get_always_args(self) -> typing.List[str]: return [] - def openmp_flags(self): + def get_linker_always_args(self) -> typing.List[str]: return [] - def get_option_link_args(self, options): - return [] + +class VisualStudioLikeLinker: + always_args = ['/NOLOGO'] + + def __init__(self, machine: str): + self.machine = machine + + def get_always_args(self) -> typing.List[str]: + return self.always_args.copy() + + def get_linker_always_args(self) -> typing.List[str]: + return self.always_args.copy() + + def get_output_args(self, target: str) -> typing.List[str]: + args = [] # type: typing.List[str] + if self.machine: + args += ['/MACHINE:' + self.machine] + args += ['/OUT:' + target] + return args @classmethod - def unix_args_to_native(cls, args): + def unix_args_to_native(cls, args: typing.List[str]) -> typing.List[str]: from .compilers import VisualStudioCCompiler return VisualStudioCCompiler.unix_args_to_native(args) - def get_link_debugfile_args(self, targetfile): - # Static libraries do not have PDB files - return [] - class VisualStudioLinker(VisualStudioLikeLinker, StaticLinker): """Microsoft's lib static linker.""" + def __init__(self, exelist: typing.List[str], machine: str): + StaticLinker.__init__(self, exelist) + VisualStudioLikeLinker.__init__(self, machine) + class IntelVisualStudioLinker(VisualStudioLikeLinker, StaticLinker): """Intel's xilib static linker.""" + def __init__(self, exelist: typing.List[str], machine: str): + StaticLinker.__init__(self, exelist) + VisualStudioLikeLinker.__init__(self, machine) + class ArLinker(StaticLinker): - def __init__(self, exelist): - self.exelist = exelist + def __init__(self, exelist: typing.List[str]): + super().__init__(exelist) self.id = 'ar' pc, stdo = Popen_safe(self.exelist + ['-h'])[0:2] # Enable deterministic builds if they are available. @@ -99,85 +131,38 @@ class ArLinker(StaticLinker): else: self.std_args = ['csr'] - def can_linker_accept_rsp(self): - return mesonlib.is_windows() - - def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath): - return [] - - def get_exelist(self): - return self.exelist[:] - - def get_std_link_args(self): + def get_std_link_args(self) -> typing.List[str]: return self.std_args - def get_output_args(self, target): + def get_output_args(self, target: str) -> typing.List[str]: return [target] - def get_buildtype_linker_args(self, buildtype): - return [] - - def get_linker_always_args(self): - return [] - - def get_coverage_link_args(self): - return [] - - def get_always_args(self): - return [] - - def thread_link_flags(self, env): - return [] - - def openmp_flags(self): - return [] - - def get_option_link_args(self, options): - return [] - - @classmethod - def unix_args_to_native(cls, args): - return args[:] - - def get_link_debugfile_args(self, targetfile): - return [] class ArmarLinker(ArLinker): - def __init__(self, exelist): - self.exelist = exelist + def __init__(self, exelist: typing.List[str]): + StaticLinker.__init__(self, exelist) self.id = 'armar' self.std_args = ['-csr'] - def can_linker_accept_rsp(self): + def can_linker_accept_rsp(self) -> bool: # armar cann't accept arguments using the @rsp syntax return False + class DLinker(StaticLinker): - def __init__(self, exelist, arch): - self.exelist = exelist + def __init__(self, exelist: typing.List[str], arch: str): + super().__init__(exelist) self.id = exelist[0] self.arch = arch - def can_linker_accept_rsp(self): - return mesonlib.is_windows() - - def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath): - return [] - - def get_exelist(self): - return self.exelist[:] - - def get_std_link_args(self): + def get_std_link_args(self) -> typing.List[str]: return ['-lib'] - def get_output_args(self, target): + def get_output_args(self, target: str) -> typing.List[str]: return ['-of=' + target] - def get_buildtype_linker_args(self, buildtype): - return [] - - def get_linker_always_args(self): + def get_linker_always_args(self) -> typing.List[str]: if is_windows(): if self.arch == 'x86_64': return ['-m64'] @@ -186,75 +171,18 @@ class DLinker(StaticLinker): return ['-m32'] return [] - def get_coverage_link_args(self): - return [] - - def get_always_args(self): - return [] - - def thread_link_flags(self, env): - return [] - - def openmp_flags(self): - return [] - - def get_option_link_args(self, options): - return [] - - @classmethod - def unix_args_to_native(cls, args): - return args[:] - - def get_link_debugfile_args(self, targetfile): - return [] class CcrxLinker(StaticLinker): - def __init__(self, exelist): - self.exelist = exelist + def __init__(self, exelist: typing.List[str]): + super().__init__(exelist) self.id = 'rlink' - pc, stdo = Popen_safe(self.exelist + ['-h'])[0:2] - self.std_args = [] - def can_linker_accept_rsp(self): + def can_linker_accept_rsp(self) -> bool: return False - def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath): - return [] - - def get_exelist(self): - return self.exelist[:] - - def get_std_link_args(self): - return self.std_args - - def get_output_args(self, target): + def get_output_args(self, target: str) -> typing.List[str]: return ['-output=%s' % target] - def get_buildtype_linker_args(self, buildtype): - return [] - - def get_linker_always_args(self): + def get_linker_always_args(self) -> typing.List[str]: return ['-nologo', '-form=library'] - - def get_coverage_link_args(self): - return [] - - def get_always_args(self): - return [] - - def thread_link_flags(self, env): - return [] - - def openmp_flags(self): - return [] - - def get_option_link_args(self, options): - return [] - - @classmethod - def unix_args_to_native(cls, args): - return args[:] - - def get_link_debugfile_args(self, targetfile): - return [] |