Move ke_ headers to new public/amtl folder.
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.minorVersion >= 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 self.compiler.AddToListVar('CXXFLAGS', '-Wno-narrowing')
167 if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersion >= 7) or \
168 (self.vendor == 'clang' and cxx.majorVersion >= 3):
169 self.compiler.AddToListVar('CXXFLAGS', '-Wno-delete-non-virtual-dtor')
170 self.compiler.AddToListVar('CDEFINES', 'HAVE_STDINT_H')
171 self.compiler.AddToListVar('CDEFINES', 'GNUC')
172 if self.vendor == 'gcc':
173 self.compiler.AddToListVar('CFLAGS', '-mfpmath=sse')
174 elif isinstance(cxx, Cpp.MSVC):
176 if AMBuild.options.debug == '1':
177 self.compiler.AddToListVar('CFLAGS', '/MTd')
178 self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
180 self.compiler.AddToListVar('CFLAGS', '/MT')
181 self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE')
182 self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS')
183 self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE')
184 self.compiler.AddToListVar('CDEFINES', '_ITERATOR_DEBUG_LEVEL=0')
185 self.compiler.AddToListVar('CXXFLAGS', '/EHsc')
186 self.compiler.AddToListVar('CXXFLAGS', '/GR-')
187 self.compiler.AddToListVar('CFLAGS', '/W3')
188 self.compiler.AddToListVar('CFLAGS', '/nologo')
189 self.compiler.AddToListVar('CFLAGS', '/Zi')
190 self.compiler.AddToListVar('CXXFLAGS', '/TP')
191 self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG')
192 self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X86')
193 self.compiler.AddToListVar('POSTLINKFLAGS', '/SUBSYSTEM:WINDOWS')
194 self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib')
195 self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib')
196 self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib')
197 self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib')
198 self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib')
199 self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib')
200 self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib')
201 self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib')
202 self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib')
203 self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib')
204 self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib')
205 self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib')
208 if AMBuild.options.opt == '1':
209 self.compiler.AddToListVar('CDEFINES', 'NDEBUG')
210 if self.vendor == 'gcc' or self.vendor == 'clang':
211 self.compiler.AddToListVar('CFLAGS', '-O3')
212 elif self.vendor == 'msvc':
213 self.compiler.AddToListVar('CFLAGS', '/Ox')
214 self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF')
215 self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF')
218 if AMBuild.options.debug == '1':
219 self.compiler.AddToListVar('CDEFINES', 'DEBUG')
220 self.compiler.AddToListVar('CDEFINES', '_DEBUG')
221 if self.vendor == 'msvc':
222 self.compiler.AddToListVar('CFLAGS', '/Od')
223 self.compiler.AddToListVar('CFLAGS', '/RTC1')
225 #This needs to be after our optimization flags which could otherwise disable it.
226 if self.vendor == 'msvc':
227 # Don't omit frame pointer
228 self.compiler.AddToListVar('CFLAGS', '/Oy-')
231 if AMBuild.target['platform'] == 'linux':
232 self.compiler.AddToListVar('CDEFINES', '_LINUX')
233 self.compiler.AddToListVar('CDEFINES', 'POSIX')
234 if self.vendor == 'gcc':
235 self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc')
236 if self.vendor == 'clang':
237 self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh')
238 elif AMBuild.target['platform'] == 'darwin':
239 self.compiler.AddToListVar('CDEFINES', 'OSX')
240 self.compiler.AddToListVar('CDEFINES', '_OSX')
241 self.compiler.AddToListVar('CDEFINES', 'POSIX')
242 self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5')
243 self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386'])
244 self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++')
246 # For OS X dylib versioning
248 productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
249 productContents = productFile.read()
251 m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
253 self.version = '1.0.0'
255 major, minor, release = m.groups()
256 self.version = '{0}.{1}.{2}'.format(major, minor, release)
257 AMBuild.cache.CacheVariable('version', self.version)
258 elif AMBuild.target['platform'] == 'windows':
259 self.compiler.AddToListVar('CDEFINES', 'WIN32')
260 self.compiler.AddToListVar('CDEFINES', '_WINDOWS')
263 self.compiler.AddToListVar('CDEFINES', 'SOURCEMOD_BUILD')
264 self.compiler.AddToListVar('CDEFINES', 'SM_GENERATED_BUILD')
265 self.compiler.AddToListVar('CINCLUDES',
266 os.path.join(AMBuild.outputFolder, 'includes'))
267 self.compiler.ToConfig(AMBuild, 'compiler')
268 AMBuild.cache.CacheVariable('vendor', self.vendor)
270 AMBuild.cache.CacheVariable('targetMap', self.targetMap)
272 self.sdkInfo = AMBuild.cache['sdkInfo']
273 self.compiler.FromConfig(AMBuild, 'compiler')
274 self.targetMap = AMBuild.cache['targetMap']
275 self.hasMySql = AMBuild.cache['hasMySql']
277 if AMBuild.target['platform'] == 'windows':
278 self.compiler.AddToListVar('RCINCLUDES', os.path.join(AMBuild.sourceFolder, 'public'))
279 self.compiler.AddToListVar('RCINCLUDES',
280 os.path.join(AMBuild.outputFolder, 'includes'))
281 self.mmsPath = AMBuild.cache['MMSOURCE110']
283 def DefaultCompiler(self):
284 return self.compiler.Clone()
286 def JobMatters(self, jobname):
287 file = sys._getframe().f_code.co_filename
288 if AMBuild.mode == 'config':
289 self.targetMap[jobname] = file
291 if len(AMBuild.args) == 0:
293 if not jobname in AMBuild.args:
296 def DefaultExtCompiler(self, path):
297 compiler = self.DefaultCompiler()
298 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path))
299 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path, 'sdk'))
300 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public'))
301 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'extensions'))
302 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'sourcepawn'))
303 compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'amtl'))
306 def AutoVersion(self, folder, binary):
307 if AMBuild.target['platform'] == 'windows':
308 env = {'RCDEFINES': ['BINARY_NAME="' + binary.binaryFile + '"', 'SM_GENERATED_BUILD']}
309 binary.AddResourceFile(os.path.join(folder, 'version.rc' ), env)
310 elif AMBuild.target['platform'] == 'darwin' and isinstance(binary, Cpp.LibraryBuilder):
311 binary.compiler['POSTLINKFLAGS'].extend(['-compatibility_version', '1.0.0'])
312 binary.compiler['POSTLINKFLAGS'].extend(['-current_version', AMBuild.cache['version']])
316 def ExtractDebugInfo(self, job, binary):
317 src = os.path.join('..', AMBuild.outputFolder, job.workFolder, binary.binaryFile)
318 job.AddCommand(ExtractDebugInfoCommand(binary, src))
320 def PreSetupHL2Job(self, job, builder, sdk):
321 info = self.sdkInfo[sdk]
322 sdkPath = AMBuild.cache[info['sdk']]
323 if AMBuild.target['platform'] == 'linux':
325 staticLibs = os.path.join(sdkPath, 'linux_sdk')
327 staticLibs = os.path.join(sdkPath, 'lib', 'linux')
328 workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
329 if sdk in ['css', 'hl2dm', 'dods', 'tf2', 'l4d2']:
330 libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib_srv.so', 'libtier0_srv.so']
332 link = os.path.join(workFolder, lib)
333 target = os.path.join(staticLibs, lib)
337 job.AddCommand(SymlinkCommand(link, target))
338 elif sdk in ['l4d', 'nd', 'csgo']:
339 libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.so', 'libtier0.so']
341 libs.append('interfaces_i486.a')
343 link = os.path.join(workFolder, lib)
344 target = os.path.join(staticLibs, lib)
348 job.AddCommand(SymlinkCommand(link, target))
350 libs = ['tier1_i486.a', 'mathlib_i486.a', 'vstdlib_i486.so', 'tier0_i486.so']
352 link = os.path.join(workFolder, lib)
353 target = os.path.join(staticLibs, lib)
357 job.AddCommand(SymlinkCommand(link, target))
358 elif AMBuild.target['platform'] == 'darwin':
359 staticLibs = os.path.join(sdkPath, 'lib', 'mac')
360 workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
361 libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.dylib', 'libtier0.dylib']
363 libs.append('interfaces_i486.a')
365 link = os.path.join(workFolder, lib)
366 target = os.path.join(staticLibs, lib)
370 job.AddCommand(SymlinkCommand(link, target))
371 elif AMBuild.target['platform'] == 'windows':
372 libs = ['tier0', 'tier1', 'vstdlib', 'mathlib']
373 if sdk in ['swarm', 'csgo', 'dota']:
374 libs.append('interfaces')
376 libPath = os.path.join(sdkPath, 'lib', 'public', lib) + '.lib'
377 builder.RebuildIfNewer(libPath)
378 builder['POSTLINKFLAGS'].append(libPath)
380 def PostSetupHL2Job(self, job, builder, sdk):
381 if AMBuild.target['platform'] in ['linux', 'darwin']:
382 builder.AddObjectFiles(['tier1_i486.a', 'mathlib_i486.a'])
384 builder.AddObjectFiles(['interfaces_i486.a'])
386 def DefaultHL2Compiler(self, path, sdk, noLink = False, oldMms = '-legacy'):
387 compiler = self.DefaultExtCompiler(path)
393 compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms))
394 compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms, 'sourcehook'))
396 info = self.possibleSdks
397 compiler['CDEFINES'].extend(['SE_' + info[i]['name'] + '=' + info[i]['def'] for i in info])
399 # We don't build for Portal 2 (yet?, ever?), but using this define in code as
400 # it saves trouble if we ever need to
401 compiler['CDEFINES'].append('SE_PORTAL2=14')
403 paths = [['public'], ['public', 'engine'], ['public', 'mathlib'], ['public', 'vstdlib'],
404 ['public', 'tier0'], ['public', 'tier1']]
405 if sdk == 'ep1' or sdk == 'darkm':
406 paths.append(['public', 'dlls'])
407 paths.append(['game_shared'])
409 paths.append(['public', 'game', 'server'])
410 paths.append(['public', 'toolframework'])
411 paths.append(['game', 'shared'])
412 paths.append(['common'])
414 info = self.sdkInfo[sdk]
415 sdkPath = AMBuild.cache[info['sdk']]
417 compiler['CDEFINES'].append('SOURCE_ENGINE=' + info['def'])
419 if sdk in ['swarm','csgo','dota']:
420 if AMBuild.target['platform'] == 'windows':
421 compiler['CDEFINES'].extend(['COMPILER_MSVC', 'COMPILER_MSVC32'])
423 compiler['CDEFINES'].extend(['COMPILER_GCC'])
426 if AMBuild.target['platform'] == 'linux':
427 staticLibs = os.path.join(sdkPath, 'linux_sdk')
429 if AMBuild.target['platform'] == 'linux':
430 staticLibs = os.path.join(sdkPath, 'lib', 'linux')
431 elif AMBuild.target['platform'] == 'darwin':
432 staticLibs = os.path.join(sdkPath, 'lib', 'mac')
435 compiler['CXXINCLUDES'].append(os.path.join(sdkPath, *i))
438 if AMBuild.target['platform'] == 'linux':
439 compiler['POSTLINKFLAGS'][0:0] = ['-lm']
440 if sdk in ['css', 'hl2dm', 'dods', 'tf2', 'l4d2']:
441 compiler['POSTLINKFLAGS'][0:0] = ['libtier0_srv.so']
442 compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib_srv.so']
443 elif sdk in ['l4d', 'nd', 'csgo']:
444 compiler['POSTLINKFLAGS'][0:0] = ['libtier0.so']
445 compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.so']
447 compiler['POSTLINKFLAGS'][0:0] = ['tier0_i486.so']
448 compiler['POSTLINKFLAGS'][0:0] = ['vstdlib_i486.so']
449 elif AMBuild.target['platform'] == 'darwin':
450 compiler['POSTLINKFLAGS'][0:0] = ['libtier0.dylib']
451 compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.dylib']
455 def ResolveEnvPath(self, env, defaultDir):
456 if env in os.environ:
457 path = os.environ[env]
458 if os.path.isdir(path):
463 while head != None and head != oldhead:
464 path = os.path.join(head, defaultDir)
465 if os.path.isdir(path):
468 head, tail = os.path.split(head)
476 AMBuild.Include(os.path.join('tools', 'buildbot', 'Versioning'), globals)
479 ['loader', 'AMBuilder'],
480 ['core', 'AMBuilder'],
481 ['core', 'logic', 'AMBuilder'],
482 ['extensions', 'bintools', 'AMBuilder'],
483 ['extensions', 'clientprefs', 'AMBuilder'],
484 ['extensions', 'cstrike', 'AMBuilder'],
485 ['extensions', 'curl', 'AMBuilder'],
486 ['extensions', 'geoip', 'AMBuilder'],
487 ['extensions', 'mysql', 'AMBuilder'],
488 ['extensions', 'sdkhooks', 'AMBuilder'],
489 ['extensions', 'sdktools', 'AMBuilder'],
490 ['extensions', 'topmenus', 'AMBuilder'],
491 ['extensions', 'updater', 'AMBuilder'],
492 ['extensions', 'sqlite', 'AMBuilder'],
493 ['extensions', 'regex', 'AMBuilder'],
494 ['extensions', 'tf2', 'AMBuilder'],
495 ['sourcepawn', 'jit', 'AMBuilder'],
496 ['sourcepawn', 'compiler', 'AMBuilder'],
497 ['plugins', 'AMBuilder'],
498 ['tools', 'buildbot', 'PackageScript'],
499 ['tools', 'buildbot', 'BreakpadSymbols']
503 FileList.remove(['extensions', 'mysql', 'AMBuilder'])
505 for parts in FileList:
506 AMBuild.Include(os.path.join(*parts), globals)