AMBuildScript
author David Anderson <dvander@alliedmods.net>
Thu Aug 15 16:26:16 2013 -0700 (2013-08-15)
changeset 4022 9c0a32892063
parent 4021 6d1c48cdb6c8
child 4025 542dde661d5c
permissions -rw-r--r--
Fix OS X build.
     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 				if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersion >= 7) or \
   167 						(self.vendor == 'clang' and cxx.majorVersion >= 3):
   168 					self.compiler.AddToListVar('CXXFLAGS', '-Wno-delete-non-virtual-dtor')
   169 				self.compiler.AddToListVar('CDEFINES', 'HAVE_STDINT_H')
   170 				self.compiler.AddToListVar('CDEFINES', 'GNUC')
   171 				if self.vendor == 'gcc':
   172 					self.compiler.AddToListVar('CFLAGS', '-mfpmath=sse')
   173 			elif isinstance(cxx, Cpp.MSVC):
   174 				self.vendor = 'msvc'
   175 				if AMBuild.options.debug == '1':
   176 					self.compiler.AddToListVar('CFLAGS', '/MTd')
   177 					self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
   178 				else:
   179 					self.compiler.AddToListVar('CFLAGS', '/MT')
   180 				self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE')
   181 				self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS')
   182 				self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE')
   183 				self.compiler.AddToListVar('CDEFINES', '_ITERATOR_DEBUG_LEVEL=0')
   184 				self.compiler.AddToListVar('CXXFLAGS', '/EHsc')
   185 				self.compiler.AddToListVar('CXXFLAGS', '/GR-')
   186 				self.compiler.AddToListVar('CFLAGS', '/W3')
   187 				self.compiler.AddToListVar('CFLAGS', '/nologo')
   188 				self.compiler.AddToListVar('CFLAGS', '/Zi')
   189 				self.compiler.AddToListVar('CXXFLAGS', '/TP')
   190 				self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG')
   191 				self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X86')
   192 				self.compiler.AddToListVar('POSTLINKFLAGS', '/SUBSYSTEM:WINDOWS')
   193 				self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib')
   194 				self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib')
   195 				self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib')
   196 				self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib')
   197 				self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib')
   198 				self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib')
   199 				self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib')
   200 				self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib')
   201 				self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib')
   202 				self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib')
   203 				self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib')
   204 				self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib')
   205 
   206 			#Optimization
   207 			if AMBuild.options.opt == '1':
   208 				self.compiler.AddToListVar('CDEFINES', 'NDEBUG')
   209 				if self.vendor == 'gcc' or self.vendor == 'clang':
   210 					self.compiler.AddToListVar('CFLAGS', '-O3')
   211 				elif self.vendor == 'msvc':
   212 					self.compiler.AddToListVar('CFLAGS', '/Ox')
   213 					self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF')
   214 					self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF')
   215 
   216 			#Debugging
   217 			if AMBuild.options.debug == '1':
   218 				self.compiler.AddToListVar('CDEFINES', 'DEBUG')
   219 				self.compiler.AddToListVar('CDEFINES', '_DEBUG')
   220 				if self.vendor == 'msvc':
   221 					self.compiler.AddToListVar('CFLAGS', '/Od')
   222 					self.compiler.AddToListVar('CFLAGS', '/RTC1')
   223 			
   224 			#This needs to be after our optimization flags which could otherwise disable it.
   225 			if self.vendor == 'msvc':
   226 				# Don't omit frame pointer
   227 				self.compiler.AddToListVar('CFLAGS', '/Oy-')
   228 
   229 			#Platform-specifics
   230 			if AMBuild.target['platform'] == 'linux':
   231 				self.compiler.AddToListVar('CDEFINES', '_LINUX')
   232 				self.compiler.AddToListVar('CDEFINES', 'POSIX')
   233 				if self.vendor == 'gcc':
   234 					self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc')
   235 				if self.vendor == 'clang':
   236 					self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh')
   237 			elif AMBuild.target['platform'] == 'darwin':
   238 				self.compiler.AddToListVar('CDEFINES', 'OSX')
   239 				self.compiler.AddToListVar('CDEFINES', '_OSX')
   240 				self.compiler.AddToListVar('CDEFINES', 'POSIX')
   241 				self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5')
   242 				self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386'])
   243 				self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++')
   244 
   245 				# For OS X dylib versioning
   246 				import re
   247 				productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
   248 				productContents = productFile.read()
   249 				productFile.close()
   250 				m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
   251 				if m == None:
   252 					self.version = '1.0.0'
   253 				else:
   254 					major, minor, release = m.groups()
   255 					self.version = '{0}.{1}.{2}'.format(major, minor, release)
   256 				AMBuild.cache.CacheVariable('version', self.version)
   257 			elif AMBuild.target['platform'] == 'windows':
   258 				self.compiler.AddToListVar('CDEFINES', 'WIN32')
   259 				self.compiler.AddToListVar('CDEFINES', '_WINDOWS')
   260 
   261 			#Finish up
   262 			self.compiler.AddToListVar('CDEFINES', 'SOURCEMOD_BUILD')
   263 			self.compiler.AddToListVar('CDEFINES', 'SM_GENERATED_BUILD')
   264 			self.compiler.AddToListVar('CINCLUDES',
   265 			                           os.path.join(AMBuild.outputFolder, 'includes'))
   266 			self.compiler.ToConfig(AMBuild, 'compiler')
   267 			AMBuild.cache.CacheVariable('vendor', self.vendor)
   268 			self.targetMap = { }
   269 			AMBuild.cache.CacheVariable('targetMap', self.targetMap)
   270 		else:
   271 			self.sdkInfo = AMBuild.cache['sdkInfo']
   272 			self.compiler.FromConfig(AMBuild, 'compiler')
   273 			self.targetMap = AMBuild.cache['targetMap']
   274 			self.hasMySql = AMBuild.cache['hasMySql']
   275 
   276 		if AMBuild.target['platform'] == 'windows':
   277 			self.compiler.AddToListVar('RCINCLUDES', os.path.join(AMBuild.sourceFolder, 'public'))
   278 			self.compiler.AddToListVar('RCINCLUDES',
   279 			                           os.path.join(AMBuild.outputFolder, 'includes'))
   280 		self.mmsPath = AMBuild.cache['MMSOURCE110']
   281 
   282 	def DefaultCompiler(self):
   283 		return self.compiler.Clone()
   284 
   285 	def JobMatters(self, jobname):
   286 		file = sys._getframe().f_code.co_filename
   287 		if AMBuild.mode == 'config':
   288 			self.targetMap[jobname] = file
   289 			return True
   290 		if len(AMBuild.args) == 0:
   291 			return True
   292 		if not jobname in AMBuild.args:
   293 			return False
   294 
   295 	def DefaultExtCompiler(self, path):
   296 		compiler = self.DefaultCompiler()
   297 		compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path))
   298 		compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path, 'sdk'))
   299 		compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public'))
   300 		compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'extensions'))
   301 		compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'sourcepawn'))
   302 		return compiler
   303 
   304 	def AutoVersion(self, folder, binary):
   305 		if AMBuild.target['platform'] == 'windows':
   306 			env = {'RCDEFINES': ['BINARY_NAME="' + binary.binaryFile + '"', 'SM_GENERATED_BUILD']}
   307 			binary.AddResourceFile(os.path.join(folder, 'version.rc' ), env)
   308 		elif AMBuild.target['platform'] == 'darwin' and isinstance(binary, Cpp.LibraryBuilder):
   309 			binary.compiler['POSTLINKFLAGS'].extend(['-compatibility_version', '1.0.0'])
   310 			binary.compiler['POSTLINKFLAGS'].extend(['-current_version', AMBuild.cache['version']])
   311 		else:
   312 			return
   313 
   314 	def ExtractDebugInfo(self, job, binary):
   315 		src = os.path.join('..', AMBuild.outputFolder, job.workFolder, binary.binaryFile)
   316 		job.AddCommand(ExtractDebugInfoCommand(binary, src))
   317 
   318 	def PreSetupHL2Job(self, job, builder, sdk):
   319 		info = self.sdkInfo[sdk]
   320 		sdkPath = AMBuild.cache[info['sdk']]
   321 		if AMBuild.target['platform'] == 'linux':
   322 			if sdk == 'ep1':
   323 				staticLibs = os.path.join(sdkPath, 'linux_sdk')
   324 			else:
   325 				staticLibs = os.path.join(sdkPath, 'lib', 'linux')
   326 			workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
   327 			if sdk in ['css', 'hl2dm', 'dods', 'tf2', 'l4d2']:
   328 				libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib_srv.so', 'libtier0_srv.so']
   329 				for lib in libs:
   330 					link = os.path.join(workFolder, lib)
   331 					target = os.path.join(staticLibs, lib)
   332 					try:
   333 						os.lstat(link)
   334 					except:
   335 						job.AddCommand(SymlinkCommand(link, target))
   336 			elif sdk in ['l4d', 'nd', 'csgo']:
   337 				libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.so', 'libtier0.so']
   338 				if sdk == 'csgo':
   339 					libs.append('interfaces_i486.a')
   340 				for lib in libs:
   341 					link = os.path.join(workFolder, lib)
   342 					target = os.path.join(staticLibs, lib)
   343 					try:
   344 						os.lstat(link)
   345 					except:
   346 						job.AddCommand(SymlinkCommand(link, target))
   347 			else:
   348 				libs = ['tier1_i486.a', 'mathlib_i486.a', 'vstdlib_i486.so', 'tier0_i486.so']
   349 				for lib in libs:
   350 					link = os.path.join(workFolder, lib)
   351 					target = os.path.join(staticLibs, lib)
   352 					try:
   353 						os.lstat(link)
   354 					except:
   355 						job.AddCommand(SymlinkCommand(link, target))
   356 		elif AMBuild.target['platform'] == 'darwin':
   357 			staticLibs = os.path.join(sdkPath, 'lib', 'mac')
   358 			workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
   359 			libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.dylib', 'libtier0.dylib']
   360 			if sdk == 'csgo':
   361 				libs.append('interfaces_i486.a')
   362 			for lib in libs:
   363 				link = os.path.join(workFolder, lib)
   364 				target = os.path.join(staticLibs, lib)
   365 				try:
   366 					os.lstat(link)
   367 				except:
   368 					job.AddCommand(SymlinkCommand(link, target))
   369 		elif AMBuild.target['platform'] == 'windows':
   370 			libs = ['tier0', 'tier1', 'vstdlib', 'mathlib']
   371 			if sdk in ['swarm', 'csgo', 'dota']:
   372 				libs.append('interfaces')
   373 			for lib in libs:
   374 				libPath = os.path.join(sdkPath, 'lib', 'public', lib) + '.lib'
   375 				builder.RebuildIfNewer(libPath)
   376 				builder['POSTLINKFLAGS'].append(libPath)
   377 
   378 	def PostSetupHL2Job(self, job, builder, sdk):
   379 		if AMBuild.target['platform'] in ['linux', 'darwin']:
   380 			builder.AddObjectFiles(['tier1_i486.a', 'mathlib_i486.a'])
   381 			if sdk == 'csgo':
   382 				builder.AddObjectFiles(['interfaces_i486.a'])
   383 	
   384 	def DefaultHL2Compiler(self, path, sdk, noLink = False, oldMms = '-legacy'):
   385 		compiler = self.DefaultExtCompiler(path)
   386 
   387 		mms = 'core'
   388 		if sdk == 'ep1':
   389 			mms += oldMms
   390 
   391 		compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms))
   392 		compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms, 'sourcehook'))
   393 
   394 		info = self.possibleSdks
   395 		compiler['CDEFINES'].extend(['SE_' + info[i]['name'] + '=' + info[i]['def'] for i in info])
   396 				
   397 		# We don't build for Portal 2 (yet?, ever?), but using this define in code as 
   398 		# it saves trouble if we ever need to
   399 		compiler['CDEFINES'].append('SE_PORTAL2=14')
   400 
   401 		paths = [['public'], ['public', 'engine'], ['public', 'mathlib'], ['public', 'vstdlib'],
   402 						 ['public', 'tier0'], ['public', 'tier1']]
   403 		if sdk == 'ep1' or sdk == 'darkm':
   404 			paths.append(['public', 'dlls'])
   405 			paths.append(['game_shared'])
   406 		else:
   407 			paths.append(['public', 'game', 'server'])
   408 			paths.append(['public', 'toolframework'])
   409 			paths.append(['game', 'shared'])
   410 			paths.append(['common'])
   411 
   412 		info = self.sdkInfo[sdk]
   413 		sdkPath = AMBuild.cache[info['sdk']]
   414 
   415 		compiler['CDEFINES'].append('SOURCE_ENGINE=' + info['def'])
   416 
   417 		if sdk in ['swarm','csgo','dota']:
   418 			if AMBuild.target['platform'] == 'windows':
   419 				compiler['CDEFINES'].extend(['COMPILER_MSVC', 'COMPILER_MSVC32'])
   420 			else:
   421 				compiler['CDEFINES'].extend(['COMPILER_GCC'])
   422 
   423 		if sdk == 'ep1':
   424 			if AMBuild.target['platform'] == 'linux':
   425 				staticLibs = os.path.join(sdkPath, 'linux_sdk')
   426 		else:
   427 			if AMBuild.target['platform'] == 'linux':
   428 				staticLibs = os.path.join(sdkPath, 'lib', 'linux')
   429 			elif AMBuild.target['platform'] == 'darwin':
   430 				staticLibs = os.path.join(sdkPath, 'lib', 'mac')
   431 
   432 		for i in paths:
   433 			compiler['CXXINCLUDES'].append(os.path.join(sdkPath, *i))
   434 
   435 		if not noLink:
   436 			if AMBuild.target['platform'] == 'linux':
   437 				compiler['POSTLINKFLAGS'][0:0] = ['-lm']
   438 				if sdk in ['css', 'hl2dm', 'dods', 'tf2', 'l4d2']:
   439 					compiler['POSTLINKFLAGS'][0:0] = ['libtier0_srv.so']
   440 					compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib_srv.so']
   441 				elif sdk in ['l4d', 'nd', 'csgo']:
   442 					compiler['POSTLINKFLAGS'][0:0] = ['libtier0.so']
   443 					compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.so']
   444 				else:
   445 					compiler['POSTLINKFLAGS'][0:0] = ['tier0_i486.so']
   446 					compiler['POSTLINKFLAGS'][0:0] = ['vstdlib_i486.so']
   447 			elif AMBuild.target['platform'] == 'darwin':
   448 				compiler['POSTLINKFLAGS'][0:0] = ['libtier0.dylib']
   449 				compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.dylib']
   450 
   451 		return compiler
   452 		
   453 	def ResolveEnvPath(self, env, defaultDir):
   454 		if env in os.environ:
   455 			path = os.environ[env]
   456 			if os.path.isdir(path):
   457 				return path
   458 		else:
   459 			head = os.getcwd()
   460 			oldhead = None
   461 			while head != None and head != oldhead:
   462 				path = os.path.join(head, defaultDir)
   463 				if os.path.isdir(path):
   464 					return path
   465 				oldhead = head
   466 				head, tail = os.path.split(head)
   467 		return None
   468 
   469 sm = SM()
   470 globals = {
   471 	'SM': sm
   472 }
   473 
   474 AMBuild.Include(os.path.join('tools', 'buildbot', 'Versioning'), globals)
   475 
   476 FileList = [
   477 		['loader', 'AMBuilder'],
   478 		['core', 'AMBuilder'],
   479 		['core', 'logic', 'AMBuilder'],
   480 		['extensions', 'bintools', 'AMBuilder'],
   481 		['extensions', 'clientprefs', 'AMBuilder'],
   482 		['extensions', 'cstrike', 'AMBuilder'],
   483 		['extensions', 'curl', 'AMBuilder'],
   484 		['extensions', 'geoip', 'AMBuilder'],
   485 		['extensions', 'mysql', 'AMBuilder'],
   486 		['extensions', 'sdkhooks', 'AMBuilder'],
   487 		['extensions', 'sdktools', 'AMBuilder'],
   488 		['extensions', 'topmenus', 'AMBuilder'],
   489 		['extensions', 'updater', 'AMBuilder'],
   490 		['extensions', 'sqlite', 'AMBuilder'],
   491 		['extensions', 'regex', 'AMBuilder'],
   492 		['extensions', 'tf2', 'AMBuilder'],
   493 		['sourcepawn', 'jit', 'AMBuilder'],
   494 		['sourcepawn', 'compiler', 'AMBuilder'],
   495 		['plugins', 'AMBuilder'],
   496 		['tools', 'buildbot', 'PackageScript'],
   497 		['tools', 'buildbot', 'BreakpadSymbols']
   498 	]
   499 
   500 if not sm.hasMySql:
   501 	FileList.remove(['extensions', 'mysql', 'AMBuilder'])
   502 
   503 for parts in FileList:
   504 	AMBuild.Include(os.path.join(*parts), globals)
   505