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 self.compiler.AddToListVar('CFLAGS', '-Wall')
152 self.compiler.AddToListVar('CFLAGS', '-Werror')
153 self.compiler.AddToListVar('CFLAGS', '-Wno-narrowing')
154 self.compiler.AddToListVar('CFLAGS', '-Wno-uninitialized')
155 self.compiler.AddToListVar('CFLAGS', '-Wno-unused')
156 self.compiler.AddToListVar('CFLAGS', '-Wno-switch')
157 self.compiler.AddToListVar('CFLAGS', '-msse')
158 self.compiler.AddToListVar('CFLAGS', '-g3')
159 self.compiler.AddToListVar('CFLAGS', '-m32')
160 self.compiler.AddToListVar('POSTLINKFLAGS', '-m32')
161 self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions')
162 self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics')
163 self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor')
164 self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual')
165 if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersion >= 7) or \
166 (self.vendor == 'clang' and cxx.majorVersion >= 3):
167 self.compiler.AddToListVar('CXXFLAGS', '-Wno-delete-non-virtual-dtor')
168 self.compiler.AddToListVar('CDEFINES', 'HAVE_STDINT_H')
169 self.compiler.AddToListVar('CDEFINES', 'GNUC')
170 if self.vendor == 'gcc':
171 self.compiler.AddToListVar('CFLAGS', '-mfpmath=sse')
172 elif isinstance(cxx, Cpp.MSVC):
174 if AMBuild.options.debug == '1':
175 self.compiler.AddToListVar('CFLAGS', '/MTd')
176 self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
178 self.compiler.AddToListVar('CFLAGS', '/MT')
179 self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE')
180 self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS')
181 self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE')
182 self.compiler.AddToListVar('CDEFINES', '_ITERATOR_DEBUG_LEVEL=0')
183 self.compiler.AddToListVar('CXXFLAGS', '/EHsc')
184 self.compiler.AddToListVar('CXXFLAGS', '/GR-')
185 self.compiler.AddToListVar('CFLAGS', '/W3')
186 self.compiler.AddToListVar('CFLAGS', '/nologo')
187 self.compiler.AddToListVar('CFLAGS', '/Zi')
188 self.compiler.AddToListVar('CXXFLAGS', '/TP')
189 self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG')
190 self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X86')
191 self.compiler.AddToListVar('POSTLINKFLAGS', '/SUBSYSTEM:WINDOWS')
192 self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib')
193 self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib')
194 self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib')
195 self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib')
196 self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib')
197 self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib')
198 self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib')
199 self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib')
200 self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib')
201 self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib')
202 self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib')
203 self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib')
206 if AMBuild.options.opt == '1':
207 self.compiler.AddToListVar('CDEFINES', 'NDEBUG')
208 if self.vendor == 'gcc' or self.vendor == 'clang':
209 self.compiler.AddToListVar('CFLAGS', '-O3')
210 elif self.vendor == 'msvc':
211 self.compiler.AddToListVar('CFLAGS', '/Ox')
212 self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF')
213 self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF')
216 if AMBuild.options.debug == '1':
217 self.compiler.AddToListVar('CDEFINES', 'DEBUG')
218 self.compiler.AddToListVar('CDEFINES', '_DEBUG')
219 if self.vendor == 'msvc':
220 self.compiler.AddToListVar('CFLAGS', '/Od')
221 self.compiler.AddToListVar('CFLAGS', '/RTC1')
223 #This needs to be after our optimization flags which could otherwise disable it.
224 if self.vendor == 'msvc':
225 # Don't omit frame pointer
226 self.compiler.AddToListVar('CFLAGS', '/Oy-')
229 if AMBuild.target['platform'] == 'linux':
230 self.compiler.AddToListVar('CDEFINES', '_LINUX')
231 self.compiler.AddToListVar('CDEFINES', 'POSIX')
232 if self.vendor == 'gcc':
233 self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc')
234 if self.vendor == 'clang':
235 self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh')
236 elif AMBuild.target['platform'] == 'darwin':
237 self.compiler.AddToListVar('CDEFINES', 'OSX')
238 self.compiler.AddToListVar('CDEFINES', '_OSX')
239 self.compiler.AddToListVar('CDEFINES', 'POSIX')
240 self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5')
241 self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386'])
242 self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++')
244 # For OS X dylib versioning
246 productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
247 productContents = productFile.read()
249 m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
251 self.version = '1.0.0'
253 major, minor, release = m.groups()
254 self.version = '{0}.{1}.{2}'.format(major, minor, release)
255 AMBuild.cache.CacheVariable('version', self.version)
256 elif AMBuild.target['platform'] == 'windows':
257 self.compiler.AddToListVar('CDEFINES', 'WIN32')
258 self.compiler.AddToListVar('CDEFINES', '_WINDOWS')
261 self.compiler.AddToListVar('CDEFINES', 'SOURCEMOD_BUILD')
262 self.compiler.AddToListVar('CDEFINES', 'SM_GENERATED_BUILD')
263 self.compiler.AddToListVar('CINCLUDES',
264 os.path.join(AMBuild.outputFolder, 'includes'))
265 self.compiler.ToConfig(AMBuild, 'compiler')
266 AMBuild.cache.CacheVariable('vendor', self.vendor)
268 AMBuild.cache.CacheVariable('targetMap', self.targetMap)
270 self.sdkInfo = AMBuild.cache['sdkInfo']
271 self.compiler.FromConfig(AMBuild, 'compiler')
272 self.targetMap = AMBuild.cache['targetMap']
273 self.hasMySql = AMBuild.cache['hasMySql']
275 if AMBuild.target['platform'] == 'windows':
276 self.compiler.AddToListVar('RCINCLUDES', os.path.join(AMBuild.sourceFolder, 'public'))
277 self.compiler.AddToListVar('RCINCLUDES',
278 os.path.join(AMBuild.outputFolder, 'includes'))
279 self.mmsPath = AMBuild.cache['MMSOURCE110']
281 def DefaultCompiler(self):
282 return self.compiler.Clone()
284 def JobMatters(self, jobname):
285 file = sys._getframe().f_code.co_filename
286 if AMBuild.mode == 'config':
287 self.targetMap[jobname] = file
289 if len(AMBuild.args) == 0:
291 if not jobname in AMBuild.args:
294 def DefaultExtCompiler(self, path):
295 compiler = self.DefaultCompiler()
296 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path))
297 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path, 'sdk'))
298 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public'))
299 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'extensions'))
300 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'sourcepawn'))
303 def AutoVersion(self, folder, binary):
304 if AMBuild.target['platform'] == 'windows':
305 env = {'RCDEFINES': ['BINARY_NAME="' + binary.binaryFile + '"', 'SM_GENERATED_BUILD']}
306 binary.AddResourceFile(os.path.join(folder, 'version.rc' ), env)
307 elif AMBuild.target['platform'] == 'darwin' and isinstance(binary, Cpp.LibraryBuilder):
308 binary.compiler['POSTLINKFLAGS'].extend(['-compatibility_version', '1.0.0'])
309 binary.compiler['POSTLINKFLAGS'].extend(['-current_version', AMBuild.cache['version']])
313 def ExtractDebugInfo(self, job, binary):
314 src = os.path.join('..', AMBuild.outputFolder, job.workFolder, binary.binaryFile)
315 job.AddCommand(ExtractDebugInfoCommand(binary, src))
317 def PreSetupHL2Job(self, job, builder, sdk):
318 info = self.sdkInfo[sdk]
319 sdkPath = AMBuild.cache[info['sdk']]
320 if AMBuild.target['platform'] == 'linux':
322 staticLibs = os.path.join(sdkPath, 'linux_sdk')
324 staticLibs = os.path.join(sdkPath, 'lib', 'linux')
325 workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
326 if sdk in ['css', 'hl2dm', 'dods', 'tf2', 'l4d2']:
327 libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib_srv.so', 'libtier0_srv.so']
329 link = os.path.join(workFolder, lib)
330 target = os.path.join(staticLibs, lib)
334 job.AddCommand(SymlinkCommand(link, target))
335 elif sdk in ['l4d', 'nd', 'csgo']:
336 libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.so', 'libtier0.so']
338 libs.append('interfaces_i486.a')
340 link = os.path.join(workFolder, lib)
341 target = os.path.join(staticLibs, lib)
345 job.AddCommand(SymlinkCommand(link, target))
347 libs = ['tier1_i486.a', 'mathlib_i486.a', 'vstdlib_i486.so', 'tier0_i486.so']
349 link = os.path.join(workFolder, lib)
350 target = os.path.join(staticLibs, lib)
354 job.AddCommand(SymlinkCommand(link, target))
355 elif AMBuild.target['platform'] == 'darwin':
356 staticLibs = os.path.join(sdkPath, 'lib', 'mac')
357 workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
358 libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.dylib', 'libtier0.dylib']
360 libs.append('interfaces_i486.a')
362 link = os.path.join(workFolder, lib)
363 target = os.path.join(staticLibs, lib)
367 job.AddCommand(SymlinkCommand(link, target))
368 elif AMBuild.target['platform'] == 'windows':
369 libs = ['tier0', 'tier1', 'vstdlib', 'mathlib']
370 if sdk in ['swarm', 'csgo', 'dota']:
371 libs.append('interfaces')
373 libPath = os.path.join(sdkPath, 'lib', 'public', lib) + '.lib'
374 builder.RebuildIfNewer(libPath)
375 builder['POSTLINKFLAGS'].append(libPath)
377 def PostSetupHL2Job(self, job, builder, sdk):
378 if AMBuild.target['platform'] in ['linux', 'darwin']:
379 builder.AddObjectFiles(['tier1_i486.a', 'mathlib_i486.a'])
381 builder.AddObjectFiles(['interfaces_i486.a'])
383 def DefaultHL2Compiler(self, path, sdk, noLink = False, oldMms = '-legacy'):
384 compiler = self.DefaultExtCompiler(path)
390 compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms))
391 compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms, 'sourcehook'))
393 info = self.possibleSdks
394 compiler['CDEFINES'].extend(['SE_' + info[i]['name'] + '=' + info[i]['def'] for i in info])
396 # We don't build for Portal 2 (yet?, ever?), but using this define in code as
397 # it saves trouble if we ever need to
398 compiler['CDEFINES'].append('SE_PORTAL2=14')
400 paths = [['public'], ['public', 'engine'], ['public', 'mathlib'], ['public', 'vstdlib'],
401 ['public', 'tier0'], ['public', 'tier1']]
402 if sdk == 'ep1' or sdk == 'darkm':
403 paths.append(['public', 'dlls'])
404 paths.append(['game_shared'])
406 paths.append(['public', 'game', 'server'])
407 paths.append(['public', 'toolframework'])
408 paths.append(['game', 'shared'])
409 paths.append(['common'])
411 info = self.sdkInfo[sdk]
412 sdkPath = AMBuild.cache[info['sdk']]
414 compiler['CDEFINES'].append('SOURCE_ENGINE=' + info['def'])
416 if sdk in ['swarm','csgo','dota']:
417 if AMBuild.target['platform'] == 'windows':
418 compiler['CDEFINES'].extend(['COMPILER_MSVC', 'COMPILER_MSVC32'])
420 compiler['CDEFINES'].extend(['COMPILER_GCC'])
423 if AMBuild.target['platform'] == 'linux':
424 staticLibs = os.path.join(sdkPath, 'linux_sdk')
426 if AMBuild.target['platform'] == 'linux':
427 staticLibs = os.path.join(sdkPath, 'lib', 'linux')
428 elif AMBuild.target['platform'] == 'darwin':
429 staticLibs = os.path.join(sdkPath, 'lib', 'mac')
432 compiler['CXXINCLUDES'].append(os.path.join(sdkPath, *i))
435 if AMBuild.target['platform'] == 'linux':
436 compiler['POSTLINKFLAGS'][0:0] = ['-lm']
437 if sdk in ['css', 'hl2dm', 'dods', 'tf2', 'l4d2']:
438 compiler['POSTLINKFLAGS'][0:0] = ['libtier0_srv.so']
439 compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib_srv.so']
440 elif sdk in ['l4d', 'nd', 'csgo']:
441 compiler['POSTLINKFLAGS'][0:0] = ['libtier0.so']
442 compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.so']
444 compiler['POSTLINKFLAGS'][0:0] = ['tier0_i486.so']
445 compiler['POSTLINKFLAGS'][0:0] = ['vstdlib_i486.so']
446 elif AMBuild.target['platform'] == 'darwin':
447 compiler['POSTLINKFLAGS'][0:0] = ['libtier0.dylib']
448 compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.dylib']
452 def ResolveEnvPath(self, env, defaultDir):
453 if env in os.environ:
454 path = os.environ[env]
455 if os.path.isdir(path):
460 while head != None and head != oldhead:
461 path = os.path.join(head, defaultDir)
462 if os.path.isdir(path):
465 head, tail = os.path.split(head)
473 AMBuild.Include(os.path.join('tools', 'buildbot', 'Versioning'), globals)
476 ['loader', 'AMBuilder'],
477 ['core', 'AMBuilder'],
478 ['core', 'logic', 'AMBuilder'],
479 ['extensions', 'bintools', 'AMBuilder'],
480 ['extensions', 'clientprefs', 'AMBuilder'],
481 ['extensions', 'cstrike', 'AMBuilder'],
482 ['extensions', 'curl', 'AMBuilder'],
483 ['extensions', 'geoip', 'AMBuilder'],
484 ['extensions', 'mysql', 'AMBuilder'],
485 ['extensions', 'sdkhooks', 'AMBuilder'],
486 ['extensions', 'sdktools', 'AMBuilder'],
487 ['extensions', 'topmenus', 'AMBuilder'],
488 ['extensions', 'updater', 'AMBuilder'],
489 ['extensions', 'sqlite', 'AMBuilder'],
490 ['extensions', 'regex', 'AMBuilder'],
491 ['extensions', 'tf2', 'AMBuilder'],
492 ['sourcepawn', 'jit', 'AMBuilder'],
493 ['sourcepawn', 'compiler', 'AMBuilder'],
494 ['plugins', 'AMBuilder'],
495 ['tools', 'buildbot', 'PackageScript'],
496 ['tools', 'buildbot', 'BreakpadSymbols']
500 FileList.remove(['extensions', 'mysql', 'AMBuilder'])
502 for parts in FileList:
503 AMBuild.Include(os.path.join(*parts), globals)