1#!/usr/bin/env python
2# encoding: utf-8
3# Krzysztof Kosiński 2014
4# DragoonX6 2018
5
6"""
7Detect the Clang C compiler
8This version is an attempt at supporting the -target and -sysroot flag of Clang.
9"""
10
11from waflib.Tools import ccroot, ar, gcc
12from waflib.Configure import conf
13import waflib.Context
14import waflib.extras.clang_cross_common
15
16def options(opt):
17	"""
18	Target triplet for clang::
19			$ waf configure --clang-target-triple=x86_64-pc-linux-gnu
20	"""
21	cc_compiler_opts = opt.add_option_group('Configuration options')
22	cc_compiler_opts.add_option('--clang-target-triple', default=None,
23		help='Target triple for clang',
24		dest='clang_target_triple')
25	cc_compiler_opts.add_option('--clang-sysroot', default=None,
26		help='Sysroot for clang',
27		dest='clang_sysroot')
28
29@conf
30def find_clang(conf):
31	"""
32	Finds the program clang and executes it to ensure it really is clang
33	"""
34
35	import os
36
37	cc = conf.find_program('clang', var='CC')
38
39	if conf.options.clang_target_triple != None:
40		conf.env.append_value('CC', ['-target', conf.options.clang_target_triple])
41
42	if conf.options.clang_sysroot != None:
43		sysroot = str()
44
45		if os.path.isabs(conf.options.clang_sysroot):
46			sysroot = conf.options.clang_sysroot
47		else:
48			sysroot = os.path.normpath(os.path.join(os.getcwd(), conf.options.clang_sysroot))
49
50		conf.env.append_value('CC', ['--sysroot', sysroot])
51
52	conf.get_cc_version(cc, clang=True)
53	conf.env.CC_NAME = 'clang'
54
55@conf
56def clang_modifier_x86_64_w64_mingw32(conf):
57	conf.gcc_modifier_win32()
58
59@conf
60def clang_modifier_i386_w64_mingw32(conf):
61	conf.gcc_modifier_win32()
62
63@conf
64def clang_modifier_x86_64_windows_msvc(conf):
65	conf.clang_modifier_msvc()
66
67	# Allow the user to override any flags if they so desire.
68	clang_modifier_user_func = getattr(conf, 'clang_modifier_x86_64_windows_msvc_user', None)
69	if clang_modifier_user_func:
70		clang_modifier_user_func()
71
72@conf
73def clang_modifier_i386_windows_msvc(conf):
74	conf.clang_modifier_msvc()
75
76	# Allow the user to override any flags if they so desire.
77	clang_modifier_user_func = getattr(conf, 'clang_modifier_i386_windows_msvc_user', None)
78	if clang_modifier_user_func:
79		clang_modifier_user_func()
80
81def configure(conf):
82	conf.find_clang()
83	conf.find_program(['llvm-ar', 'ar'], var='AR')
84	conf.find_ar()
85	conf.gcc_common_flags()
86	# Allow the user to provide flags for the target platform.
87	conf.gcc_modifier_platform()
88	# And allow more fine grained control based on the compiler's triplet.
89	conf.clang_modifier_target_triple()
90	conf.cc_load_tools()
91	conf.cc_add_flags()
92	conf.link_add_flags()
93