1 # vim: set ts=2 sw=2 tw=99 noet ft=python:
4 from ambuild.command import Command
5 from ambuild.command import ShellCommand
6 from ambuild.command import SymlinkCommand
8 class ExtractDebugInfoCommand(Command):
9 def __init__(self, binary, outfile):
10 Command.__init__(self)
12 self.outfile = outfile
14 def run(self, runner, job):
15 if AMBuild.cache['debug']:
18 if not self.binary.NeedsRelink(self.outfile):
21 if AMBuild.target['platform'] == 'linux':
22 job.AddCommand(ShellCommand('objcopy --only-keep-debug ' + self.outfile + ' ' + self.outfile + '.dbg'))
23 job.AddCommand(ShellCommand('objcopy --strip-debug ' + self.outfile))
24 job.AddCommand(ShellCommand('objcopy --add-gnu-debuglink=' + os.path.basename(self.outfile) + '.dbg ' + self.outfile))
25 elif AMBuild.target['platform'] == 'darwin':
26 job.AddCommand(ShellCommand('dsymutil ' + self.outfile))
27 job.AddCommand(ShellCommand('strip -S ' + self.outfile))
31 self.compiler = Cpp.Compiler()
34 self.possibleSdks = { }
35 self.possibleSdks['ep1'] = {'sdk': 'HL2SDK', 'ext': '1.ep1', 'def': '1',
36 'name': 'EPISODEONE', 'platform': ['windows', 'linux'],
38 self.possibleSdks['ep2'] = {'sdk': 'HL2SDKOB', 'ext': '2.ep2', 'def': '3',
39 'name': 'ORANGEBOX', 'platform': ['windows', 'linux'],
41 self.possibleSdks['css'] = {'sdk': 'HL2SDKCSS', 'ext': '2.css', 'def': '6',
42 'name': 'CSS', 'platform': ['windows', 'linux', 'darwin'],
44 self.possibleSdks['hl2dm'] = {'sdk': 'HL2SDKHL2DM', 'ext': '2.hl2dm', 'def': '7',
45 'name': 'HL2DM', 'platform': ['windows', 'linux', 'darwin'],
46 'dir': 'hl2sdk-hl2dm'}
47 self.possibleSdks['dods'] = {'sdk': 'HL2SDKDODS', 'ext': '2.dods', 'def': '8',
48 'name': 'DODS', 'platform': ['windows', 'linux', 'darwin'],
50 self.possibleSdks['tf2'] = {'sdk': 'HL2SDKTF2', 'ext': '2.tf2', 'def': '9',
51 'name': 'TF2', 'platform': ['windows', 'linux', 'darwin'],
53 self.possibleSdks['l4d'] = {'sdk': 'HL2SDKL4D', 'ext': '2.l4d', 'def': '10',
54 'name': 'LEFT4DEAD', 'platform': ['windows', 'linux', 'darwin'],
56 self.possibleSdks['nd'] = {'sdk': 'HL2SDKND', 'ext': '2.nd', 'def': '11',
57 'name': 'NUCLEARDAWN', 'platform': ['windows', 'linux', 'darwin'],
59 self.possibleSdks['l4d2'] = {'sdk': 'HL2SDKL4D2', 'ext': '2.l4d2', 'def': '12',
60 'name': 'LEFT4DEAD2', 'platform': ['windows', 'linux', 'darwin'],
62 self.possibleSdks['darkm'] = {'sdk': 'HL2SDK-DARKM', 'ext': '2.darkm', 'def': '2',
63 'name': 'DARKMESSIAH', 'platform': ['windows'],
64 'dir': 'hl2sdk-darkm'}
65 self.possibleSdks['swarm'] = {'sdk': 'HL2SDK-SWARM', 'ext': '2.swarm', 'def': '13',
66 'name': 'ALIENSWARM', 'platform': ['windows'],
67 'dir': 'hl2sdk-swarm'}
68 self.possibleSdks['bgt'] = {'sdk': 'HL2SDK-BGT', 'ext': '2.bgt', 'def': '4',
69 'name': 'BLOODYGOODTIME', 'platform': ['windows'],
71 self.possibleSdks['eye'] = {'sdk': 'HL2SDK-EYE', 'ext': '2.eye', 'def': '5',
72 'name': 'EYE', 'platform': ['windows'],
74 self.possibleSdks['csgo'] = {'sdk': 'HL2SDKCSGO', 'ext': '2.csgo', 'def': '15',
75 'name': 'CSGO', 'platform': ['windows', 'linux', 'darwin'],
77 self.possibleSdks['dota'] = {'sdk': 'HL2SDKDOTA', 'ext': '2.dota', 'def': '16',
78 'name': 'DOTA', 'platform': ['windows'],
80 # self.possibleSdks['portal2'] = {'sdk': 'HL2SDK-PORTAL2', 'ext': '2.portal2', 'def': '14',
81 # 'name': 'PORTAL2', 'platform': ['windows'],
82 # 'dir': 'hl2sdk-portal2'}
86 if AMBuild.mode == 'config':
88 self.compiler.DetectAll(AMBuild)
90 self.hasMySql = AMBuild.options.hasMySql
91 AMBuild.cache.CacheVariable('hasMySql', self.hasMySql)
93 AMBuild.cache.CacheVariable('debug', AMBuild.options.debug)
95 #Environment variable paths to external headers
96 envvars = { 'MMSOURCE110': 'mmsource-1.10', 'MYSQL5': 'mysql-5.0' }
98 #Look for Metamod:Source and MySQL if not disabled
100 if not self.hasMySql and env == 'MYSQL5':
102 path = self.ResolveEnvPath(env, envvars[env])
104 raise Exception('Could not find a valid path for {0}'.format(env))
105 AMBuild.cache.CacheVariable(env, path)
107 #Look for SDK directories
108 for sdk in self.possibleSdks:
109 #Get list of SDKs to build against or 'all' or 'present'
110 sdkList = AMBuild.options.sdks.split(',')
111 #Build against all supported SDKs?
112 useAll = sdkList[0] == 'all'
113 #Build against supported SDKs that exist?
114 usePresent = sdkList[0] == 'present'
116 info = self.possibleSdks[sdk]
117 if AMBuild.target['platform'] in info['platform']:
120 sdkPath = self.ResolveEnvPath(env, dir)
122 if useAll or sdk in sdkList:
123 raise Exception('Could not find a valid path for {0}'.format(env))
126 if useAll or usePresent or sdk in sdkList:
127 self.sdkInfo[sdk] = info
128 AMBuild.cache.CacheVariable(env, sdkPath)
130 if len(self.sdkInfo) < 1:
131 raise Exception('At least one SDK must be available.')
133 AMBuild.cache.CacheVariable('sdkInfo', self.sdkInfo)
136 cxx = self.compiler.cxx
137 if isinstance(cxx, Cpp.CompatGCC):
138 if isinstance(cxx, Cpp.GCC):
140 elif isinstance(cxx, Cpp.Clang):
141 self.vendor = 'clang'
142 self.compiler.AddToListVar('CDEFINES', 'stricmp=strcasecmp')
143 self.compiler.AddToListVar('CDEFINES', '_stricmp=strcasecmp')
144 self.compiler.AddToListVar('CDEFINES', '_snprintf=snprintf')
145 self.compiler.AddToListVar('CDEFINES', '_vsnprintf=vsnprintf')
146 self.compiler.AddToListVar('CFLAGS', '-pipe')
147 self.compiler.AddToListVar('CFLAGS', '-fno-strict-aliasing')
148 if (self.vendor == 'gcc' and cxx.majorVersion >= 4) or self.vendor == 'clang':
149 self.compiler.AddToListVar('CFLAGS', '-fvisibility=hidden')
150 self.compiler.AddToListVar('CXXFLAGS', '-fvisibility-inlines-hidden')
151 if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersoin >= 6) or self.vendor == 'clang':
152 self.compiler.AddToListVar('CFLAGS', '-Wno-narrowing')
153 self.compiler.AddToListVar('CFLAGS', '-Wall')
154 self.compiler.AddToListVar('CFLAGS', '-Werror')
155 self.compiler.AddToListVar('CFLAGS', '-Wno-uninitialized')
156 self.compiler.AddToListVar('CFLAGS', '-Wno-unused')
157 self.compiler.AddToListVar('CFLAGS', '-Wno-switch')
158 self.compiler.AddToListVar('CFLAGS', '-msse')
159 self.compiler.AddToListVar('CFLAGS', '-g3')
160 self.compiler.AddToListVar('CFLAGS', '-m32')
161 self.compiler.AddToListVar('POSTLINKFLAGS', '-m32')
162 self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions')
163 self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics')
164 self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor')
165 self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual')
166 if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersion >= 7) or \
167 (self.vendor == 'clang' and cxx.majorVersion >= 3):
168 self.compiler.AddToListVar('CXXFLAGS', '-Wno-delete-non-virtual-dtor')
169 self.compiler.AddToListVar('CDEFINES', 'HAVE_STDINT_H')
170 self.compiler.AddToListVar('CDEFINES', 'GNUC')
171 if self.vendor == 'gcc':
172 self.compiler.AddToListVar('CFLAGS', '-mfpmath=sse')
173 elif isinstance(cxx, Cpp.MSVC):
175 if AMBuild.options.debug == '1':
176 self.compiler.AddToListVar('CFLAGS', '/MTd')
177 self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
179 self.compiler.AddToListVar('CFLAGS', '/MT')
180 self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE')
181 self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS')
182 self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE')
183 self.compiler.AddToListVar('CDEFINES', '_ITERATOR_DEBUG_LEVEL=0')
184 self.compiler.AddToListVar('CXXFLAGS', '/EHsc')
185 self.compiler.AddToListVar('CXXFLAGS', '/GR-')
186 self.compiler.AddToListVar('CFLAGS', '/W3')
187 self.compiler.AddToListVar('CFLAGS', '/nologo')
188 self.compiler.AddToListVar('CFLAGS', '/Zi')
189 self.compiler.AddToListVar('CXXFLAGS', '/TP')
190 self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG')
191 self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X86')
192 self.compiler.AddToListVar('POSTLINKFLAGS', '/SUBSYSTEM:WINDOWS')
193 self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib')
194 self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib')
195 self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib')
196 self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib')
197 self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib')
198 self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib')
199 self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib')
200 self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib')
201 self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib')
202 self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib')
203 self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib')
204 self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib')
207 if AMBuild.options.opt == '1':
208 self.compiler.AddToListVar('CDEFINES', 'NDEBUG')
209 if self.vendor == 'gcc' or self.vendor == 'clang':
210 self.compiler.AddToListVar('CFLAGS', '-O3')
211 elif self.vendor == 'msvc':
212 self.compiler.AddToListVar('CFLAGS', '/Ox')
213 self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF')
214 self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF')
217 if AMBuild.options.debug == '1':
218 self.compiler.AddToListVar('CDEFINES', 'DEBUG')
219 self.compiler.AddToListVar('CDEFINES', '_DEBUG')
220 if self.vendor == 'msvc':
221 self.compiler.AddToListVar('CFLAGS', '/Od')
222 self.compiler.AddToListVar('CFLAGS', '/RTC1')
224 #This needs to be after our optimization flags which could otherwise disable it.
225 if self.vendor == 'msvc':
226 # Don't omit frame pointer
227 self.compiler.AddToListVar('CFLAGS', '/Oy-')
230 if AMBuild.target['platform'] == 'linux':
231 self.compiler.AddToListVar('CDEFINES', '_LINUX')
232 self.compiler.AddToListVar('CDEFINES', 'POSIX')
233 if self.vendor == 'gcc':
234 self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc')
235 if self.vendor == 'clang':
236 self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh')
237 elif AMBuild.target['platform'] == 'darwin':
238 self.compiler.AddToListVar('CDEFINES', 'OSX')
239 self.compiler.AddToListVar('CDEFINES', '_OSX')
240 self.compiler.AddToListVar('CDEFINES', 'POSIX')
241 self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5')
242 self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386'])
243 self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++')
245 # For OS X dylib versioning
247 productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
248 productContents = productFile.read()
250 m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
252 self.version = '1.0.0'
254 major, minor, release = m.groups()
255 self.version = '{0}.{1}.{2}'.format(major, minor, release)
256 AMBuild.cache.CacheVariable('version', self.version)
257 elif AMBuild.target['platform'] == 'windows':
258 self.compiler.AddToListVar('CDEFINES', 'WIN32')
259 self.compiler.AddToListVar('CDEFINES', '_WINDOWS')
262 self.compiler.AddToListVar('CDEFINES', 'SOURCEMOD_BUILD')
263 self.compiler.AddToListVar('CDEFINES', 'SM_GENERATED_BUILD')
264 self.compiler.AddToListVar('CINCLUDES',
265 os.path.join(AMBuild.outputFolder, 'includes'))
266 self.compiler.ToConfig(AMBuild, 'compiler')
267 AMBuild.cache.CacheVariable('vendor', self.vendor)
269 AMBuild.cache.CacheVariable('targetMap', self.targetMap)
271 self.sdkInfo = AMBuild.cache['sdkInfo']
272 self.compiler.FromConfig(AMBuild, 'compiler')
273 self.targetMap = AMBuild.cache['targetMap']
274 self.hasMySql = AMBuild.cache['hasMySql']
276 if AMBuild.target['platform'] == 'windows':
277 self.compiler.AddToListVar('RCINCLUDES', os.path.join(AMBuild.sourceFolder, 'public'))
278 self.compiler.AddToListVar('RCINCLUDES',
279 os.path.join(AMBuild.outputFolder, 'includes'))
280 self.mmsPath = AMBuild.cache['MMSOURCE110']
282 def DefaultCompiler(self):
283 return self.compiler.Clone()
285 def JobMatters(self, jobname):
286 file = sys._getframe().f_code.co_filename
287 if AMBuild.mode == 'config':
288 self.targetMap[jobname] = file
290 if len(AMBuild.args) == 0:
292 if not jobname in AMBuild.args:
295 def DefaultExtCompiler(self, path):
296 compiler = self.DefaultCompiler()
297 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path))
298 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path, 'sdk'))
299 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public'))
300 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'extensions'))
301 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'sourcepawn'))
304 def AutoVersion(self, folder, binary):
305 if AMBuild.target['platform'] == 'windows':
306 env = {'RCDEFINES': ['BINARY_NAME="' + binary.binaryFile + '"', 'SM_GENERATED_BUILD']}
307 binary.AddResourceFile(os.path.join(folder, 'version.rc' ), env)
308 elif AMBuild.target['platform'] == 'darwin' and isinstance(binary, Cpp.LibraryBuilder):
309 binary.compiler['POSTLINKFLAGS'].extend(['-compatibility_version', '1.0.0'])
310 binary.compiler['POSTLINKFLAGS'].extend(['-current_version', AMBuild.cache['version']])
314 def ExtractDebugInfo(self, job, binary):
315 src = os.path.join('..', AMBuild.outputFolder, job.workFolder, binary.binaryFile)
316 job.AddCommand(ExtractDebugInfoCommand(binary, src))
318 def PreSetupHL2Job(self, job, builder, sdk):
319 info = self.sdkInfo[sdk]
320 sdkPath = AMBuild.cache[info['sdk']]
321 if AMBuild.target['platform'] == 'linux':
323 staticLibs = os.path.join(sdkPath, 'linux_sdk')
325 staticLibs = os.path.join(sdkPath, 'lib', 'linux')
326 workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
327 if sdk in ['css', 'hl2dm', 'dods', 'tf2', 'l4d2']:
328 libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib_srv.so', 'libtier0_srv.so']
330 link = os.path.join(workFolder, lib)
331 target = os.path.join(staticLibs, lib)
335 job.AddCommand(SymlinkCommand(link, target))
336 elif sdk in ['l4d', 'nd', 'csgo']:
337 libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.so', 'libtier0.so']
339 libs.append('interfaces_i486.a')
341 link = os.path.join(workFolder, lib)
342 target = os.path.join(staticLibs, lib)
346 job.AddCommand(SymlinkCommand(link, target))
348 libs = ['tier1_i486.a', 'mathlib_i486.a', 'vstdlib_i486.so', 'tier0_i486.so']
350 link = os.path.join(workFolder, lib)
351 target = os.path.join(staticLibs, lib)
355 job.AddCommand(SymlinkCommand(link, target))
356 elif AMBuild.target['platform'] == 'darwin':
357 staticLibs = os.path.join(sdkPath, 'lib', 'mac')
358 workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
359 libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.dylib', 'libtier0.dylib']
361 libs.append('interfaces_i486.a')
363 link = os.path.join(workFolder, lib)
364 target = os.path.join(staticLibs, lib)
368 job.AddCommand(SymlinkCommand(link, target))
369 elif AMBuild.target['platform'] == 'windows':
370 libs = ['tier0', 'tier1', 'vstdlib', 'mathlib']
371 if sdk in ['swarm', 'csgo', 'dota']:
372 libs.append('interfaces')
374 libPath = os.path.join(sdkPath, 'lib', 'public', lib) + '.lib'
375 builder.RebuildIfNewer(libPath)
376 builder['POSTLINKFLAGS'].append(libPath)
378 def PostSetupHL2Job(self, job, builder, sdk):
379 if AMBuild.target['platform'] in ['linux', 'darwin']:
380 builder.AddObjectFiles(['tier1_i486.a', 'mathlib_i486.a'])
382 builder.AddObjectFiles(['interfaces_i486.a'])
384 def DefaultHL2Compiler(self, path, sdk, noLink = False, oldMms = '-legacy'):
385 compiler = self.DefaultExtCompiler(path)
391 compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms))
392 compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms, 'sourcehook'))
394 info = self.possibleSdks
395 compiler['CDEFINES'].extend(['SE_' + info[i]['name'] + '=' + info[i]['def'] for i in info])
397 # We don't build for Portal 2 (yet?, ever?), but using this define in code as
398 # it saves trouble if we ever need to
399 compiler['CDEFINES'].append('SE_PORTAL2=14')
401 paths = [['public'], ['public', 'engine'], ['public', 'mathlib'], ['public', 'vstdlib'],
402 ['public', 'tier0'], ['public', 'tier1']]
403 if sdk == 'ep1' or sdk == 'darkm':
404 paths.append(['public', 'dlls'])
405 paths.append(['game_shared'])
407 paths.append(['public', 'game', 'server'])
408 paths.append(['public', 'toolframework'])
409 paths.append(['game', 'shared'])
410 paths.append(['common'])
412 info = self.sdkInfo[sdk]
413 sdkPath = AMBuild.cache[info['sdk']]
415 compiler['CDEFINES'].append('SOURCE_ENGINE=' + info['def'])
417 if sdk in ['swarm','csgo','dota']:
418 if AMBuild.target['platform'] == 'windows':
419 compiler['CDEFINES'].extend(['COMPILER_MSVC', 'COMPILER_MSVC32'])
421 compiler['CDEFINES'].extend(['COMPILER_GCC'])
424 if AMBuild.target['platform'] == 'linux':
425 staticLibs = os.path.join(sdkPath, 'linux_sdk')
427 if AMBuild.target['platform'] == 'linux':
428 staticLibs = os.path.join(sdkPath, 'lib', 'linux')
429 elif AMBuild.target['platform'] == 'darwin':
430 staticLibs = os.path.join(sdkPath, 'lib', 'mac')
433 compiler['CXXINCLUDES'].append(os.path.join(sdkPath, *i))
436 if AMBuild.target['platform'] == 'linux':
437 compiler['POSTLINKFLAGS'][0:0] = ['-lm']
438 if sdk in ['css', 'hl2dm', 'dods', 'tf2', 'l4d2']:
439 compiler['POSTLINKFLAGS'][0:0] = ['libtier0_srv.so']
440 compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib_srv.so']
441 elif sdk in ['l4d', 'nd', 'csgo']:
442 compiler['POSTLINKFLAGS'][0:0] = ['libtier0.so']
443 compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.so']
445 compiler['POSTLINKFLAGS'][0:0] = ['tier0_i486.so']
446 compiler['POSTLINKFLAGS'][0:0] = ['vstdlib_i486.so']
447 elif AMBuild.target['platform'] == 'darwin':
448 compiler['POSTLINKFLAGS'][0:0] = ['libtier0.dylib']
449 compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.dylib']
453 def ResolveEnvPath(self, env, defaultDir):
454 if env in os.environ:
455 path = os.environ[env]
456 if os.path.isdir(path):
461 while head != None and head != oldhead:
462 path = os.path.join(head, defaultDir)
463 if os.path.isdir(path):
466 head, tail = os.path.split(head)
474 AMBuild.Include(os.path.join('tools', 'buildbot', 'Versioning'), globals)
477 ['loader', 'AMBuilder'],
478 ['core', 'AMBuilder'],
479 ['core', 'logic', 'AMBuilder'],
480 ['extensions', 'bintools', 'AMBuilder'],
481 ['extensions', 'clientprefs', 'AMBuilder'],
482 ['extensions', 'cstrike', 'AMBuilder'],
483 ['extensions', 'curl', 'AMBuilder'],
484 ['extensions', 'geoip', 'AMBuilder'],
485 ['extensions', 'mysql', 'AMBuilder'],
486 ['extensions', 'sdkhooks', 'AMBuilder'],
487 ['extensions', 'sdktools', 'AMBuilder'],
488 ['extensions', 'topmenus', 'AMBuilder'],
489 ['extensions', 'updater', 'AMBuilder'],
490 ['extensions', 'sqlite', 'AMBuilder'],
491 ['extensions', 'regex', 'AMBuilder'],
492 ['extensions', 'tf2', 'AMBuilder'],
493 ['sourcepawn', 'jit', 'AMBuilder'],
494 ['sourcepawn', 'compiler', 'AMBuilder'],
495 ['plugins', 'AMBuilder'],
496 ['tools', 'buildbot', 'PackageScript'],
497 ['tools', 'buildbot', 'BreakpadSymbols']
501 FileList.remove(['extensions', 'mysql', 'AMBuilder'])
503 for parts in FileList:
504 AMBuild.Include(os.path.join(*parts), globals)