compilers: Move get_allow_undefined_link_args to Compiler

This allows each implementation (gnu-like) and msvc to be implemented in
their respective classes rather than through an if tree in the CCompiler
class. This is cleaner abstraction and allows us to clean up the Fortran
compiler, which was calling CCompiler bound methods without an instance.
pull/4359/head
Dylan Baker 6 years ago
parent a480de1cb5
commit 9f9cfd2139
  1. 32
      mesonbuild/compilers/c.py
  2. 14
      mesonbuild/compilers/compilers.py
  3. 3
      mesonbuild/compilers/fortran.py

@ -157,32 +157,6 @@ class CCompiler(Compiler):
''' '''
return self.get_no_optimization_args() return self.get_no_optimization_args()
def get_allow_undefined_link_args(self):
'''
Get args for allowing undefined symbols when linking to a shared library
'''
if self.id in ('clang', 'gcc'):
if self.compiler_type.is_osx_compiler:
# Apple ld
return ['-Wl,-undefined,dynamic_lookup']
elif self.compiler_type.is_windows_compiler:
# For PE/COFF this is impossible
return []
else:
# GNU ld and LLVM lld
return ['-Wl,--allow-shlib-undefined']
elif isinstance(self, VisualStudioCCompiler):
# link.exe
return ['/FORCE:UNRESOLVED']
elif self.id == 'intel':
if self.compiler_type.is_osx_compiler:
# Apple ld
return ['-Wl,-undefined,dynamic_lookup']
else:
return ['-Wl,--allow-shlib-undefined']
# FIXME: implement other linkers
return []
def get_output_args(self, target): def get_output_args(self, target):
return ['-o', target] return ['-o', target]
@ -1600,11 +1574,17 @@ class VisualStudioCCompiler(CCompiler):
def get_argument_syntax(self): def get_argument_syntax(self):
return 'msvc' return 'msvc'
def get_allow_undefined_link_args(self):
# link.exe
return ['/FORCE:UNRESOLVED']
class ClangClCCompiler(VisualStudioCCompiler): class ClangClCCompiler(VisualStudioCCompiler):
def __init__(self, exelist, version, is_cross, exe_wrap, is_64): def __init__(self, exelist, version, is_cross, exe_wrap, is_64):
super().__init__(exelist, version, is_cross, exe_wrap, is_64) super().__init__(exelist, version, is_cross, exe_wrap, is_64)
self.id = 'clang-cl' self.id = 'clang-cl'
class ArmCCompiler(ArmCompiler, CCompiler): class ArmCCompiler(ArmCompiler, CCompiler):
def __init__(self, exelist, version, compiler_type, is_cross, exe_wrapper=None, **kwargs): def __init__(self, exelist, version, compiler_type, is_cross, exe_wrapper=None, **kwargs):
CCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwargs) CCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwargs)

@ -1265,6 +1265,12 @@ class Compiler:
raise EnvironmentException( raise EnvironmentException(
'%s does not support get_profile_use_args ' % self.get_id()) '%s does not support get_profile_use_args ' % self.get_id())
def get_undefined_link_args(self):
'''
Get args for allowing undefined symbols when linking to a shared library
'''
return []
@enum.unique @enum.unique
class CompilerType(enum.Enum): class CompilerType(enum.Enum):
@ -1511,6 +1517,14 @@ class GnuLikeCompiler(abc.ABC):
def get_profile_use_args(self): def get_profile_use_args(self):
return ['-fprofile-use', '-fprofile-correction'] return ['-fprofile-use', '-fprofile-correction']
def get_allow_undefined_link_args(self):
if self.compiler_type.is_osx_compiler:
# Apple ld
return ['-Wl,-undefined,dynamic_lookup']
else:
# GNU ld and LLVM lld
return ['-Wl,--allow-shlib-undefined']
class GnuCompiler(GnuLikeCompiler): class GnuCompiler(GnuLikeCompiler):
""" """

@ -144,9 +144,6 @@ end program prog
def get_compiler_check_args(self): def get_compiler_check_args(self):
return CCompiler.get_compiler_check_args(self) return CCompiler.get_compiler_check_args(self)
def get_allow_undefined_link_args(self):
return CCompiler.get_allow_undefined_link_args(self)
def get_output_args(self, target): def get_output_args(self, target):
return CCompiler.get_output_args(self, target) return CCompiler.get_output_args(self, target)

Loading…
Cancel
Save