diff options
Diffstat (limited to 'mesonbuild/compilers/d.py')
-rw-r--r-- | mesonbuild/compilers/d.py | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/mesonbuild/compilers/d.py b/mesonbuild/compilers/d.py index e67683b..0067e61 100644 --- a/mesonbuild/compilers/d.py +++ b/mesonbuild/compilers/d.py @@ -62,20 +62,19 @@ dmd_optimization_args = {'0': [], } class DCompiler(Compiler): - def __init__(self, exelist, version, is_cross, **kwargs): + def __init__(self, exelist, version, is_cross, is_64, **kwargs): self.language = 'd' super().__init__(exelist, version, **kwargs) self.id = 'unknown' self.is_cross = is_cross + self.is_64 = is_64 def sanity_check(self, work_dir, environment): source_name = os.path.join(work_dir, 'sanity.d') output_name = os.path.join(work_dir, 'dtest') with open(source_name, 'w') as ofile: - ofile.write('''void main() { -} -''') - pc = subprocess.Popen(self.exelist + self.get_output_args(output_name) + [source_name], cwd=work_dir) + ofile.write('''void main() { }''') + pc = subprocess.Popen(self.exelist + self.get_output_args(output_name) + self.get_target_arch_args() + [source_name], cwd=work_dir) pc.wait() if pc.returncode != 0: raise EnvironmentException('D compiler %s can not compile programs.' % self.name_string()) @@ -166,6 +165,8 @@ class DCompiler(Compiler): return res def get_buildtype_linker_args(self, buildtype): + if buildtype != 'plain': + return self.get_target_arch_args() return [] def get_std_exe_link_args(self): @@ -224,6 +225,15 @@ class DCompiler(Compiler): def has_multi_arguments(self, args, env): return self.compiles('int i;\n', env, extra_args=args) + def get_target_arch_args(self): + # 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: + return ['-m64'] + return ['-m32'] + return [] + @classmethod def translate_args_to_nongnu(cls, args): dcargs = [] @@ -272,8 +282,8 @@ class DCompiler(Compiler): return clike_debug_args[is_debug] class GnuDCompiler(DCompiler): - def __init__(self, exelist, version, is_cross, **kwargs): - DCompiler.__init__(self, exelist, version, is_cross, **kwargs) + def __init__(self, exelist, version, is_cross, is_64, **kwargs): + DCompiler.__init__(self, exelist, version, is_cross, is_64, **kwargs) self.id = 'gcc' default_warn_args = ['-Wall', '-Wdeprecated'] self.warn_args = {'1': default_warn_args, @@ -324,8 +334,8 @@ class GnuDCompiler(DCompiler): return gnu_optimization_args[optimization_level] class LLVMDCompiler(DCompiler): - def __init__(self, exelist, version, is_cross, **kwargs): - DCompiler.__init__(self, exelist, version, is_cross, **kwargs) + def __init__(self, exelist, version, is_cross, is_64, **kwargs): + DCompiler.__init__(self, exelist, version, is_cross, is_64, **kwargs) self.id = 'llvm' self.base_options = ['b_coverage', 'b_colorout'] @@ -361,6 +371,8 @@ class LLVMDCompiler(DCompiler): return ['-cov'] def get_buildtype_args(self, buildtype): + if buildtype != 'plain': + return self.get_target_arch_args() + d_ldc_buildtype_args[buildtype] return d_ldc_buildtype_args[buildtype] def get_pic_args(self): @@ -381,10 +393,11 @@ class LLVMDCompiler(DCompiler): class DmdDCompiler(DCompiler): - def __init__(self, exelist, version, is_cross, **kwargs): - DCompiler.__init__(self, exelist, version, is_cross, **kwargs) + def __init__(self, exelist, version, is_cross, is_64, **kwargs): + DCompiler.__init__(self, exelist, version, is_cross, is_64, **kwargs) self.id = 'dmd' self.base_options = ['b_coverage', 'b_colorout'] + self.is_msvc = 'VCINSTALLDIR' in os.environ def get_colorout_args(self, colortype): if colortype == 'always': @@ -421,11 +434,25 @@ class DmdDCompiler(DCompiler): return ['-L-L' + dirname] def get_buildtype_args(self, buildtype): + if buildtype != 'plain': + return self.get_target_arch_args() + d_dmd_buildtype_args[buildtype] return d_dmd_buildtype_args[buildtype] def get_std_shared_lib_link_args(self): return ['-shared', '-defaultlib=libphobos2.so'] + def get_target_arch_args(self): + # DMD32 and DMD64 on 64-bit Windows defaults to 32-bit (OMF). + # Force the target to 64-bit in order to stay consistent + # across the different platforms. + if is_windows(): + if self.is_64: + return ['-m64'] + elif self.is_msvc: + return ['-m32mscoff'] + return ['-m32'] + return [] + @classmethod def unix_args_to_native(cls, args): return cls.translate_args_to_nongnu(args) |