Fix opt clang build.
1 # vim: set ts=2 sw=2 tw=99 noet ft=python:
4 from ambuild.command import SymlinkCommand
8 self.compiler = Cpp.Compiler()
10 if AMBuild.mode == 'config':
12 self.compiler.DetectAll(AMBuild)
15 cxx = self.compiler.cxx
16 if isinstance(cxx, Cpp.CompatGCC):
17 if isinstance(cxx, Cpp.GCC):
19 elif isinstance(cxx, Cpp.Clang):
21 self.compiler.AddToListVar('CDEFINES', 'stricmp=strcasecmp')
22 self.compiler.AddToListVar('CDEFINES', '_stricmp=strcasecmp')
23 self.compiler.AddToListVar('CDEFINES', '_snprintf=snprintf')
24 self.compiler.AddToListVar('CDEFINES', '_vsnprintf=vsnprintf')
25 self.compiler.AddToListVar('CFLAGS', '-pipe')
26 self.compiler.AddToListVar('CFLAGS', '-fno-strict-aliasing')
27 if (self.vendor == 'gcc' and cxx.majorVersion >= 4) or self.vendor == 'clang':
28 self.compiler.AddToListVar('CFLAGS', '-fvisibility=hidden')
29 self.compiler.AddToListVar('CXXFLAGS', '-fvisibility-inlines-hidden')
30 self.compiler.AddToListVar('CFLAGS', '-Wall')
31 self.compiler.AddToListVar('CFLAGS', '-Werror')
32 self.compiler.AddToListVar('CFLAGS', '-Wno-switch')
34 if AMBuild.options.arch == 'x86':
35 self.compiler.AddToListVar('CFLAGS', '-m32')
36 self.compiler.AddToListVar('POSTLINKFLAGS', '-m32')
37 elif AMBuild.options.arch == 'x64':
38 self.compiler.AddToListVar('CFLAGS', '-m64')
39 self.compiler.AddToListVar('POSTLINKFLAGS', '-m64')
40 elif AMBuild.options.arch:
41 raise Exception('Unknown architecture: {0}'.format(AMBuild.options.arch))
43 # Disable some stuff we don't use, that gives us better binary
44 # compatibility on Linux.
45 self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions')
46 self.compiler.AddToListVar('CXXFLAGS', '-fno-rtti')
47 self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics')
49 # We don't really care about these.
50 self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor')
51 self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual')
53 # The compiler is too aggressive about what what should be a valid offsetof.
54 self.compiler.AddToListVar('CXXFLAGS', '-Wno-invalid-offsetof')
56 # This would otherwise forbid ((x = y) == NULL) in clang apparently.
57 if self.vendor == 'clang':
58 self.compiler.AddToListVar('CXXFLAGS', '-Wno-null-arithmetic')
60 if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersion >= 7) or \
61 (self.vendor == 'clang' and cxx.majorVersion >= 3):
62 self.compiler.AddToListVar('CXXFLAGS', '-Wno-delete-non-virtual-dtor')
64 self.compiler.AddToListVar('POSTLINKFLAGS', '-lm')
65 elif isinstance(cxx, Cpp.MSVC):
67 if AMBuild.options.debug == '1':
68 self.compiler.AddToListVar('CFLAGS', '/MTd')
69 self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
71 self.compiler.AddToListVar('CFLAGS', '/MT')
72 self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE')
73 self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS')
74 self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE')
75 self.compiler.AddToListVar('CXXFLAGS', '/EHsc')
76 self.compiler.AddToListVar('CXXFLAGS', '/GR-')
77 self.compiler.AddToListVar('CFLAGS', '/W3')
78 self.compiler.AddToListVar('CFLAGS', '/nologo')
79 self.compiler.AddToListVar('CFLAGS', '/Zi')
80 self.compiler.AddToListVar('CXXFLAGS', '/TP')
81 self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG')
83 # if AMBuild.options.arch == 'x86':
84 # self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X86')
85 # elif AMBuild.options.arch == 'x64':
86 # self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X64')
87 # elif AMBuild.options.arch:
88 # raise Exception('Unknown architecture: {0}'.format(AMBuild.options.arch))
90 self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib')
91 self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib')
92 self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib')
93 self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib')
94 self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib')
95 self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib')
96 self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib')
97 self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib')
98 self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib')
99 self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib')
100 self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib')
101 self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib')
104 if AMBuild.options.opt == '1':
105 self.compiler.AddToListVar('CDEFINES', 'NDEBUG')
106 if self.vendor == 'gcc' or self.vendor == 'clang':
107 self.compiler.AddToListVar('CFLAGS', '-O3')
108 elif self.vendor == 'msvc':
109 self.compiler.AddToListVar('CFLAGS', '/Ox')
110 self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF')
111 self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF')
114 if AMBuild.options.debug == '1':
115 if self.vendor == 'gcc' or self.vendor == 'clang':
116 self.compiler.AddToListVar('CFLAGS', '-g3')
117 elif self.vendor == 'msvc':
118 self.compiler.AddToListVar('CFLAGS', '/Od')
119 self.compiler.AddToListVar('CFLAGS', '/RTC1')
122 if AMBuild.target['platform'] == 'linux':
123 self.compiler.AddToListVar('CDEFINES', '_LINUX')
124 if self.vendor == 'gcc':
125 self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc')
126 if self.vendor == 'clang':
127 self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh')
128 elif AMBuild.target['platform'] == 'darwin':
129 self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5')
130 if AMBuild.options.arch == 'x86':
131 self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386'])
132 elif AMBuild.options.arch == 'x64':
133 self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'x86_64'])
134 self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++')
136 # For OS X dylib versioning
138 productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
139 productContents = productFile.read()
141 m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
143 self.version = '1.0.0'
145 major, minor, release = m.groups()
146 self.version = '{0}.{1}.{2}'.format(major, minor, release)
147 AMBuild.cache.CacheVariable('version', self.version)
150 self.compiler.ToConfig(AMBuild, 'compiler')
151 AMBuild.cache.CacheVariable('vendor', self.vendor)
153 AMBuild.cache.CacheVariable('targetMap', self.targetMap)
155 self.compiler.FromConfig(AMBuild, 'compiler')
156 self.targetMap = AMBuild.cache['targetMap']
158 def DefaultCompiler(self):
159 return self.compiler.Clone()
161 def JobMatters(self, jobname):
162 file = sys._getframe().f_code.co_filename
163 if AMBuild.mode == 'config':
164 self.targetMap[jobname] = file
166 if len(AMBuild.args) == 0:
168 if not jobname in AMBuild.args:
177 ['src', 'AMBuild.library'],
178 ['src', 'AMBuild.shell']
181 for parts in FileList:
182 AMBuild.Include(os.path.join(*parts), globals)