gitignore *.pyc
[waf-toolchain-flags.git] / __init__.py
blob7aba04fe195470d8092ebc6d415f427d8290a35c
1 # encoding: utf-8
2 # SPDX-FileCopyrightText: Copyright © 2023 Nedko Arnaudov
3 # SPDX-FileCopyrightText: Copyright © 2016-2017 Karl Linden
4 # SPDX-License-Identifier: BSD-2-Clause
6 class WafToolchainFlags:
7 """
8 Waf helper class for handling set of CFLAGS
9 and related. The flush() method will
10 prepend so to allow supplied by (downstream/distro/builder) waf caller flags
11 to override the upstream flags in wscript.
12 TODO: upstream this or find alternative easy way of doing the same
13 """
14 def __init__(self, conf):
15 """
16 :param conf: Waf configuration object
17 """
18 self.conf = conf
19 self.flags = {}
20 for x in ('CPPFLAGS', 'CFLAGS', 'CXXFLAGS', 'LINKFLAGS'):
21 self.flags[x] = []
23 def flush(self):
24 """
25 Flush flags to the configuration object
26 Prepend is used so to allow supplied by
27 (downstream/distro/builder) waf caller flags
28 to override the upstream flags in wscript.
29 """
30 for key, val in self.flags.items():
31 self.conf.env.prepend_value(key, val)
33 def add(self, key, val):
34 """
35 :param key: Set to add flags to. 'CPPFLAGS', 'CFLAGS', 'CXXFLAGS' or 'LINKFLAGS'
36 :param val: string or list of strings
37 """
38 flags = self.flags[key]
39 if isinstance(val, list):
40 #flags.extend(val)
41 for x in val:
42 if not isinstance(x, str):
43 raise Exception("value must be string or list of strings. ", type(x))
44 flags.append(x)
45 elif isinstance(val, str):
46 flags.append(val)
47 else:
48 raise Exception("value must be string or list of strings")
50 def add_cpp(self, value):
51 """
52 Add flag or list of flags to CPPFLAGS
53 :param value: string or list of strings
54 """
55 self.add('CPPFLAGS', value)
57 def add_c(self, value):
58 """
59 Add flag or list of flags to CFLAGS
60 :param value: string or list of strings
61 """
62 self.add('CFLAGS', value)
64 def add_cxx(self, value):
65 """
66 Add flag or list of flags to CXXFLAGS
67 :param value: string or list of strings
68 """
69 self.add('CXXFLAGS', value)
71 def add_candcxx(self, value):
72 """
73 Add flag or list of flags to CFLAGS and CXXFLAGS
74 :param value: string or list of strings
75 """
76 self.add_c(value)
77 self.add_cxx(value)
79 def add_link(self, value):
80 """
81 Add flag or list of flags to LINKFLAGS
82 :param value: string or list of strings
83 """
84 self.add('LINKFLAGS', value)
86 def display(self):
87 """
88 Print via conf.msg all non-empty flags
89 """
90 tool_flags = [
91 ('C compiler flags', ['CFLAGS', 'CPPFLAGS']),
92 ('C++ compiler flags', ['CXXFLAGS', 'CPPFLAGS']),
93 ('Linker flags', ['LINKFLAGS', 'LDFLAGS'])
95 for name, vars in tool_flags:
96 flags = []
97 for var in vars:
98 flags += self.conf.all_envs[''][var]
99 if flags:
100 self.conf.msg(name, repr(flags), color='NORMAL')