dvander@2784: # vim: set ts=2 sw=2 tw=99 noet ft=python: dvander@2784: import os dvander@2784: import sys asherkin@3835: from ambuild.command import Command asherkin@3835: from ambuild.command import ShellCommand dvander@2784: from ambuild.command import SymlinkCommand dvander@2784: asherkin@3835: class ExtractDebugInfoCommand(Command): asherkin@3835: def __init__(self, binary, outfile): asherkin@3835: Command.__init__(self) asherkin@3835: self.binary = binary asherkin@3835: self.outfile = outfile asherkin@3835: asherkin@3835: def run(self, runner, job): asherkin@3890: if AMBuild.cache['debug']: asherkin@3890: return asherkin@3890: asherkin@3835: if not self.binary.NeedsRelink(self.outfile): asherkin@3835: return asherkin@3835: asherkin@3835: if AMBuild.target['platform'] == 'linux': asherkin@3835: job.AddCommand(ShellCommand('objcopy --only-keep-debug ' + self.outfile + ' ' + self.outfile + '.dbg')) asherkin@3835: job.AddCommand(ShellCommand('objcopy --strip-debug ' + self.outfile)) asherkin@3835: job.AddCommand(ShellCommand('objcopy --add-gnu-debuglink=' + os.path.basename(self.outfile) + '.dbg ' + self.outfile)) asherkin@3835: elif AMBuild.target['platform'] == 'darwin': asherkin@3835: job.AddCommand(ShellCommand('dsymutil ' + self.outfile)) asherkin@3835: job.AddCommand(ShellCommand('strip -S ' + self.outfile)) asherkin@3835: dvander@2784: class SM: dvander@2784: def __init__(self): dvander@2784: self.compiler = Cpp.Compiler() dvander@2784: dvander@2784: #Build SDK info reuben@3388: self.possibleSdks = { } reuben@3388: self.possibleSdks['ep1'] = {'sdk': 'HL2SDK', 'ext': '1.ep1', 'def': '1', ds@3810: 'name': 'EPISODEONE', 'platform': ['windows', 'linux'], ds@3810: 'dir': 'hl2sdk'} reuben@3388: self.possibleSdks['ep2'] = {'sdk': 'HL2SDKOB', 'ext': '2.ep2', 'def': '3', ds@3810: 'name': 'ORANGEBOX', 'platform': ['windows', 'linux'], ds@3810: 'dir': 'hl2sdk-ob'} skamonkey@3961: self.possibleSdks['css'] = {'sdk': 'HL2SDKCSS', 'ext': '2.css', 'def': '6', ds@3810: 'name': 'CSS', 'platform': ['windows', 'linux', 'darwin'], ds@3810: 'dir': 'hl2sdk-css'} skamonkey@3961: self.possibleSdks['hl2dm'] = {'sdk': 'HL2SDKHL2DM', 'ext': '2.hl2dm', 'def': '7', skamonkey@3961: 'name': 'HL2DM', 'platform': ['windows', 'linux', 'darwin'], skamonkey@3961: 'dir': 'hl2sdk-hl2dm'} skamonkey@3961: self.possibleSdks['dods'] = {'sdk': 'HL2SDKDODS', 'ext': '2.dods', 'def': '8', skamonkey@3961: 'name': 'DODS', 'platform': ['windows', 'linux', 'darwin'], skamonkey@3961: 'dir': 'hl2sdk-dods'} skamonkey@3961: self.possibleSdks['tf2'] = {'sdk': 'HL2SDKTF2', 'ext': '2.tf2', 'def': '9', skamonkey@3961: 'name': 'TF2', 'platform': ['windows', 'linux', 'darwin'], skamonkey@3961: 'dir': 'hl2sdk-tf2'} skamonkey@3961: self.possibleSdks['l4d'] = {'sdk': 'HL2SDKL4D', 'ext': '2.l4d', 'def': '10', ds@3810: 'name': 'LEFT4DEAD', 'platform': ['windows', 'linux', 'darwin'], ds@3810: 'dir': 'hl2sdk-l4d'} skamonkey@3961: self.possibleSdks['nd'] = {'sdk': 'HL2SDKND', 'ext': '2.nd', 'def': '11', skamonkey@3961: 'name': 'NUCLEARDAWN', 'platform': ['windows', 'linux', 'darwin'], skamonkey@3961: 'dir': 'hl2sdk-nd'} skamonkey@3961: self.possibleSdks['l4d2'] = {'sdk': 'HL2SDKL4D2', 'ext': '2.l4d2', 'def': '12', ds@3810: 'name': 'LEFT4DEAD2', 'platform': ['windows', 'linux', 'darwin'], ds@3810: 'dir': 'hl2sdk-l4d2'} reuben@3388: self.possibleSdks['darkm'] = {'sdk': 'HL2SDK-DARKM', 'ext': '2.darkm', 'def': '2', ds@3810: 'name': 'DARKMESSIAH', 'platform': ['windows'], ds@3810: 'dir': 'hl2sdk-darkm'} skamonkey@3961: self.possibleSdks['swarm'] = {'sdk': 'HL2SDK-SWARM', 'ext': '2.swarm', 'def': '13', ds@3810: 'name': 'ALIENSWARM', 'platform': ['windows'], ds@3810: 'dir': 'hl2sdk-swarm'} skamonkey@3961: self.possibleSdks['bgt'] = {'sdk': 'HL2SDK-BGT', 'ext': '2.bgt', 'def': '4', ds@3810: 'name': 'BLOODYGOODTIME', 'platform': ['windows'], ds@3810: 'dir': 'hl2sdk-bgt'} skamonkey@3961: self.possibleSdks['eye'] = {'sdk': 'HL2SDK-EYE', 'ext': '2.eye', 'def': '5', skamonkey@3961: 'name': 'EYE', 'platform': ['windows'], ds@3810: 'dir': 'hl2sdk-eye'} skamonkey@3961: self.possibleSdks['csgo'] = {'sdk': 'HL2SDKCSGO', 'ext': '2.csgo', 'def': '15', ds@3810: 'name': 'CSGO', 'platform': ['windows', 'linux', 'darwin'], ds@3810: 'dir': 'hl2sdk-csgo'} skamonkey@3961: self.possibleSdks['dota'] = {'sdk': 'HL2SDKDOTA', 'ext': '2.dota', 'def': '16', skamonkey@3856: 'name': 'DOTA', 'platform': ['windows'], skamonkey@3856: 'dir': 'hl2sdk-dota'} skamonkey@3961: # self.possibleSdks['portal2'] = {'sdk': 'HL2SDK-PORTAL2', 'ext': '2.portal2', 'def': '14', ds@3810: # 'name': 'PORTAL2', 'platform': ['windows'], ds@3810: # 'dir': 'hl2sdk-portal2'} reuben@3388: reuben@3388: self.sdkInfo = { } dvander@2784: dvander@2784: if AMBuild.mode == 'config': dvander@2784: #Detect compilers dvander@2784: self.compiler.DetectAll(AMBuild) ds@3828: ds@3828: self.hasMySql = AMBuild.options.hasMySql ds@3828: AMBuild.cache.CacheVariable('hasMySql', self.hasMySql) asherkin@3890: asherkin@3890: AMBuild.cache.CacheVariable('debug', AMBuild.options.debug) ds@3828: ds@3828: #Environment variable paths to external headers skamonkey@3962: envvars = { 'MMSOURCE110': 'mmsource-1.10', 'MYSQL5': 'mysql-5.0' } ds@3810: ds@3828: #Look for Metamod:Source and MySQL if not disabled ds@3810: for env in envvars: ds@3828: if not self.hasMySql and env == 'MYSQL5': ds@3828: continue ds@3810: path = self.ResolveEnvPath(env, envvars[env]) ds@3810: if path == None: ds@3810: raise Exception('Could not find a valid path for {0}'.format(env)) ds@3810: AMBuild.cache.CacheVariable(env, path) ds@3810: ds@3810: #Look for SDK directories ds@3810: for sdk in self.possibleSdks: ds@3810: #Get list of SDKs to build against or 'all' or 'present' ds@3810: sdkList = AMBuild.options.sdks.split(',') ds@3810: #Build against all supported SDKs? ds@3810: useAll = sdkList[0] == 'all' ds@3810: #Build against supported SDKs that exist? ds@3810: usePresent = sdkList[0] == 'present' dvander@2784: ds@3810: info = self.possibleSdks[sdk] ds@3810: if AMBuild.target['platform'] in info['platform']: ds@3810: env = info['sdk'] ds@3810: dir = info['dir'] ds@3810: sdkPath = self.ResolveEnvPath(env, dir) ds@3810: if sdkPath == None: ds@3810: if useAll or sdk in sdkList: ds@3810: raise Exception('Could not find a valid path for {0}'.format(env)) ds@3810: else: ds@3810: continue ds@3810: if useAll or usePresent or sdk in sdkList: reuben@3388: self.sdkInfo[sdk] = info ds@3810: AMBuild.cache.CacheVariable(env, sdkPath) dvander@2784: reuben@3388: if len(self.sdkInfo) < 1: reuben@3388: raise Exception('At least one SDK must be available.') reuben@3388: reuben@3388: AMBuild.cache.CacheVariable('sdkInfo', self.sdkInfo) reuben@3388: dvander@2784: #Set up defines dvander@2784: cxx = self.compiler.cxx ds@3261: if isinstance(cxx, Cpp.CompatGCC): ds@3261: if isinstance(cxx, Cpp.GCC): ds@3261: self.vendor = 'gcc' ds@3261: elif isinstance(cxx, Cpp.Clang): ds@3261: self.vendor = 'clang' dvander@2784: self.compiler.AddToListVar('CDEFINES', 'stricmp=strcasecmp') dvander@2784: self.compiler.AddToListVar('CDEFINES', '_stricmp=strcasecmp') dvander@2784: self.compiler.AddToListVar('CDEFINES', '_snprintf=snprintf') dvander@2784: self.compiler.AddToListVar('CDEFINES', '_vsnprintf=vsnprintf') dvander@2784: self.compiler.AddToListVar('CFLAGS', '-pipe') dvander@2784: self.compiler.AddToListVar('CFLAGS', '-fno-strict-aliasing') ds@3261: if (self.vendor == 'gcc' and cxx.majorVersion >= 4) or self.vendor == 'clang': dvander@2784: self.compiler.AddToListVar('CFLAGS', '-fvisibility=hidden') dvander@2784: self.compiler.AddToListVar('CXXFLAGS', '-fvisibility-inlines-hidden') dvander@2784: self.compiler.AddToListVar('CFLAGS', '-Wall') dvander@2784: self.compiler.AddToListVar('CFLAGS', '-Werror') dvander@2784: self.compiler.AddToListVar('CFLAGS', '-Wno-uninitialized') dvander@2784: self.compiler.AddToListVar('CFLAGS', '-Wno-unused') dvander@2784: self.compiler.AddToListVar('CFLAGS', '-Wno-switch') dvander@2784: self.compiler.AddToListVar('CFLAGS', '-msse') asherkin@3835: self.compiler.AddToListVar('CFLAGS', '-g3') dvander@2784: self.compiler.AddToListVar('CFLAGS', '-m32') dvander@2989: self.compiler.AddToListVar('POSTLINKFLAGS', '-m32') dvander@2784: self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions') dvander@2784: self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics') dvander@2784: self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor') ds@3261: self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual') skamonkey@3503: if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersion >= 7) or \ ds@3472: (self.vendor == 'clang' and cxx.majorVersion >= 3): ds@3472: self.compiler.AddToListVar('CXXFLAGS', '-Wno-delete-non-virtual-dtor') dvander@2784: self.compiler.AddToListVar('CDEFINES', 'HAVE_STDINT_H') asherkin@3361: self.compiler.AddToListVar('CDEFINES', 'GNUC') ds@3261: if self.vendor == 'gcc': ds@3261: self.compiler.AddToListVar('CFLAGS', '-mfpmath=sse') dvander@2784: elif isinstance(cxx, Cpp.MSVC): dvander@2784: self.vendor = 'msvc' dvander@2784: if AMBuild.options.debug == '1': dvander@2784: self.compiler.AddToListVar('CFLAGS', '/MTd') ds@3099: self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt') dvander@2784: else: dvander@2784: self.compiler.AddToListVar('CFLAGS', '/MT') dvander@2784: self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE') dvander@2784: self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS') dvander@2784: self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE') dvander@2784: self.compiler.AddToListVar('CXXFLAGS', '/EHsc') dvander@2784: self.compiler.AddToListVar('CXXFLAGS', '/GR-') dvander@2784: self.compiler.AddToListVar('CFLAGS', '/W3') dvander@2784: self.compiler.AddToListVar('CFLAGS', '/nologo') dvander@2784: self.compiler.AddToListVar('CFLAGS', '/Zi') dvander@2784: self.compiler.AddToListVar('CXXFLAGS', '/TP') dvander@2815: self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X86') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', '/SUBSYSTEM:WINDOWS') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib') dvander@2784: dvander@2784: #Optimization dvander@2784: if AMBuild.options.opt == '1': dvander@2784: self.compiler.AddToListVar('CDEFINES', 'NDEBUG') ds@3261: if self.vendor == 'gcc' or self.vendor == 'clang': dvander@2784: self.compiler.AddToListVar('CFLAGS', '-O3') dvander@2784: elif self.vendor == 'msvc': ds@2998: self.compiler.AddToListVar('CFLAGS', '/Ox') dvander@2784: self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF') ds@2998: self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF') dvander@2784: dvander@2784: #Debugging dvander@2784: if AMBuild.options.debug == '1': dvander@2784: self.compiler.AddToListVar('CDEFINES', 'DEBUG') dvander@2784: self.compiler.AddToListVar('CDEFINES', '_DEBUG') asherkin@3835: if self.vendor == 'msvc': dvander@2784: self.compiler.AddToListVar('CFLAGS', '/Od') dvander@2784: self.compiler.AddToListVar('CFLAGS', '/RTC1') skamonkey@3912: skamonkey@3912: #This needs to be after our optimization flags which could otherwise disable it. skamonkey@3912: if self.vendor == 'msvc': skamonkey@3912: # Don't omit frame pointer skamonkey@3912: self.compiler.AddToListVar('CFLAGS', '/Oy-') dvander@2784: dvander@2784: #Platform-specifics dvander@2784: if AMBuild.target['platform'] == 'linux': dvander@2784: self.compiler.AddToListVar('CDEFINES', '_LINUX') skamonkey@3934: self.compiler.AddToListVar('CDEFINES', 'POSIX') ds@3297: if self.vendor == 'gcc': ds@3297: self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc') ds@3267: if self.vendor == 'clang': ds@3267: self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh') ds@2977: elif AMBuild.target['platform'] == 'darwin': ds@3628: self.compiler.AddToListVar('CDEFINES', 'OSX') ds@3628: self.compiler.AddToListVar('CDEFINES', '_OSX') skamonkey@3934: self.compiler.AddToListVar('CDEFINES', 'POSIX') ds@2981: self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5') ds@2978: self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386']) ds@2993: self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++') ds@3023: ds@3023: # For OS X dylib versioning ds@3023: import re ds@3023: productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r') ds@3023: productContents = productFile.read() ds@3023: productFile.close() ds@3023: m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents) ds@3023: if m == None: ds@3023: self.version = '1.0.0' ds@3023: else: ds@3023: major, minor, release = m.groups() ds@3023: self.version = '{0}.{1}.{2}'.format(major, minor, release) ds@3023: AMBuild.cache.CacheVariable('version', self.version) dvander@2784: elif AMBuild.target['platform'] == 'windows': dvander@2784: self.compiler.AddToListVar('CDEFINES', 'WIN32') dvander@2784: self.compiler.AddToListVar('CDEFINES', '_WINDOWS') dvander@2784: dvander@2784: #Finish up dvander@2784: self.compiler.AddToListVar('CDEFINES', 'SOURCEMOD_BUILD') dvander@2784: self.compiler.AddToListVar('CDEFINES', 'SM_GENERATED_BUILD') dvander@2784: self.compiler.AddToListVar('CINCLUDES', dvander@2784: os.path.join(AMBuild.outputFolder, 'includes')) dvander@2784: self.compiler.ToConfig(AMBuild, 'compiler') dvander@2784: AMBuild.cache.CacheVariable('vendor', self.vendor) dvander@2784: self.targetMap = { } dvander@2784: AMBuild.cache.CacheVariable('targetMap', self.targetMap) dvander@2784: else: reuben@3388: self.sdkInfo = AMBuild.cache['sdkInfo'] dvander@2784: self.compiler.FromConfig(AMBuild, 'compiler') dvander@2784: self.targetMap = AMBuild.cache['targetMap'] ds@3828: self.hasMySql = AMBuild.cache['hasMySql'] dvander@2784: dvander@2784: if AMBuild.target['platform'] == 'windows': ds@2820: self.compiler.AddToListVar('RCINCLUDES', os.path.join(AMBuild.sourceFolder, 'public')) ds@2819: self.compiler.AddToListVar('RCINCLUDES', ds@2819: os.path.join(AMBuild.outputFolder, 'includes')) skamonkey@3962: self.mmsPath = AMBuild.cache['MMSOURCE110'] dvander@2784: dvander@2784: def DefaultCompiler(self): dvander@2784: return self.compiler.Clone() dvander@2784: dvander@2784: def JobMatters(self, jobname): dvander@2784: file = sys._getframe().f_code.co_filename dvander@2784: if AMBuild.mode == 'config': dvander@2784: self.targetMap[jobname] = file dvander@2784: return True dvander@2784: if len(AMBuild.args) == 0: dvander@2784: return True dvander@2784: if not jobname in AMBuild.args: dvander@2784: return False dvander@2784: dvander@2784: def DefaultExtCompiler(self, path): dvander@2784: compiler = self.DefaultCompiler() dvander@2784: compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path)) dvander@2784: compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path, 'sdk')) dvander@2784: compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public')) dvander@2784: compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'extensions')) dvander@2784: compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'sourcepawn')) dvander@2784: return compiler dvander@2784: dvander@2784: def AutoVersion(self, folder, binary): ds@3023: if AMBuild.target['platform'] == 'windows': ds@3023: env = {'RCDEFINES': ['BINARY_NAME="' + binary.binaryFile + '"', 'SM_GENERATED_BUILD']} ds@3023: binary.AddResourceFile(os.path.join(folder, 'version.rc' ), env) ds@3023: elif AMBuild.target['platform'] == 'darwin' and isinstance(binary, Cpp.LibraryBuilder): ds@3023: binary.compiler['POSTLINKFLAGS'].extend(['-compatibility_version', '1.0.0']) ds@3023: binary.compiler['POSTLINKFLAGS'].extend(['-current_version', AMBuild.cache['version']]) ds@3023: else: dvander@2784: return dvander@2784: asherkin@3835: def ExtractDebugInfo(self, job, binary): asherkin@3835: src = os.path.join('..', AMBuild.outputFolder, job.workFolder, binary.binaryFile) asherkin@3835: job.AddCommand(ExtractDebugInfoCommand(binary, src)) asherkin@3835: dvander@2784: def PreSetupHL2Job(self, job, builder, sdk): dvander@2784: info = self.sdkInfo[sdk] dvander@2784: sdkPath = AMBuild.cache[info['sdk']] dvander@2784: if AMBuild.target['platform'] == 'linux': dvander@2784: if sdk == 'ep1': dvander@2784: staticLibs = os.path.join(sdkPath, 'linux_sdk') dvander@2784: else: dvander@2784: staticLibs = os.path.join(sdkPath, 'lib', 'linux') dvander@2784: workFolder = os.path.join(AMBuild.outputFolder, job.workFolder) skamonkey@3961: if sdk in ['css', 'hl2dm', 'dods', 'tf2', 'l4d2']: skamonkey@3668: libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib_srv.so', 'libtier0_srv.so'] skamonkey@3668: for lib in libs: skamonkey@3668: link = os.path.join(workFolder, lib) skamonkey@3668: target = os.path.join(staticLibs, lib) skamonkey@3668: try: skamonkey@3668: os.lstat(link) skamonkey@3668: except: skamonkey@3668: job.AddCommand(SymlinkCommand(link, target)) skamonkey@3961: elif sdk in ['l4d', 'nd', 'csgo']: skamonkey@3515: libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.so', 'libtier0.so'] skamonkey@3515: if sdk == 'csgo': skamonkey@3515: libs.append('interfaces_i486.a') skamonkey@3515: for lib in libs: skamonkey@3515: link = os.path.join(workFolder, lib) skamonkey@3515: target = os.path.join(staticLibs, lib) pred@2854: try: pred@2854: os.lstat(link) pred@2854: except: pred@2854: job.AddCommand(SymlinkCommand(link, target)) pred@2854: else: skamonkey@3515: libs = ['tier1_i486.a', 'mathlib_i486.a', 'vstdlib_i486.so', 'tier0_i486.so'] skamonkey@3515: for lib in libs: skamonkey@3515: link = os.path.join(workFolder, lib) skamonkey@3515: target = os.path.join(staticLibs, lib) pred@2854: try: pred@2854: os.lstat(link) pred@2854: except: pred@2854: job.AddCommand(SymlinkCommand(link, target)) ds@2993: elif AMBuild.target['platform'] == 'darwin': ds@2993: staticLibs = os.path.join(sdkPath, 'lib', 'mac') ds@2993: workFolder = os.path.join(AMBuild.outputFolder, job.workFolder) skamonkey@3515: libs = ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.dylib', 'libtier0.dylib'] skamonkey@3515: if sdk == 'csgo': skamonkey@3515: libs.append('interfaces_i486.a') skamonkey@3515: for lib in libs: skamonkey@3515: link = os.path.join(workFolder, lib) skamonkey@3515: target = os.path.join(staticLibs, lib) ds@2993: try: ds@2993: os.lstat(link) ds@2993: except: ds@2993: job.AddCommand(SymlinkCommand(link, target)) dvander@2784: elif AMBuild.target['platform'] == 'windows': ds@3099: libs = ['tier0', 'tier1', 'vstdlib', 'mathlib'] skamonkey@3856: if sdk in ['swarm', 'csgo', 'dota']: ds@3099: libs.append('interfaces') ds@3099: for lib in libs: dvander@2784: libPath = os.path.join(sdkPath, 'lib', 'public', lib) + '.lib' dvander@2784: builder.RebuildIfNewer(libPath) dvander@2784: builder['POSTLINKFLAGS'].append(libPath) dvander@2784: dvander@2784: def PostSetupHL2Job(self, job, builder, sdk): ds@2993: if AMBuild.target['platform'] in ['linux', 'darwin']: dvander@2784: builder.AddObjectFiles(['tier1_i486.a', 'mathlib_i486.a']) skamonkey@3515: if sdk == 'csgo': skamonkey@3515: builder.AddObjectFiles(['interfaces_i486.a']) asherkin@3457: dvander@2784: def DefaultHL2Compiler(self, path, sdk, noLink = False, oldMms = '-legacy'): dvander@2784: compiler = self.DefaultExtCompiler(path) dvander@2784: dvander@2784: mms = 'core' dvander@2784: if sdk == 'ep1': dvander@2784: mms += oldMms dvander@2784: dvander@2784: compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms)) dvander@2784: compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms, 'sourcehook')) dvander@2784: reuben@3388: info = self.possibleSdks dvander@2784: compiler['CDEFINES'].extend(['SE_' + info[i]['name'] + '=' + info[i]['def'] for i in info]) skamonkey@3515: skamonkey@3515: # We don't build for Portal 2 (yet?, ever?), but using this define in code as skamonkey@3515: # it saves trouble if we ever need to skamonkey@3961: compiler['CDEFINES'].append('SE_PORTAL2=14') dvander@2784: dvander@2784: paths = [['public'], ['public', 'engine'], ['public', 'mathlib'], ['public', 'vstdlib'], dvander@2784: ['public', 'tier0'], ['public', 'tier1']] dvander@2784: if sdk == 'ep1' or sdk == 'darkm': dvander@2784: paths.append(['public', 'dlls']) dvander@2784: paths.append(['game_shared']) dvander@2784: else: dvander@2784: paths.append(['public', 'game', 'server']) skamonkey@3280: paths.append(['public', 'toolframework']) dvander@2785: paths.append(['game', 'shared']) dvander@2784: paths.append(['common']) dvander@2784: dvander@2784: info = self.sdkInfo[sdk] dvander@2784: sdkPath = AMBuild.cache[info['sdk']] dvander@2784: dvander@2784: compiler['CDEFINES'].append('SOURCE_ENGINE=' + info['def']) dvander@2784: skamonkey@3862: if sdk in ['swarm','csgo','dota']: skamonkey@3515: if AMBuild.target['platform'] == 'windows': skamonkey@3515: compiler['CDEFINES'].extend(['COMPILER_MSVC', 'COMPILER_MSVC32']) skamonkey@3515: else: skamonkey@3934: compiler['CDEFINES'].extend(['COMPILER_GCC']) ds@3099: dvander@2784: if sdk == 'ep1': dvander@2784: if AMBuild.target['platform'] == 'linux': dvander@2784: staticLibs = os.path.join(sdkPath, 'linux_sdk') dvander@2784: else: dvander@2784: if AMBuild.target['platform'] == 'linux': dvander@2784: staticLibs = os.path.join(sdkPath, 'lib', 'linux') ds@2993: elif AMBuild.target['platform'] == 'darwin': ds@2993: staticLibs = os.path.join(sdkPath, 'lib', 'mac') dvander@2784: dvander@2784: for i in paths: dvander@2784: compiler['CXXINCLUDES'].append(os.path.join(sdkPath, *i)) dvander@2784: dvander@2784: if not noLink: dvander@2784: if AMBuild.target['platform'] == 'linux': dvander@2784: compiler['POSTLINKFLAGS'][0:0] = ['-lm'] skamonkey@3961: if sdk in ['css', 'hl2dm', 'dods', 'tf2', 'l4d2']: skamonkey@3668: compiler['POSTLINKFLAGS'][0:0] = ['libtier0_srv.so'] skamonkey@3668: compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib_srv.so'] skamonkey@3961: elif sdk in ['l4d', 'nd', 'csgo']: fyrenmoo@2953: compiler['POSTLINKFLAGS'][0:0] = ['libtier0.so'] fyrenmoo@2953: compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.so'] pred@2854: else: pred@2854: compiler['POSTLINKFLAGS'][0:0] = ['tier0_i486.so'] ds@2993: compiler['POSTLINKFLAGS'][0:0] = ['vstdlib_i486.so'] ds@2993: elif AMBuild.target['platform'] == 'darwin': ds@2993: compiler['POSTLINKFLAGS'][0:0] = ['libtier0.dylib'] ds@2993: compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.dylib'] dvander@2784: dvander@2784: return compiler ds@3810: ds@3810: def ResolveEnvPath(self, env, defaultDir): ds@3810: if env in os.environ: ds@3810: path = os.environ[env] ds@3810: if os.path.isdir(path): ds@3810: return path ds@3810: else: ds@3810: head = os.getcwd() ds@3810: oldhead = None ds@3810: while head != None and head != oldhead: ds@3810: path = os.path.join(head, defaultDir) ds@3810: if os.path.isdir(path): ds@3810: return path ds@3810: oldhead = head ds@3810: head, tail = os.path.split(head) ds@3810: return None dvander@2784: dvander@2784: sm = SM() dvander@2784: globals = { dvander@2784: 'SM': sm dvander@2784: } dvander@2784: dvander@2784: AMBuild.Include(os.path.join('tools', 'buildbot', 'Versioning'), globals) dvander@2784: dvander@2784: FileList = [ dvander@2784: ['loader', 'AMBuilder'], skamonkey@3061: ['core', 'AMBuilder'], skamonkey@3060: ['core', 'logic', 'AMBuilder'], dvander@2784: ['extensions', 'bintools', 'AMBuilder'], dvander@2784: ['extensions', 'clientprefs', 'AMBuilder'], dvander@2784: ['extensions', 'cstrike', 'AMBuilder'], dvander@2784: ['extensions', 'curl', 'AMBuilder'], dvander@2784: ['extensions', 'geoip', 'AMBuilder'], asherkin@3541: ['extensions', 'mysql', 'AMBuilder'], skamonkey@3768: ['extensions', 'sdkhooks', 'AMBuilder'], dvander@2784: ['extensions', 'sdktools', 'AMBuilder'], dvander@2784: ['extensions', 'topmenus', 'AMBuilder'], dvander@2784: ['extensions', 'updater', 'AMBuilder'], dvander@2784: ['extensions', 'sqlite', 'AMBuilder'], dvander@2784: ['extensions', 'regex', 'AMBuilder'], dvander@2784: ['extensions', 'tf2', 'AMBuilder'], dvander@2784: ['sourcepawn', 'jit', 'AMBuilder'], dvander@2784: ['sourcepawn', 'compiler', 'AMBuilder'], dvander@2784: ['plugins', 'AMBuilder'], asherkin@3458: ['tools', 'buildbot', 'PackageScript'], asherkin@3458: ['tools', 'buildbot', 'BreakpadSymbols'] dvander@2784: ] dvander@2784: ds@3828: if not sm.hasMySql: ds@3828: FileList.remove(['extensions', 'mysql', 'AMBuilder']) ds@3828: dvander@2784: for parts in FileList: dvander@2784: AMBuild.Include(os.path.join(*parts), globals) dvander@2784: