AMBuildScript
author Scott Ehlert <ds@alliedmods.net>
Wed Mar 13 20:26:08 2013 -0500 (2013-03-13)
changeset 3810 f0393f7c8a9e
parent 3768 4c8f52dc7e84
child 3828 528fb63b2270
permissions -rw-r--r--
Added --sdks option to configure script to specify which SDKs to build againt (bug 5630, r=dvander).

Valid arguments are "all", "present", or a comma delimited list of engine names.

The "all" option will try to build against all supported SDKs. (This is the default.)
The "present" option will only attempt to build against SDKs that exist on the system.

Examples:

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