AMBuildScript
author David Anderson <dvander@alliedmods.net>
Thu Aug 22 16:30:44 2013 -0700 (2013-08-22)
changeset 4030 eb4df1f7ff3c
parent 4025 542dde661d5c
child 4034 2526f3a76ddc
permissions -rw-r--r--
Move ke_ headers to new public/amtl folder.
     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 				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):
   175 				self.vendor = 'msvc'
   176 				if AMBuild.options.debug == '1':
   177 					self.compiler.AddToListVar('CFLAGS', '/MTd')
   178 					self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
   179 				else:
   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')
   206 
   207 			#Optimization
   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')
   216 
   217 			#Debugging
   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')
   224 			
   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-')
   229 
   230 			#Platform-specifics
   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++')
   245 
   246 				# For OS X dylib versioning
   247 				import re
   248 				productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
   249 				productContents = productFile.read()
   250 				productFile.close()
   251 				m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
   252 				if m == None:
   253 					self.version = '1.0.0'
   254 				else:
   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')
   261 
   262 			#Finish up
   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)
   269 			self.targetMap = { }
   270 			AMBuild.cache.CacheVariable('targetMap', self.targetMap)
   271 		else:
   272 			self.sdkInfo = AMBuild.cache['sdkInfo']
   273 			self.compiler.FromConfig(AMBuild, 'compiler')
   274 			self.targetMap = AMBuild.cache['targetMap']
   275 			self.hasMySql = AMBuild.cache['hasMySql']
   276 
   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']
   282 
   283 	def DefaultCompiler(self):
   284 		return self.compiler.Clone()
   285 
   286 	def JobMatters(self, jobname):
   287 		file = sys._getframe().f_code.co_filename
   288 		if AMBuild.mode == 'config':
   289 			self.targetMap[jobname] = file
   290 			return True
   291 		if len(AMBuild.args) == 0:
   292 			return True
   293 		if not jobname in AMBuild.args:
   294 			return False
   295 
   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'))
   304 		return compiler
   305 
   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']])
   313 		else:
   314 			return
   315 
   316 	def ExtractDebugInfo(self, job, binary):
   317 		src = os.path.join('..', AMBuild.outputFolder, job.workFolder, binary.binaryFile)
   318 		job.AddCommand(ExtractDebugInfoCommand(binary, src))
   319 
   320 	def PreSetupHL2Job(self, job, builder, sdk):
   321 		info = self.sdkInfo[sdk]
   322 		sdkPath = AMBuild.cache[info['sdk']]
   323 		if AMBuild.target['platform'] == 'linux':
   324 			if sdk == 'ep1':
   325 				staticLibs = os.path.join(sdkPath, 'linux_sdk')
   326 			else:
   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']
   331 				for lib in libs:
   332 					link = os.path.join(workFolder, lib)
   333 					target = os.path.join(staticLibs, lib)
   334 					try:
   335 						os.lstat(link)
   336 					except:
   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']
   340 				if sdk == 'csgo':
   341 					libs.append('interfaces_i486.a')
   342 				for lib in libs:
   343 					link = os.path.join(workFolder, lib)
   344 					target = os.path.join(staticLibs, lib)
   345 					try:
   346 						os.lstat(link)
   347 					except:
   348 						job.AddCommand(SymlinkCommand(link, target))
   349 			else:
   350 				libs = ['tier1_i486.a', 'mathlib_i486.a', 'vstdlib_i486.so', 'tier0_i486.so']
   351 				for lib in libs:
   352 					link = os.path.join(workFolder, lib)
   353 					target = os.path.join(staticLibs, lib)
   354 					try:
   355 						os.lstat(link)
   356 					except:
   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']
   362 			if sdk == 'csgo':
   363 				libs.append('interfaces_i486.a')
   364 			for lib in libs:
   365 				link = os.path.join(workFolder, lib)
   366 				target = os.path.join(staticLibs, lib)
   367 				try:
   368 					os.lstat(link)
   369 				except:
   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')
   375 			for lib in libs:
   376 				libPath = os.path.join(sdkPath, 'lib', 'public', lib) + '.lib'
   377 				builder.RebuildIfNewer(libPath)
   378 				builder['POSTLINKFLAGS'].append(libPath)
   379 
   380 	def PostSetupHL2Job(self, job, builder, sdk):
   381 		if AMBuild.target['platform'] in ['linux', 'darwin']:
   382 			builder.AddObjectFiles(['tier1_i486.a', 'mathlib_i486.a'])
   383 			if sdk == 'csgo':
   384 				builder.AddObjectFiles(['interfaces_i486.a'])
   385 	
   386 	def DefaultHL2Compiler(self, path, sdk, noLink = False, oldMms = '-legacy'):
   387 		compiler = self.DefaultExtCompiler(path)
   388 
   389 		mms = 'core'
   390 		if sdk == 'ep1':
   391 			mms += oldMms
   392 
   393 		compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms))
   394 		compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms, 'sourcehook'))
   395 
   396 		info = self.possibleSdks
   397 		compiler['CDEFINES'].extend(['SE_' + info[i]['name'] + '=' + info[i]['def'] for i in info])
   398 				
   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')
   402 
   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'])
   408 		else:
   409 			paths.append(['public', 'game', 'server'])
   410 			paths.append(['public', 'toolframework'])
   411 			paths.append(['game', 'shared'])
   412 			paths.append(['common'])
   413 
   414 		info = self.sdkInfo[sdk]
   415 		sdkPath = AMBuild.cache[info['sdk']]
   416 
   417 		compiler['CDEFINES'].append('SOURCE_ENGINE=' + info['def'])
   418 
   419 		if sdk in ['swarm','csgo','dota']:
   420 			if AMBuild.target['platform'] == 'windows':
   421 				compiler['CDEFINES'].extend(['COMPILER_MSVC', 'COMPILER_MSVC32'])
   422 			else:
   423 				compiler['CDEFINES'].extend(['COMPILER_GCC'])
   424 
   425 		if sdk == 'ep1':
   426 			if AMBuild.target['platform'] == 'linux':
   427 				staticLibs = os.path.join(sdkPath, 'linux_sdk')
   428 		else:
   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')
   433 
   434 		for i in paths:
   435 			compiler['CXXINCLUDES'].append(os.path.join(sdkPath, *i))
   436 
   437 		if not noLink:
   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']
   446 				else:
   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']
   452 
   453 		return compiler
   454 		
   455 	def ResolveEnvPath(self, env, defaultDir):
   456 		if env in os.environ:
   457 			path = os.environ[env]
   458 			if os.path.isdir(path):
   459 				return path
   460 		else:
   461 			head = os.getcwd()
   462 			oldhead = None
   463 			while head != None and head != oldhead:
   464 				path = os.path.join(head, defaultDir)
   465 				if os.path.isdir(path):
   466 					return path
   467 				oldhead = head
   468 				head, tail = os.path.split(head)
   469 		return None
   470 
   471 sm = SM()
   472 globals = {
   473 	'SM': sm
   474 }
   475 
   476 AMBuild.Include(os.path.join('tools', 'buildbot', 'Versioning'), globals)
   477 
   478 FileList = [
   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']
   500 	]
   501 
   502 if not sm.hasMySql:
   503 	FileList.remove(['extensions', 'mysql', 'AMBuilder'])
   504 
   505 for parts in FileList:
   506 	AMBuild.Include(os.path.join(*parts), globals)
   507