AMBuildScript
author Dr!fter
Wed Aug 14 16:42:40 2013 -0400 (2013-08-14)
changeset 4009 2484f1516a77
parent 3981 af3681eade3f
child 4018 796b84116088
permissions -rw-r--r--
Update some more CS:GO gamedata
     1 # vim: set ts=2 sw=2 tw=99 noet ft=python:
     2 import os
     3 import sys
     4 from ambuild.command import Command
     5 from ambuild.command import ShellCommand
     6 from ambuild.command import SymlinkCommand
     7 
     8 class ExtractDebugInfoCommand(Command):
     9 	def __init__(self, binary, outfile):
    10 		Command.__init__(self)
    11 		self.binary = binary
    12 		self.outfile = outfile
    13 
    14 	def run(self, runner, job):
    15 		if AMBuild.cache['debug']:
    16 			return
    17 
    18 		if not self.binary.NeedsRelink(self.outfile):
    19 			return
    20 
    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))
    28 
    29 class SM:
    30 	def __init__(self):
    31 		self.compiler = Cpp.Compiler()
    32 
    33 		#Build SDK info
    34 		self.possibleSdks = { }
    35 		self.possibleSdks['ep1'] =   {'sdk': 'HL2SDK',          'ext': '1.ep1',   'def': '1',
    36 		                         'name': 'EPISODEONE',     'platform': ['windows', 'linux'],
    37 		                         'dir': 'hl2sdk'}
    38 		self.possibleSdks['ep2'] =   {'sdk': 'HL2SDKOB',        'ext': '2.ep2',   'def': '3',
    39 		                         'name': 'ORANGEBOX',      'platform': ['windows', 'linux'],
    40 		                         'dir': 'hl2sdk-ob'}
    41 		self.possibleSdks['css'] =   {'sdk': 'HL2SDKCSS',       'ext': '2.css',   'def': '6',
    42 		                         'name': 'CSS',            'platform': ['windows', 'linux', 'darwin'],
    43 		                         'dir': 'hl2sdk-css'}
    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'],
    49 		                        'dir': 'hl2sdk-dods'}
    50 		self.possibleSdks['tf2'] =   {'sdk': 'HL2SDKTF2',       'ext': '2.tf2',   'def': '9',
    51 		                         'name': 'TF2',            'platform': ['windows', 'linux', 'darwin'],
    52 		                        'dir': 'hl2sdk-tf2'}
    53 		self.possibleSdks['l4d'] =   {'sdk': 'HL2SDKL4D',       'ext': '2.l4d',   'def': '10',
    54 		                         'name': 'LEFT4DEAD',      'platform': ['windows', 'linux', 'darwin'],
    55 		                         'dir': 'hl2sdk-l4d'}
    56 		self.possibleSdks['nd'] =    {'sdk': 'HL2SDKND',        'ext': '2.nd',    'def': '11',
    57 		                         'name': 'NUCLEARDAWN',    'platform': ['windows', 'linux', 'darwin'],
    58 		                         'dir': 'hl2sdk-nd'}
    59 		self.possibleSdks['l4d2'] =  {'sdk': 'HL2SDKL4D2',      'ext': '2.l4d2',  'def': '12',
    60 		                         'name': 'LEFT4DEAD2',     'platform': ['windows', 'linux', 'darwin'],
    61 		                         'dir': 'hl2sdk-l4d2'}
    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'],
    70 		                         'dir': 'hl2sdk-bgt'}
    71 		self.possibleSdks['eye'] =   {'sdk': 'HL2SDK-EYE',      'ext': '2.eye',   'def': '5',
    72 		                         'name': 'EYE',            'platform': ['windows'],
    73 		                         'dir': 'hl2sdk-eye'}
    74 		self.possibleSdks['csgo'] =  {'sdk': 'HL2SDKCSGO',     'ext': '2.csgo',   'def': '15',
    75 		                         'name': 'CSGO',           'platform': ['windows', 'linux', 'darwin'],
    76 		                         'dir': 'hl2sdk-csgo'}
    77 		self.possibleSdks['dota'] =  {'sdk': 'HL2SDKDOTA',     'ext': '2.dota',   'def': '16',
    78 		                         'name': 'DOTA',           'platform': ['windows'],
    79 		                         'dir': 'hl2sdk-dota'}
    80 		# self.possibleSdks['portal2'] =  {'sdk': 'HL2SDK-PORTAL2',     'ext': '2.portal2',  'def': '14',
    81 		#                        'name': 'PORTAL2',           'platform': ['windows'],
    82 		#                        'dir': 'hl2sdk-portal2'}
    83 		
    84 		self.sdkInfo = { }
    85 
    86 		if AMBuild.mode == 'config':
    87 			#Detect compilers
    88 			self.compiler.DetectAll(AMBuild)
    89 			
    90 			self.hasMySql = AMBuild.options.hasMySql
    91 			AMBuild.cache.CacheVariable('hasMySql', self.hasMySql)
    92 
    93 			AMBuild.cache.CacheVariable('debug', AMBuild.options.debug)
    94 			
    95 			#Environment variable paths to external headers
    96 			envvars = { 'MMSOURCE110': 'mmsource-1.10', 'MYSQL5': 'mysql-5.0' }
    97 			
    98 			#Look for Metamod:Source and MySQL if not disabled
    99 			for env in envvars:
   100 				if not self.hasMySql and env == 'MYSQL5':
   101 					continue
   102 				path = self.ResolveEnvPath(env, envvars[env])
   103 				if path == None:
   104 					raise Exception('Could not find a valid path for {0}'.format(env))
   105 				AMBuild.cache.CacheVariable(env, path)
   106 			
   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'
   115 
   116 				info = self.possibleSdks[sdk]
   117 				if AMBuild.target['platform'] in info['platform']:
   118 					env = info['sdk']
   119 					dir = info['dir']
   120 					sdkPath = self.ResolveEnvPath(env, dir)
   121 					if sdkPath == None:
   122 						if useAll or sdk in sdkList:
   123 							raise Exception('Could not find a valid path for {0}'.format(env))
   124 						else:
   125 							continue
   126 					if useAll or usePresent or sdk in sdkList:
   127 						self.sdkInfo[sdk] = info
   128 						AMBuild.cache.CacheVariable(env, sdkPath)
   129 
   130 			if len(self.sdkInfo) < 1:
   131 				raise Exception('At least one SDK must be available.')
   132 				
   133 			AMBuild.cache.CacheVariable('sdkInfo', self.sdkInfo)
   134 
   135 			#Set up defines
   136 			cxx = self.compiler.cxx
   137 			if isinstance(cxx, Cpp.CompatGCC):
   138 				if isinstance(cxx, Cpp.GCC):
   139 					self.vendor = '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):
   173 				self.vendor = 'msvc'
   174 				if AMBuild.options.debug == '1':
   175 					self.compiler.AddToListVar('CFLAGS', '/MTd')
   176 					self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
   177 				else:
   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')
   204 
   205 			#Optimization
   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')
   214 
   215 			#Debugging
   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')
   222 			
   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-')
   227 
   228 			#Platform-specifics
   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++')
   243 
   244 				# For OS X dylib versioning
   245 				import re
   246 				productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
   247 				productContents = productFile.read()
   248 				productFile.close()
   249 				m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
   250 				if m == None:
   251 					self.version = '1.0.0'
   252 				else:
   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')
   259 
   260 			#Finish up
   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)
   267 			self.targetMap = { }
   268 			AMBuild.cache.CacheVariable('targetMap', self.targetMap)
   269 		else:
   270 			self.sdkInfo = AMBuild.cache['sdkInfo']
   271 			self.compiler.FromConfig(AMBuild, 'compiler')
   272 			self.targetMap = AMBuild.cache['targetMap']
   273 			self.hasMySql = AMBuild.cache['hasMySql']
   274 
   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']
   280 
   281 	def DefaultCompiler(self):
   282 		return self.compiler.Clone()
   283 
   284 	def JobMatters(self, jobname):
   285 		file = sys._getframe().f_code.co_filename
   286 		if AMBuild.mode == 'config':
   287 			self.targetMap[jobname] = file
   288 			return True
   289 		if len(AMBuild.args) == 0:
   290 			return True
   291 		if not jobname in AMBuild.args:
   292 			return False
   293 
   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'))
   301 		return compiler
   302 
   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']])
   310 		else:
   311 			return
   312 
   313 	def ExtractDebugInfo(self, job, binary):
   314 		src = os.path.join('..', AMBuild.outputFolder, job.workFolder, binary.binaryFile)
   315 		job.AddCommand(ExtractDebugInfoCommand(binary, src))
   316 
   317 	def PreSetupHL2Job(self, job, builder, sdk):
   318 		info = self.sdkInfo[sdk]
   319 		sdkPath = AMBuild.cache[info['sdk']]
   320 		if AMBuild.target['platform'] == 'linux':
   321 			if sdk == 'ep1':
   322 				staticLibs = os.path.join(sdkPath, 'linux_sdk')
   323 			else:
   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']
   328 				for lib in libs:
   329 					link = os.path.join(workFolder, lib)
   330 					target = os.path.join(staticLibs, lib)
   331 					try:
   332 						os.lstat(link)
   333 					except:
   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']
   337 				if sdk == 'csgo':
   338 					libs.append('interfaces_i486.a')
   339 				for lib in libs:
   340 					link = os.path.join(workFolder, lib)
   341 					target = os.path.join(staticLibs, lib)
   342 					try:
   343 						os.lstat(link)
   344 					except:
   345 						job.AddCommand(SymlinkCommand(link, target))
   346 			else:
   347 				libs = ['tier1_i486.a', 'mathlib_i486.a', 'vstdlib_i486.so', 'tier0_i486.so']
   348 				for lib in libs:
   349 					link = os.path.join(workFolder, lib)
   350 					target = os.path.join(staticLibs, lib)
   351 					try:
   352 						os.lstat(link)
   353 					except:
   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']
   359 			if sdk == 'csgo':
   360 				libs.append('interfaces_i486.a')
   361 			for lib in libs:
   362 				link = os.path.join(workFolder, lib)
   363 				target = os.path.join(staticLibs, lib)
   364 				try:
   365 					os.lstat(link)
   366 				except:
   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')
   372 			for lib in libs:
   373 				libPath = os.path.join(sdkPath, 'lib', 'public', lib) + '.lib'
   374 				builder.RebuildIfNewer(libPath)
   375 				builder['POSTLINKFLAGS'].append(libPath)
   376 
   377 	def PostSetupHL2Job(self, job, builder, sdk):
   378 		if AMBuild.target['platform'] in ['linux', 'darwin']:
   379 			builder.AddObjectFiles(['tier1_i486.a', 'mathlib_i486.a'])
   380 			if sdk == 'csgo':
   381 				builder.AddObjectFiles(['interfaces_i486.a'])
   382 	
   383 	def DefaultHL2Compiler(self, path, sdk, noLink = False, oldMms = '-legacy'):
   384 		compiler = self.DefaultExtCompiler(path)
   385 
   386 		mms = 'core'
   387 		if sdk == 'ep1':
   388 			mms += oldMms
   389 
   390 		compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms))
   391 		compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms, 'sourcehook'))
   392 
   393 		info = self.possibleSdks
   394 		compiler['CDEFINES'].extend(['SE_' + info[i]['name'] + '=' + info[i]['def'] for i in info])
   395 				
   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')
   399 
   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'])
   405 		else:
   406 			paths.append(['public', 'game', 'server'])
   407 			paths.append(['public', 'toolframework'])
   408 			paths.append(['game', 'shared'])
   409 			paths.append(['common'])
   410 
   411 		info = self.sdkInfo[sdk]
   412 		sdkPath = AMBuild.cache[info['sdk']]
   413 
   414 		compiler['CDEFINES'].append('SOURCE_ENGINE=' + info['def'])
   415 
   416 		if sdk in ['swarm','csgo','dota']:
   417 			if AMBuild.target['platform'] == 'windows':
   418 				compiler['CDEFINES'].extend(['COMPILER_MSVC', 'COMPILER_MSVC32'])
   419 			else:
   420 				compiler['CDEFINES'].extend(['COMPILER_GCC'])
   421 
   422 		if sdk == 'ep1':
   423 			if AMBuild.target['platform'] == 'linux':
   424 				staticLibs = os.path.join(sdkPath, 'linux_sdk')
   425 		else:
   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')
   430 
   431 		for i in paths:
   432 			compiler['CXXINCLUDES'].append(os.path.join(sdkPath, *i))
   433 
   434 		if not noLink:
   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']
   443 				else:
   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']
   449 
   450 		return compiler
   451 		
   452 	def ResolveEnvPath(self, env, defaultDir):
   453 		if env in os.environ:
   454 			path = os.environ[env]
   455 			if os.path.isdir(path):
   456 				return path
   457 		else:
   458 			head = os.getcwd()
   459 			oldhead = None
   460 			while head != None and head != oldhead:
   461 				path = os.path.join(head, defaultDir)
   462 				if os.path.isdir(path):
   463 					return path
   464 				oldhead = head
   465 				head, tail = os.path.split(head)
   466 		return None
   467 
   468 sm = SM()
   469 globals = {
   470 	'SM': sm
   471 }
   472 
   473 AMBuild.Include(os.path.join('tools', 'buildbot', 'Versioning'), globals)
   474 
   475 FileList = [
   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']
   497 	]
   498 
   499 if not sm.hasMySql:
   500 	FileList.remove(['extensions', 'mysql', 'AMBuilder'])
   501 
   502 for parts in FileList:
   503 	AMBuild.Include(os.path.join(*parts), globals)
   504