AMBuildScript
author Nicholas Hastings <skamonkey@gmail.com>
Wed Dec 26 17:57:03 2012 -0500 (2012-12-26)
changeset 3733 a4a0d91d4951
parent 3668 0ddcc9f9a203
child 3743 a98686a77974
permissions -rw-r--r--
Backed out changeset: b65f88522631.
     1 # vim: set ts=2 sw=2 tw=99 noet ft=python:
     2 import os
     3 import sys
     4 from ambuild.command import SymlinkCommand
     5 
     6 class SM:
     7 	def __init__(self):
     8 		self.compiler = Cpp.Compiler()
     9 
    10 		#Build SDK info
    11 		self.possibleSdks = { }
    12 		self.possibleSdks['ep1'] =   {'sdk': 'HL2SDK',          'ext': '1.ep1',   'def': '1',
    13 		                         'name': 'EPISODEONE',     'platform': ['windows', 'linux']}
    14 		self.possibleSdks['ep2'] =   {'sdk': 'HL2SDKOB',        'ext': '2.ep2',   'def': '3',
    15 		                         'name': 'ORANGEBOX',      'platform': ['windows', 'linux']}
    16 		self.possibleSdks['css'] =  {'sdk': 'HL2SDKCSS',   'ext': '2.css',  'def': '6',
    17 		                         'name': 'CSS', 'platform': ['windows', 'linux', 'darwin']}
    18 		self.possibleSdks['ep2v'] =  {'sdk': 'HL2SDKOBVALVE',   'ext': '2.ep2v',  'def': '7',
    19 		                         'name': 'ORANGEBOXVALVE', 'platform': ['windows', 'linux', 'darwin']}
    20 		self.possibleSdks['l4d'] =   {'sdk': 'HL2SDKL4D',       'ext': '2.l4d',   'def': '8',
    21 		                         'name': 'LEFT4DEAD',      'platform': ['windows', 'linux', 'darwin']}
    22 		self.possibleSdks['l4d2'] =  {'sdk': 'HL2SDKL4D2',      'ext': '2.l4d2',  'def': '9',
    23 		                         'name': 'LEFT4DEAD2',     'platform': ['windows', 'linux', 'darwin']}
    24 		self.possibleSdks['darkm'] = {'sdk': 'HL2SDK-DARKM',    'ext': '2.darkm', 'def': '2',
    25 		                         'name': 'DARKMESSIAH',    'platform': ['windows']}
    26 		self.possibleSdks['swarm'] = {'sdk': 'HL2SDK-SWARM',    'ext': '2.swarm', 'def': '10',
    27 		                         'name': 'ALIENSWARM',     'platform': ['windows']}
    28 		self.possibleSdks['bgt'] =   {'sdk': 'HL2SDK-BGT',      'ext': '2.bgt', 'def': '4',
    29 		                         'name': 'BLOODYGOODTIME', 'platform': ['windows']}
    30 		self.possibleSdks['eye'] =   {'sdk': 'HL2SDK-EYE',      'ext': '2.eye', 'def': '5',
    31 		                         'name': 'EYE', 'platform': ['windows']}
    32 		self.possibleSdks['csgo'] =  {'sdk': 'HL2SDKCSGO',     'ext': '2.csgo',  'def': '12',
    33 		                         'name': 'CSGO',           'platform': ['windows', 'linux', 'darwin']}
    34 		# self.possibleSdks['portal2'] =  {'sdk': 'HL2SDK-PORTAL2',     'ext': '2.portal2',  'def': '11',
    35 		#                          'name': 'PORTAL2',           'platform': ['windows']}
    36 		
    37 		self.sdkInfo = { }
    38 
    39 		if AMBuild.mode == 'config':
    40 			#Detect compilers
    41 			self.compiler.DetectAll(AMBuild)
    42 
    43 			#Detect variables
    44 			envvars = { 'MMSOURCE19':    'mmsource-1.9',
    45 									'HL2SDKCSS':     'hl2sdk-css',
    46 									'HL2SDKOBVALVE': 'hl2sdk-ob-valve',
    47 									'HL2SDKL4D':     'hl2sdk-l4d',
    48 									'HL2SDKL4D2':    'hl2sdk-l4d2',
    49 									'HL2SDKCSGO':    'hl2sdk-csgo',
    50 									'MYSQL5':        'mysql-5.0'
    51 			}
    52 
    53 			if AMBuild.target['platform'] != 'darwin':
    54 				envvars['HL2SDK'] = 'hl2sdk'
    55 				envvars['HL2SDKOB'] = 'hl2sdk-ob'
    56 
    57 			#Dark Messiah is Windows-only
    58 			if AMBuild.target['platform'] == 'windows':
    59 				envvars['HL2SDK-DARKM'] = 'hl2sdk-darkm'
    60 				envvars['HL2SDK-SWARM'] = 'hl2sdk-swarm'
    61 				envvars['HL2SDK-BGT']   = 'hl2sdk-bgt'
    62 				envvars['HL2SDK-EYE']   = 'hl2sdk-eye'
    63 
    64 			# Finds if a dict with `key` set to `value` is present on the dict of dicts `dictionary`
    65 			def findDictByKey(dictionary, key, value):
    66 				for index in dictionary:
    67 					elem = dictionary[index]
    68 					if elem[key] == value:
    69 						return (elem, index)
    70 				return None
    71 
    72 			for i in envvars:
    73 				if i in os.environ:
    74 					path = os.environ[i]
    75 					if not os.path.isdir(path):
    76 						raise Exception('Path for {0} was not found: {1}'.format(i, path))
    77 					elif i.startswith('HL2SDK'):
    78 						(info, sdk) = findDictByKey(self.possibleSdks, 'sdk', i)
    79 						self.sdkInfo[sdk] = info
    80 				else:
    81 					head = os.getcwd()
    82 					oldhead = None
    83 					while head != None and head != oldhead:
    84 						path = os.path.join(head, envvars[i])
    85 						if os.path.isdir(path):
    86 							break
    87 						oldhead = head
    88 						head, tail = os.path.split(head)
    89 					if i.startswith('HL2SDK'):
    90 						if head != None and head != oldhead:
    91 							(info, sdk) = findDictByKey(self.possibleSdks, 'sdk', i)
    92 							self.sdkInfo[sdk] = info
    93 					elif head == None or head == oldhead:
    94 						raise Exception('Could not find a valid path for {0}'.format(i))
    95 				AMBuild.cache.CacheVariable(i, path)
    96 
    97 			if len(self.sdkInfo) < 1:
    98 				raise Exception('At least one SDK must be available.')
    99 				
   100 			AMBuild.cache.CacheVariable('sdkInfo', self.sdkInfo)
   101 
   102 			#Set up defines
   103 			cxx = self.compiler.cxx
   104 			if isinstance(cxx, Cpp.CompatGCC):
   105 				if isinstance(cxx, Cpp.GCC):
   106 					self.vendor = 'gcc'
   107 				elif isinstance(cxx, Cpp.Clang):
   108 					self.vendor = 'clang'
   109 				self.compiler.AddToListVar('CDEFINES', 'stricmp=strcasecmp')
   110 				self.compiler.AddToListVar('CDEFINES', '_stricmp=strcasecmp')
   111 				self.compiler.AddToListVar('CDEFINES', '_snprintf=snprintf')
   112 				self.compiler.AddToListVar('CDEFINES', '_vsnprintf=vsnprintf')
   113 				self.compiler.AddToListVar('CFLAGS', '-pipe')
   114 				self.compiler.AddToListVar('CFLAGS', '-fno-strict-aliasing')
   115 				if (self.vendor == 'gcc' and cxx.majorVersion >= 4) or self.vendor == 'clang':
   116 					self.compiler.AddToListVar('CFLAGS', '-fvisibility=hidden')
   117 					self.compiler.AddToListVar('CXXFLAGS', '-fvisibility-inlines-hidden')
   118 				self.compiler.AddToListVar('CFLAGS', '-Wall')
   119 				self.compiler.AddToListVar('CFLAGS', '-Werror')
   120 				self.compiler.AddToListVar('CFLAGS', '-Wno-uninitialized')
   121 				self.compiler.AddToListVar('CFLAGS', '-Wno-unused')
   122 				self.compiler.AddToListVar('CFLAGS', '-Wno-switch')
   123 				self.compiler.AddToListVar('CFLAGS', '-msse')
   124 				self.compiler.AddToListVar('CFLAGS', '-m32')
   125 				self.compiler.AddToListVar('POSTLINKFLAGS', '-m32')
   126 				self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions')
   127 				self.compiler.AddToListVar('CXXFLAGS', '-fno-rtti')
   128 				self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics')
   129 				self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor')
   130 				self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual')
   131 				if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersion >= 7) or \
   132 						(self.vendor == 'clang' and cxx.majorVersion >= 3):
   133 					self.compiler.AddToListVar('CXXFLAGS', '-Wno-delete-non-virtual-dtor')
   134 				self.compiler.AddToListVar('CDEFINES', 'HAVE_STDINT_H')
   135 				self.compiler.AddToListVar('CDEFINES', 'GNUC')
   136 				if self.vendor == 'gcc':
   137 					self.compiler.AddToListVar('CFLAGS', '-mfpmath=sse')
   138 			elif isinstance(cxx, Cpp.MSVC):
   139 				self.vendor = 'msvc'
   140 				if AMBuild.options.debug == '1':
   141 					self.compiler.AddToListVar('CFLAGS', '/MTd')
   142 					self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
   143 				else:
   144 					self.compiler.AddToListVar('CFLAGS', '/MT')
   145 				self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE')
   146 				self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS')
   147 				self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE')
   148 				self.compiler.AddToListVar('CXXFLAGS', '/EHsc')
   149 				self.compiler.AddToListVar('CXXFLAGS', '/GR-')
   150 				self.compiler.AddToListVar('CFLAGS', '/W3')
   151 				self.compiler.AddToListVar('CFLAGS', '/nologo')
   152 				self.compiler.AddToListVar('CFLAGS', '/Zi')
   153 				self.compiler.AddToListVar('CXXFLAGS', '/TP')
   154 				self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG')
   155 				self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X86')
   156 				self.compiler.AddToListVar('POSTLINKFLAGS', '/SUBSYSTEM:WINDOWS')
   157 				self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib')
   158 				self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib')
   159 				self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib')
   160 				self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib')
   161 				self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib')
   162 				self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib')
   163 				self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib')
   164 				self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib')
   165 				self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib')
   166 				self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib')
   167 				self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib')
   168 				self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib')
   169 
   170 			#Optimization
   171 			if AMBuild.options.opt == '1':
   172 				self.compiler.AddToListVar('CDEFINES', 'NDEBUG')
   173 				if self.vendor == 'gcc' or self.vendor == 'clang':
   174 					self.compiler.AddToListVar('CFLAGS', '-O3')
   175 				elif self.vendor == 'msvc':
   176 					self.compiler.AddToListVar('CFLAGS', '/Ox')
   177 					self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF')
   178 					self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF')
   179 
   180 			#Debugging
   181 			if AMBuild.options.debug == '1':
   182 				self.compiler.AddToListVar('CDEFINES', 'DEBUG')
   183 				self.compiler.AddToListVar('CDEFINES', '_DEBUG')
   184 				if self.vendor == 'gcc' or self.vendor == 'clang':
   185 					self.compiler.AddToListVar('CFLAGS', '-g3')
   186 				elif self.vendor == 'msvc':
   187 					self.compiler.AddToListVar('CFLAGS', '/Od')
   188 					self.compiler.AddToListVar('CFLAGS', '/RTC1')
   189 
   190 			#Platform-specifics
   191 			if AMBuild.target['platform'] == 'linux':
   192 				self.compiler.AddToListVar('CDEFINES', '_LINUX')
   193 				if self.vendor == 'gcc':
   194 					self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc')
   195 				if self.vendor == 'clang':
   196 					self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh')
   197 			elif AMBuild.target['platform'] == 'darwin':
   198 				self.compiler.AddToListVar('CDEFINES', 'OSX')
   199 				self.compiler.AddToListVar('CDEFINES', '_OSX')
   200 				self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5')
   201 				self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386'])
   202 				self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++')
   203 
   204 				# For OS X dylib versioning
   205 				import re
   206 				productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
   207 				productContents = productFile.read()
   208 				productFile.close()
   209 				m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
   210 				if m == None:
   211 					self.version = '1.0.0'
   212 				else:
   213 					major, minor, release = m.groups()
   214 					self.version = '{0}.{1}.{2}'.format(major, minor, release)
   215 				AMBuild.cache.CacheVariable('version', self.version)
   216 			elif AMBuild.target['platform'] == 'windows':
   217 				self.compiler.AddToListVar('CDEFINES', 'WIN32')
   218 				self.compiler.AddToListVar('CDEFINES', '_WINDOWS')
   219 
   220 			#Finish up
   221 			self.compiler.AddToListVar('CDEFINES', 'SOURCEMOD_BUILD')
   222 			self.compiler.AddToListVar('CDEFINES', 'SM_GENERATED_BUILD')
   223 			self.compiler.AddToListVar('CINCLUDES',
   224 			                           os.path.join(AMBuild.outputFolder, 'includes'))
   225 			self.compiler.ToConfig(AMBuild, 'compiler')
   226 			AMBuild.cache.CacheVariable('vendor', self.vendor)
   227 			self.targetMap = { }
   228 			AMBuild.cache.CacheVariable('targetMap', self.targetMap)
   229 		else:
   230 			self.sdkInfo = AMBuild.cache['sdkInfo']
   231 			self.compiler.FromConfig(AMBuild, 'compiler')
   232 			self.targetMap = AMBuild.cache['targetMap']
   233 
   234 		if AMBuild.target['platform'] == 'windows':
   235 			self.compiler.AddToListVar('RCINCLUDES', os.path.join(AMBuild.sourceFolder, 'public'))
   236 			self.compiler.AddToListVar('RCINCLUDES',
   237 			                           os.path.join(AMBuild.outputFolder, 'includes'))
   238 		self.mmsPath = AMBuild.cache['MMSOURCE19']
   239 
   240 	def DefaultCompiler(self):
   241 		return self.compiler.Clone()
   242 
   243 	def JobMatters(self, jobname):
   244 		file = sys._getframe().f_code.co_filename
   245 		if AMBuild.mode == 'config':
   246 			self.targetMap[jobname] = file
   247 			return True
   248 		if len(AMBuild.args) == 0:
   249 			return True
   250 		if not jobname in AMBuild.args:
   251 			return False
   252 
   253 	def DefaultExtCompiler(self, path):
   254 		compiler = self.DefaultCompiler()
   255 		compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path))
   256 		compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path, 'sdk'))
   257 		compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public'))
   258 		compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'extensions'))
   259 		compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'sourcepawn'))
   260 		return compiler
   261 
   262 	def AutoVersion(self, folder, binary):
   263 		if AMBuild.target['platform'] == 'windows':
   264 			env = {'RCDEFINES': ['BINARY_NAME="' + binary.binaryFile + '"', 'SM_GENERATED_BUILD']}
   265 			binary.AddResourceFile(os.path.join(folder, 'version.rc' ), env)
   266 		elif AMBuild.target['platform'] == 'darwin' and isinstance(binary, Cpp.LibraryBuilder):
   267 			binary.compiler['POSTLINKFLAGS'].extend(['-compatibility_version', '1.0.0'])
   268 			binary.compiler['POSTLINKFLAGS'].extend(['-current_version', AMBuild.cache['version']])
   269 		else:
   270 			return
   271 
   272 	def PreSetupHL2Job(self, job, builder, sdk):
   273 		info = self.sdkInfo[sdk]
   274 		sdkPath = AMBuild.cache[info['sdk']]
   275 		if AMBuild.target['platform'] == 'linux':
   276 			if sdk == 'ep1':
   277 				staticLibs = os.path.join(sdkPath, 'linux_sdk')
   278 			else:
   279 				staticLibs = os.path.join(sdkPath, 'lib', 'linux')
   280 			workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
   281 			if sdk == 'ep2v':
   282 				libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib_srv.so', 'libtier0_srv.so']
   283 				for lib in libs:
   284 					link = os.path.join(workFolder, lib)
   285 					target = os.path.join(staticLibs, lib)
   286 					try:
   287 						os.lstat(link)
   288 					except:
   289 						job.AddCommand(SymlinkCommand(link, target))
   290 			elif sdk in ['css', 'l4d', 'l4d2', 'csgo']:
   291 				libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.so', 'libtier0.so']
   292 				if sdk == 'csgo':
   293 					libs.append('interfaces_i486.a')
   294 				for lib in libs:
   295 					link = os.path.join(workFolder, lib)
   296 					target = os.path.join(staticLibs, lib)
   297 					try:
   298 						os.lstat(link)
   299 					except:
   300 						job.AddCommand(SymlinkCommand(link, target))
   301 			else:
   302 				libs = ['tier1_i486.a', 'mathlib_i486.a', 'vstdlib_i486.so', 'tier0_i486.so']
   303 				for lib in libs:
   304 					link = os.path.join(workFolder, lib)
   305 					target = os.path.join(staticLibs, lib)
   306 					try:
   307 						os.lstat(link)
   308 					except:
   309 						job.AddCommand(SymlinkCommand(link, target))
   310 		elif AMBuild.target['platform'] == 'darwin':
   311 			staticLibs = os.path.join(sdkPath, 'lib', 'mac')
   312 			workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
   313 			libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.dylib', 'libtier0.dylib']
   314 			if sdk == 'csgo':
   315 				libs.append('interfaces_i486.a')
   316 			for lib in libs:
   317 				link = os.path.join(workFolder, lib)
   318 				target = os.path.join(staticLibs, lib)
   319 				try:
   320 					os.lstat(link)
   321 				except:
   322 					job.AddCommand(SymlinkCommand(link, target))
   323 		elif AMBuild.target['platform'] == 'windows':
   324 			libs = ['tier0', 'tier1', 'vstdlib', 'mathlib']
   325 			if sdk in ['swarm', 'csgo']:
   326 				libs.append('interfaces')
   327 			for lib in libs:
   328 				libPath = os.path.join(sdkPath, 'lib', 'public', lib) + '.lib'
   329 				builder.RebuildIfNewer(libPath)
   330 				builder['POSTLINKFLAGS'].append(libPath)
   331 
   332 	def PostSetupHL2Job(self, job, builder, sdk):
   333 		if AMBuild.target['platform'] in ['linux', 'darwin']:
   334 			builder.AddObjectFiles(['tier1_i486.a', 'mathlib_i486.a'])
   335 			if sdk == 'csgo':
   336 				builder.AddObjectFiles(['interfaces_i486.a'])
   337 	
   338 	def DefaultHL2Compiler(self, path, sdk, noLink = False, oldMms = '-legacy'):
   339 		compiler = self.DefaultExtCompiler(path)
   340 
   341 		mms = 'core'
   342 		if sdk == 'ep1':
   343 			mms += oldMms
   344 
   345 		compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms))
   346 		compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms, 'sourcehook'))
   347 
   348 		info = self.possibleSdks
   349 		compiler['CDEFINES'].extend(['SE_' + info[i]['name'] + '=' + info[i]['def'] for i in info])
   350 				
   351 		# We don't build for Portal 2 (yet?, ever?), but using this define in code as 
   352 		# it saves trouble if we ever need to
   353 		compiler['CDEFINES'].append('SE_PORTAL2=11')
   354 
   355 		paths = [['public'], ['public', 'engine'], ['public', 'mathlib'], ['public', 'vstdlib'],
   356 						 ['public', 'tier0'], ['public', 'tier1']]
   357 		if sdk == 'ep1' or sdk == 'darkm':
   358 			paths.append(['public', 'dlls'])
   359 			paths.append(['game_shared'])
   360 		else:
   361 			paths.append(['public', 'game', 'server'])
   362 			paths.append(['public', 'toolframework'])
   363 			paths.append(['game', 'shared'])
   364 			paths.append(['common'])
   365 
   366 		info = self.sdkInfo[sdk]
   367 		sdkPath = AMBuild.cache[info['sdk']]
   368 
   369 		compiler['CDEFINES'].append('SOURCE_ENGINE=' + info['def'])
   370 
   371 		if sdk in ['swarm','csgo']:
   372 			if AMBuild.target['platform'] == 'windows':
   373 				compiler['CDEFINES'].extend(['COMPILER_MSVC', 'COMPILER_MSVC32'])
   374 			else:
   375 				compiler['CDEFINES'].extend(['COMPILER_GCC', 'POSIX'])
   376 
   377 		if sdk == 'ep1':
   378 			if AMBuild.target['platform'] == 'linux':
   379 				staticLibs = os.path.join(sdkPath, 'linux_sdk')
   380 		else:
   381 			if AMBuild.target['platform'] == 'linux':
   382 				staticLibs = os.path.join(sdkPath, 'lib', 'linux')
   383 			elif AMBuild.target['platform'] == 'darwin':
   384 				staticLibs = os.path.join(sdkPath, 'lib', 'mac')
   385 
   386 		for i in paths:
   387 			compiler['CXXINCLUDES'].append(os.path.join(sdkPath, *i))
   388 
   389 		if not noLink:
   390 			if AMBuild.target['platform'] == 'linux':
   391 				compiler['POSTLINKFLAGS'][0:0] = ['-lm']
   392 				if sdk == 'ep2v':
   393 					compiler['POSTLINKFLAGS'][0:0] = ['libtier0_srv.so']
   394 					compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib_srv.so']
   395 				elif sdk in ['css', 'l4d', 'l4d2', 'csgo']:
   396 					compiler['POSTLINKFLAGS'][0:0] = ['libtier0.so']
   397 					compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.so']
   398 				else:
   399 					compiler['POSTLINKFLAGS'][0:0] = ['tier0_i486.so']
   400 					compiler['POSTLINKFLAGS'][0:0] = ['vstdlib_i486.so']
   401 			elif AMBuild.target['platform'] == 'darwin':
   402 				compiler['POSTLINKFLAGS'][0:0] = ['libtier0.dylib']
   403 				compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.dylib']
   404 
   405 		return compiler
   406 
   407 sm = SM()
   408 globals = {
   409 	'SM': sm
   410 }
   411 
   412 AMBuild.Include(os.path.join('tools', 'buildbot', 'Versioning'), globals)
   413 
   414 FileList = [
   415 		['loader', 'AMBuilder'],
   416 		['core', 'AMBuilder'],
   417 		['core', 'logic', 'AMBuilder'],
   418 		['extensions', 'bintools', 'AMBuilder'],
   419 		['extensions', 'clientprefs', 'AMBuilder'],
   420 		['extensions', 'cstrike', 'AMBuilder'],
   421 		['extensions', 'curl', 'AMBuilder'],
   422 		['extensions', 'geoip', 'AMBuilder'],
   423 		['extensions', 'mysql', 'AMBuilder'],
   424 		['extensions', 'sdktools', 'AMBuilder'],
   425 		['extensions', 'topmenus', 'AMBuilder'],
   426 		['extensions', 'updater', 'AMBuilder'],
   427 		['extensions', 'sqlite', 'AMBuilder'],
   428 		['extensions', 'regex', 'AMBuilder'],
   429 		['extensions', 'tf2', 'AMBuilder'],
   430 		['sourcepawn', 'jit', 'AMBuilder'],
   431 		['sourcepawn', 'compiler', 'AMBuilder'],
   432 		['plugins', 'AMBuilder'],
   433 		['tools', 'buildbot', 'PackageScript'],
   434 		['tools', 'buildbot', 'BreakpadSymbols']
   435 	]
   436 
   437 for parts in FileList:
   438 	AMBuild.Include(os.path.join(*parts), globals)
   439