Refactor D target architecture handling
The stored architecture matches the same format accepted by dub.
This commit is contained in:
parent
f48c3de24e
commit
5b0ad0f8ad
|
@ -69,12 +69,12 @@ class DCompiler(Compiler):
|
|||
'mtd': ['-mscrtlib=libcmtd'],
|
||||
}
|
||||
|
||||
def __init__(self, exelist, version, is_cross, is_64, **kwargs):
|
||||
def __init__(self, exelist, version, is_cross, arch, **kwargs):
|
||||
self.language = 'd'
|
||||
super().__init__(exelist, version, **kwargs)
|
||||
self.id = 'unknown'
|
||||
self.is_cross = is_cross
|
||||
self.is_64 = is_64
|
||||
self.arch = arch
|
||||
|
||||
def sanity_check(self, work_dir, environment):
|
||||
source_name = os.path.join(work_dir, 'sanity.d')
|
||||
|
@ -275,7 +275,7 @@ class DCompiler(Compiler):
|
|||
# LDC2 on Windows targets to current OS architecture, but
|
||||
# it should follow the target specified by the MSVC toolchain.
|
||||
if is_windows():
|
||||
if self.is_64:
|
||||
if self.arch == 'x86_64':
|
||||
return ['-m64']
|
||||
return ['-m32']
|
||||
return []
|
||||
|
@ -411,8 +411,8 @@ class DCompiler(Compiler):
|
|||
return []
|
||||
|
||||
class GnuDCompiler(DCompiler):
|
||||
def __init__(self, exelist, version, is_cross, is_64, **kwargs):
|
||||
DCompiler.__init__(self, exelist, version, is_cross, is_64, **kwargs)
|
||||
def __init__(self, exelist, version, is_cross, arch, **kwargs):
|
||||
DCompiler.__init__(self, exelist, version, is_cross, arch, **kwargs)
|
||||
self.id = 'gcc'
|
||||
default_warn_args = ['-Wall', '-Wdeprecated']
|
||||
self.warn_args = {'1': default_warn_args,
|
||||
|
@ -466,8 +466,8 @@ class GnuDCompiler(DCompiler):
|
|||
return gnu_optimization_args[optimization_level]
|
||||
|
||||
class LLVMDCompiler(DCompiler):
|
||||
def __init__(self, exelist, version, is_cross, is_64, **kwargs):
|
||||
DCompiler.__init__(self, exelist, version, is_cross, is_64, **kwargs)
|
||||
def __init__(self, exelist, version, is_cross, arch, **kwargs):
|
||||
DCompiler.__init__(self, exelist, version, is_cross, arch, **kwargs)
|
||||
self.id = 'llvm'
|
||||
self.base_options = ['b_coverage', 'b_colorout', 'b_vscrt']
|
||||
|
||||
|
@ -502,11 +502,10 @@ class LLVMDCompiler(DCompiler):
|
|||
|
||||
|
||||
class DmdDCompiler(DCompiler):
|
||||
def __init__(self, exelist, version, is_cross, is_64, **kwargs):
|
||||
DCompiler.__init__(self, exelist, version, is_cross, is_64, **kwargs)
|
||||
def __init__(self, exelist, version, is_cross, arch, **kwargs):
|
||||
DCompiler.__init__(self, exelist, version, is_cross, arch, **kwargs)
|
||||
self.id = 'dmd'
|
||||
self.base_options = ['b_coverage', 'b_colorout', 'b_vscrt']
|
||||
self.is_msvc = 'VCINSTALLDIR' in os.environ
|
||||
|
||||
def get_colorout_args(self, colortype):
|
||||
if colortype == 'always':
|
||||
|
@ -522,9 +521,9 @@ class DmdDCompiler(DCompiler):
|
|||
if is_windows():
|
||||
# DMD links against D runtime only when main symbol is found,
|
||||
# so these needs to be inserted when linking static D libraries.
|
||||
if self.is_64:
|
||||
if self.arch == 'x86_64':
|
||||
return ['phobos64.lib']
|
||||
elif self.is_msvc:
|
||||
elif self.arch == 'x86_mscoff':
|
||||
return ['phobos32mscoff.lib']
|
||||
return ['phobos.lib']
|
||||
return []
|
||||
|
@ -537,9 +536,9 @@ class DmdDCompiler(DCompiler):
|
|||
# Force the target to 64-bit in order to stay consistent
|
||||
# across the different platforms.
|
||||
if is_windows():
|
||||
if self.is_64:
|
||||
if self.arch == 'x86_64':
|
||||
return ['-m64']
|
||||
elif self.is_msvc:
|
||||
elif self.arch == 'x86_mscoff':
|
||||
return ['-m32mscoff']
|
||||
return ['-m32']
|
||||
return []
|
||||
|
|
|
@ -870,13 +870,8 @@ class DubDependency(ExternalDependency):
|
|||
mlog.debug('Determining dependency {!r} with DUB executable '
|
||||
'{!r}'.format(name, self.dubbin.get_path()))
|
||||
|
||||
# we need to know the correct architecture on Windows
|
||||
if self.compiler.is_64:
|
||||
arch = 'x86_64'
|
||||
elif self.compiler.is_msvc:
|
||||
arch = 'x86_mscoff'
|
||||
else:
|
||||
arch = 'x86'
|
||||
# we need to know the target architecture
|
||||
arch = self.compiler.arch
|
||||
|
||||
# Ask dub for the package
|
||||
ret, res = self._call_dubbin(['describe', name, '--arch=' + arch])
|
||||
|
|
|
@ -836,22 +836,22 @@ This is probably wrong, it should always point to the native compiler.''' % evar
|
|||
version = search_version(out)
|
||||
full_version = out.split('\n', 1)[0]
|
||||
|
||||
# Detect which MSVC build environment is currently active.
|
||||
is_64 = False
|
||||
# Detect the target architecture, required for proper architecture handling on Windows.
|
||||
c_compiler = {}
|
||||
if mesonlib.is_windows() and 'VCINSTALLDIR' in os.environ:
|
||||
# MSVC compiler is required for correct platform detection.
|
||||
c_compiler = {'c': self.detect_c_compiler(want_cross)}
|
||||
is_msvc = mesonlib.is_windows() and 'VCINSTALLDIR' in os.environ
|
||||
if is_msvc:
|
||||
c_compiler = {'c': self.detect_c_compiler(want_cross)} # MSVC compiler is required for correct platform detection.
|
||||
|
||||
if detect_cpu_family(c_compiler) == 'x86_64':
|
||||
is_64 = True
|
||||
arch = detect_cpu_family(c_compiler)
|
||||
if is_msvc and arch == 'x86':
|
||||
arch = 'x86_mscoff'
|
||||
|
||||
if 'LLVM D compiler' in out:
|
||||
return compilers.LLVMDCompiler(exelist, version, is_cross, is_64, full_version=full_version)
|
||||
return compilers.LLVMDCompiler(exelist, version, is_cross, arch, full_version=full_version)
|
||||
elif 'gdc' in out:
|
||||
return compilers.GnuDCompiler(exelist, version, is_cross, is_64, full_version=full_version)
|
||||
return compilers.GnuDCompiler(exelist, version, is_cross, arch, full_version=full_version)
|
||||
elif 'The D Language Foundation' in out or 'Digital Mars' in out:
|
||||
return compilers.DmdDCompiler(exelist, version, is_cross, is_64, full_version=full_version)
|
||||
return compilers.DmdDCompiler(exelist, version, is_cross, arch, full_version=full_version)
|
||||
raise EnvironmentException('Unknown compiler "' + ' '.join(exelist) + '"')
|
||||
|
||||
def detect_swift_compiler(self):
|
||||
|
|
Loading…
Reference in New Issue