1#!/usr/bin/env python
2# encoding: utf-8
3# Carlos Rafael Giani, 2007 (dv)
4# Thomas Nagy, 2016-2018 (ita)
5
6"""
7Try to detect a D compiler from the list of supported compilers::
8
9	def options(opt):
10		opt.load('compiler_d')
11	def configure(cnf):
12		cnf.load('compiler_d')
13	def build(bld):
14		bld.program(source='main.d', target='app')
15
16Only three D compilers are really present at the moment:
17
18* gdc
19* dmd, the ldc compiler having a very similar command-line interface
20* ldc2
21"""
22
23import re
24from waflib import Utils, Logs
25
26d_compiler = {
27'default' : ['gdc', 'dmd', 'ldc2']
28}
29"""
30Dict mapping the platform names to lists of names of D compilers to try, in order of preference::
31
32	from waflib.Tools.compiler_d import d_compiler
33	d_compiler['default'] = ['gdc', 'dmd', 'ldc2']
34"""
35
36def default_compilers():
37	build_platform = Utils.unversioned_sys_platform()
38	possible_compiler_list = d_compiler.get(build_platform, d_compiler['default'])
39	return ' '.join(possible_compiler_list)
40
41def configure(conf):
42	"""
43	Detects a suitable D compiler
44
45	:raises: :py:class:`waflib.Errors.ConfigurationError` when no suitable compiler is found
46	"""
47	try:
48		test_for_compiler = conf.options.check_d_compiler or default_compilers()
49	except AttributeError:
50		conf.fatal("Add options(opt): opt.load('compiler_d')")
51
52	for compiler in re.split('[ ,]+', test_for_compiler):
53		conf.env.stash()
54		conf.start_msg('Checking for %r (D compiler)' % compiler)
55		try:
56			conf.load(compiler)
57		except conf.errors.ConfigurationError as e:
58			conf.env.revert()
59			conf.end_msg(False)
60			Logs.debug('compiler_d: %r', e)
61		else:
62			if conf.env.D:
63				conf.end_msg(conf.env.get_flat('D'))
64				conf.env.COMPILER_D = compiler
65				conf.env.commit()
66				break
67			conf.env.revert()
68			conf.end_msg(False)
69	else:
70		conf.fatal('could not configure a D compiler!')
71
72def options(opt):
73	"""
74	This is how to provide compiler preferences on the command-line::
75
76		$ waf configure --check-d-compiler=dmd
77	"""
78	test_for_compiler = default_compilers()
79	d_compiler_opts = opt.add_option_group('Configuration options')
80	d_compiler_opts.add_option('--check-d-compiler', default=None,
81		help='list of D compilers to try [%s]' % test_for_compiler, dest='check_d_compiler')
82
83	for x in test_for_compiler.split():
84		opt.load('%s' % x)
85
86