dvander@4182: # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: dvander@4182: import os, sys asherkin@3890: dvander@4182: class SDK(object): dvander@4182: def __init__(self, sdk, ext, aDef, name, platform, dir): dvander@4182: if dir == 'ep1': dvander@4182: folder = 'hl2sdk' dvander@4182: else: dvander@4182: folder = 'hl2sdk-' + dir dvander@4182: self.envvar = sdk dvander@4182: self.ext = ext dvander@4182: self.code = aDef dvander@4182: self.define = name dvander@4182: self.platform = platform dvander@4182: self.folder = folder # Default folder name. dvander@4182: self.name = dir dvander@4182: self.path = None # Actual path dvander@2784: dvander@4182: WinOnly = ['windows'] dvander@4182: WinLinux = ['windows', 'linux'] dvander@4182: WinLinuxMac = ['windows', 'linux', 'mac'] asherkin@3835: dvander@4182: PossibleSDKs = { dvander@4182: 'ep1': SDK('HL2SDK', '1.ep1', '1', 'EPISODEONE', WinLinux, 'ep1'), dvander@4182: 'ep2': SDK('HL2SDKOB', '2.ep2', '3', 'ORANGEBOX', WinLinux, 'ob'), dvander@4182: 'css': SDK('HL2SDKCSS', '2.css', '6', 'CSS', WinLinuxMac, 'css'), dvander@4182: 'hl2dm': SDK('HL2SDKHL2DM', '2.hl2dm', '7', 'HL2DM', WinLinuxMac, 'hl2dm'), dvander@4182: 'dods': SDK('HL2SDKDODS', '2.dods', '8', 'DODS', WinLinuxMac, 'dods'), dvander@4182: 'sdk2013': SDK('HL2SDK2013', '2.sdk2013', '9', 'SDK2013', WinLinuxMac, '2013'), dvander@4182: 'tf2': SDK('HL2SDKTF2', '2.tf2', '10', 'TF2', WinLinuxMac, 'tf2'), dvander@4182: 'l4d': SDK('HL2SDKL4D', '2.l4d', '11', 'LEFT4DEAD', WinLinuxMac, 'l4d'), dvander@4182: 'nd': SDK('HL2SDKND', '2.nd', '12', 'NUCLEARDAWN', WinLinuxMac, 'nd'), dvander@4182: 'l4d2': SDK('HL2SDKL4D2', '2.l4d2', '13', 'LEFT4DEAD2', WinLinuxMac, 'l4d2'), dvander@4182: 'darkm': SDK('HL2SDK-DARKM', '2.darkm', '2', 'DARKMESSIAH', WinOnly, 'darkm'), dvander@4182: 'swarm': SDK('HL2SDK-SWARM', '2.swarm', '14', 'ALIENSWARM', WinOnly, 'swarm'), dvander@4182: 'bgt': SDK('HL2SDK-BGT', '2.bgt', '4', 'BLOODYGOODTIME', WinOnly, 'bgt'), dvander@4182: 'eye': SDK('HL2SDK-EYE', '2.eye', '5', 'EYE', WinOnly, 'eye'), dvander@4182: 'csgo': SDK('HL2SDKCSGO', '2.csgo', '18', 'CSGO', WinLinuxMac, 'csgo'), dvander@4182: 'dota': SDK('HL2SDKDOTA', '2.dota', '19', 'DOTA', WinOnly, 'dota'), dvander@4182: 'portal2': SDK('HL2SDKPORTAL2', '2.portal2', '15', 'PORTAL2', [], 'portal2'), dvander@4182: 'blade': SDK('HL2SDKBLADE', '2.blade', '16', 'BLADE', WinLinux, 'blade'), dvander@4182: 'insurgency': SDK('HL2SDKINSURGENCY', '2.insurgency', '17', 'INSURGENCY', WinLinuxMac, 'insurgency'), dvander@2784: } dvander@2784: dvander@4182: def ResolveEnvPath(env, folder): dvander@4182: if env in os.environ: dvander@4182: path = os.environ[env] dvander@4182: if os.path.isdir(path): dvander@4182: return path dvander@4182: else: dvander@4182: head = os.getcwd() dvander@4182: oldhead = None dvander@4182: while head != None and head != oldhead: dvander@4182: path = os.path.join(head, folder) dvander@4182: if os.path.isdir(path): dvander@4182: return path dvander@4182: oldhead = head dvander@4182: head, tail = os.path.split(head) dvander@4182: return None dvander@4182: dvander@4182: class SMConfig(object): dvander@4182: def __init__(self): dvander@4182: self.sdks = {} dvander@4182: self.binaries = [] dvander@4186: self.extensions = [] dvander@4187: self.generated_headers = None dvander@4182: self.mms_root = None dvander@4182: self.mysql_root = None dvander@4185: self.spcomp = None dvander@4185: self.smx_files = {} dvander@4188: self.versionlib = None dvander@4182: dvander@4187: def detectProductVersion(self): dvander@4187: builder.AddConfigureFile('product.version') dvander@4187: dvander@4187: # For OS X dylib versioning dvander@4187: import re dvander@4187: with open(os.path.join(builder.sourcePath, 'product.version'), 'r') as fp: dvander@4187: productContents = fp.read() dvander@4187: m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents) dvander@4187: if m == None: dvander@4187: self.productVersion = '1.0.0' dvander@4187: else: dvander@4187: major, minor, release = m.groups() dvander@4187: self.productVersion = '{0}.{1}.{2}'.format(major, minor, release) dvander@4187: dvander@4182: def detectSDKs(self): dvander@4182: sdk_list = builder.options.sdks.split(',') dvander@4182: use_all = sdk_list[0] == 'all' dvander@4182: use_present = sdk_list[0] == 'present' dvander@4182: dvander@4182: for sdk_name in PossibleSDKs: dvander@4182: sdk = PossibleSDKs[sdk_name] dvander@4182: if builder.target_platform in sdk.platform: dvander@4182: sdk_path = ResolveEnvPath(sdk.envvar, sdk.folder) dvander@4182: if sdk_path is None: dvander@4182: if use_all or sdk_name in sdk_list: dvander@4182: raise Exception('Could not find a valid path for {0}'.format(sdk.envvar)) dvander@4182: continue dvander@4182: if use_all or use_present or sdk_name in sdk_list: dvander@4182: sdk.path = sdk_path dvander@4182: self.sdks[sdk_name] = sdk dvander@4182: dvander@4182: if len(self.sdks) < 1: dvander@4182: raise Exception('At least one SDK must be available.') dvander@4182: dvander@4182: self.mms_root = ResolveEnvPath('MMSOURCE110', 'mmsource-1.10') dvander@4182: if not self.mms_root: dvander@4182: self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'mmsource-central') dvander@4182: if not self.mms_root: dvander@4182: raise Exception('Could not find a source copy of Metamod:Source') dvander@4182: dvander@4182: if builder.options.hasMySql: dvander@4182: for i in range(7): dvander@4182: self.mysql_root = ResolveEnvPath('MYSQL5', 'mysql-5.' + str(i)) dvander@4182: if self.mysql_root: dvander@4182: break dvander@4182: if not self.mysql_root: dvander@4182: raise Exception('Could not find a path to MySQL!') dvander@4182: dvander@4182: def configure(self): ds@4201: builder.AddConfigureFile('pushbuild.txt') ds@4201: dvander@4182: cfg = builder.DetectCompilers() dvander@4182: cxx = cfg.cxx dvander@4182: ds@4241: if cxx.behavior == 'gcc': dvander@4182: cfg.defines += [ dvander@4182: 'stricmp=strcasecmp', dvander@4182: '_stricmp=strcasecmp', dvander@4182: '_snprintf=snprintf', dvander@4182: '_vsnprintf=vsnprintf', dvander@4182: 'HAVE_STDINT_H', dvander@4182: 'GNUC', dvander@4182: ] dvander@4182: cfg.cflags += [ dvander@4182: '-pipe', dvander@4182: '-fno-strict-aliasing', dvander@4182: '-Wall', dvander@4182: '-Werror', dvander@4182: '-Wno-uninitialized', dvander@4182: '-Wno-unused', dvander@4182: '-Wno-switch', dvander@4182: '-msse', dvander@4182: '-m32', dvander@4182: ] dvander@4182: ds@4241: have_gcc = cxx.name == 'gcc' ds@4241: have_clang = cxx.name == 'clang' dvander@4182: if have_clang or (have_gcc and cxx.majorVersion >= 4): dvander@4182: cfg.cflags += ['-fvisibility=hidden'] dvander@4182: cfg.cxxflags += ['-fvisibility-inlines-hidden'] dvander@4182: if have_clang or (have_gcc and cxx.minorVersion >= 6): dvander@4182: cfg.cflags += ['-Wno-narrowing'] ds@4205: if (have_gcc and cxx.minorVersion >= 7) or (have_clang and cxx.majorVersion >= 3): dvander@4182: cfg.cxxflags += ['-Wno-delete-non-virtual-dtor'] dvander@4182: dvander@4182: cfg.linkflags += ['-m32'] dvander@4182: cfg.cxxflags += [ dvander@4182: '-fno-exceptions', dvander@4182: '-fno-threadsafe-statics', dvander@4182: '-Wno-non-virtual-dtor', dvander@4182: '-Wno-overloaded-virtual', dvander@4182: ] dvander@4182: dvander@4182: if have_gcc: dvander@4182: cfg.cflags += ['-mfpmath=sse'] dvander@4182: elif cxx.name == 'msvc': dvander@4182: if builder.options.debug == '1': dvander@4182: cfg.cflags += ['/MTd'] dvander@4182: cfg.linkflags += ['/NODEFAULTLIB:libcmt'] dvander@4182: else: dvander@4182: cfg.cflags += ['/MT'] dvander@4182: cfg.defines += [ dvander@4182: '_CRT_SECURE_NO_DEPRECATE', dvander@4182: '_CRT_SECURE_NO_WARNINGS', dvander@4182: '_CRT_NONSTDC_NO_DEPRECATE', dvander@4182: '_ITERATOR_DEBUG_LEVEL=0', dvander@4182: ] dvander@4182: cfg.cflags += [ dvander@4182: '/W3', dvander@4182: ] dvander@4182: cfg.cxxflags += [ dvander@4182: '/EHsc', dvander@4182: '/GR-', dvander@4182: '/TP', dvander@4182: ] dvander@4182: cfg.linkflags += [ dvander@4182: '/MACHINE:X86', dvander@4182: '/SUBSYSTEM:WINDOWS', dvander@4182: 'kernel32.lib', dvander@4182: 'user32.lib', dvander@4182: 'gdi32.lib', dvander@4182: 'winspool.lib', dvander@4182: 'comdlg32.lib', dvander@4182: 'advapi32.lib', dvander@4182: 'shell32.lib', dvander@4182: 'ole32.lib', dvander@4182: 'oleaut32.lib', dvander@4182: 'uuid.lib', dvander@4182: 'odbc32.lib', dvander@4182: 'odbccp32.lib', dvander@4182: ] dvander@4182: dvander@4182: # Optimization dvander@4182: if builder.options.opt == '1': dvander@4182: cfg.defines += ['NDEBUG'] dvander@4182: if cxx.behavior == 'gcc': dvander@4182: cfg.cflags += ['-O3'] dvander@4182: elif cxx.behavior == 'msvc': dvander@4182: cfg.cflags += ['/Ox'] dvander@4182: cfg.linkflags += ['/OPT:ICF', '/OPT:REF'] dvander@4182: dvander@4182: # Debugging dvander@4182: if builder.options.debug == '1': dvander@4182: cfg.defines += ['DEBUG', '_DEBUG'] dvander@4189: if cxx.behavior == 'msvc': dvander@4182: cfg.cflags += ['/Od', '/RTC1'] dvander@4182: dvander@4182: # This needs to be after our optimization flags which could otherwise disable it. dvander@4182: if cxx.name == 'msvc': dvander@4182: # Don't omit the frame pointer. dvander@4182: cfg.cflags += ['/Oy-'] dvander@4182: dvander@4182: # Platform-specifics dvander@4182: if builder.target_platform == 'linux': dvander@4182: cfg.defines += ['_LINUX', 'POSIX'] dvander@4182: if cxx.name == 'gcc': dvander@4182: cfg.linkflags += ['-static-libgcc'] dvander@4182: elif cxx.name == 'clang': dvander@4182: cfg.linkflags += ['-lgcc_eh'] dvander@4182: elif builder.target_platform == 'mac': dvander@4182: cfg.defines += ['OSX', '_OSX', 'POSIX'] dvander@4182: cfg.linkflags += [ dvander@4182: '-mmacosx-version-min=10.5', dvander@4182: '-arch', 'i386', dvander@4182: '-lstdc++', dvander@4191: '-stdlib=libstdc++', dvander@4182: ] dvander@4191: cfg.cxxflags += ['-stdlib=libstdc++'] dvander@4182: elif builder.target_platform == 'windows': dvander@4182: cfg.defines += ['WIN32', '_WINDOWS'] dvander@2784: dvander@4182: # Finish up. dvander@4182: cfg.defines += [ dvander@4182: 'SOURCEMOD_BUILD', dvander@4187: 'SM_GENERATED_BUILD', dvander@4188: 'SM_USE_VERSIONLIB', dvander@4182: ] dvander@4182: cfg.includes += [os.path.join(builder.buildPath, 'includes')] dvander@4188: cfg.includes += [os.path.join(builder.sourcePath, 'versionlib')] dvander@4182: dvander@4182: def LibraryBuilder(self, compiler, name): dvander@4182: binary = compiler.Library(name) dvander@4187: if builder.target_platform == 'windows': dvander@4187: binary.sources += ['version.rc'] dvander@4187: binary.compiler.rcdefines += [ dvander@4187: 'BINARY_NAME="{0}"'.format(binary.outputFile), dvander@4190: 'SM_GENERATED_BUILD', dvander@4190: 'RC_COMPILE', dvander@4187: ] dvander@4187: elif builder.target_platform == 'mac': dvander@4187: binary.compiler.postlink += [ dvander@4187: '-compatibility_version', '1.0.0', dvander@4187: '-current_version', self.productVersion dvander@4187: ] dvander@4188: binary.compiler.linkflags += [self.versionlib] dvander@4187: binary.compiler.sourcedeps += SM.generated_headers dvander@4182: return binary dvander@4182: dvander@4182: def ProgramBuilder(self, compiler, name): dvander@4182: binary = compiler.Program(name) dvander@4187: if builder.target_platform == 'windows': dvander@4187: binary.sources += ['version.rc'] dvander@4187: binary.compiler.rcdefines += [ dvander@4187: 'BINARY_NAME="{0}"'.format(binary.outputFile), dvander@4190: 'SM_GENERATED_BUILD', dvander@4190: 'RC_COMPILE', dvander@4187: ] dvander@4188: binary.compiler.linkflags += [self.versionlib] dvander@4187: binary.compiler.sourcedeps += SM.generated_headers dvander@4182: return binary dvander@4182: dvander@4182: def Library(self, context, name): dvander@4182: compiler = context.compiler.clone() dvander@4182: return self.LibraryBuilder(compiler, name) dvander@4182: dvander@4182: def Program(self, context, name): dvander@4182: compiler = context.compiler.clone() dvander@4182: return self.ProgramBuilder(compiler, name) dvander@4182: dvander@4182: def ExtCompiler(self, context): dvander@4182: compiler = context.compiler.clone() dvander@4182: compiler.cxxincludes += [ dvander@4182: os.path.join(context.currentSourcePath), dvander@4182: os.path.join(context.currentSourcePath, 'sdk'), dvander@4182: os.path.join(builder.sourcePath, 'public'), dvander@4182: os.path.join(builder.sourcePath, 'public', 'extensions'), dvander@4182: os.path.join(builder.sourcePath, 'public', 'sourcepawn'), dvander@4182: os.path.join(builder.sourcePath, 'public', 'amtl'), dvander@4182: ] dvander@4182: return compiler dvander@4182: dvander@4182: def HL2Compiler(self, context, sdk): dvander@4182: compiler = self.ExtCompiler(context) dvander@4182: dvander@4182: if sdk.name == 'ep1': dvander@4182: mms_path = os.path.join(self.mms_root, 'core-legacy') dvander@4182: else: dvander@4182: mms_path = os.path.join(self.mms_root, 'core') dvander@4182: dvander@4182: compiler.cxxincludes += [ dvander@4182: os.path.join(mms_path), dvander@4182: os.path.join(mms_path, 'sourcehook'), dvander@4182: ] dvander@4182: dvander@4182: defines = ['SE_' + PossibleSDKs[i].define + '=' + PossibleSDKs[i].code for i in PossibleSDKs] dvander@4182: compiler.defines += defines dvander@4182: paths = [ dvander@4182: ['public'], dvander@4182: ['public', 'engine'], dvander@4182: ['public', 'mathlib'], dvander@4182: ['public', 'vstdlib'], dvander@4182: ['public', 'tier0'], dvander@4182: ['public', 'tier1'] dvander@4182: ] dvander@4182: if sdk.name == 'ep1' or sdk.name == 'darkm': dvander@4182: paths.append(['public', 'dlls']) dvander@4182: paths.append(['game_shared']) dvander@4182: else: dvander@4182: paths.append(['public', 'game', 'server']) dvander@4182: paths.append(['public', 'toolframework']) dvander@4182: paths.append(['game', 'shared']) dvander@4182: paths.append(['common']) dvander@4182: dvander@4182: compiler.defines += ['SOURCE_ENGINE=' + sdk.code] dvander@4182: dvander@4182: if sdk.name == '2013' and compiler.cxx.behavior == 'gcc': dvander@4182: # The 2013 SDK already has these in public/tier0/basetypes.h dvander@4182: compiler.defines.remove('stricmp=strcasecmp') dvander@4182: compiler.defines.remove('_stricmp=strcasecmp') dvander@4182: compiler.defines.remove('_snprintf=snprintf') dvander@4182: compiler.defines.remove('_vsnprintf=vsnprintf') dvander@4182: dvander@4182: if sdk.name in ['swarm', 'blade', 'insurgency', 'csgo', 'dota']: dvander@4182: if compiler.cc.behavior == 'msvc': dvander@4182: compiler.defines += ['COMPILER_MSVC', 'COMPILER_MSVC32'] dvander@4182: else: dvander@4182: compiler.defines += ['COMPILER_GCC'] skamonkey@4245: skamonkey@4245: # For everything after Swarm, this needs to be defined for entity networking skamonkey@4245: # to work properly with sendprop value changes. skamonkey@4245: if sdk.name in ['blade', 'insurgency', 'csgo', 'dota']: skamonkey@4245: compiler.defines += ['NETWORK_VARS_ENABLED'] dvander@4182: dvander@4182: if sdk.name in ['css', 'hl2dm', 'dods', '2013', 'tf2', 'l4d2']: dvander@4182: if builder.target_platform in ['linux', 'mac']: dvander@4182: compiler.defines += ['NO_MALLOC_OVERRIDE'] dvander@4182: dvander@4182: for path in paths: dvander@4182: compiler.cxxincludes += [os.path.join(sdk.path, *path)] dvander@4182: dvander@4182: return compiler dvander@4182: dvander@4182: def ExtLibrary(self, context, name): dvander@4182: compiler = self.ExtCompiler(context) dvander@4182: return self.LibraryBuilder(compiler, name) dvander@2784: dvander@4182: def HL2Library(self, context, name, sdk): dvander@4182: compiler = self.HL2Compiler(context, sdk) dvander@4182: ds@4241: if builder.target_platform == 'linux': ds@4241: if sdk.name == 'ep1': dvander@4182: lib_folder = os.path.join(sdk.path, 'linux_sdk') ds@4241: elif sdk.name == '2013': dvander@4182: lib_folder = os.path.join(sdk.path, 'lib', 'public', 'linux32') dvander@4182: else: dvander@4182: lib_folder = os.path.join(sdk.path, 'lib', 'linux') dvander@4182: elif builder.target_platform == 'mac': ds@4241: if sdk.name == '2013': dvander@4182: lib_folder = os.path.join(sdk.path, 'lib', 'public', 'osx32') dvander@4182: else: dvander@4182: lib_folder = os.path.join(sdk.path, 'lib', 'mac') dvander@4182: dvander@4182: if builder.target_platform in ['linux', 'mac']: ds@4241: if sdk.name == '2013': dvander@4182: compiler.postlink += [ dvander@4182: compiler.Dep(os.path.join(lib_folder, 'tier1.a')), dvander@4182: compiler.Dep(os.path.join(lib_folder, 'mathlib.a')) dvander@4182: ] dvander@4182: else: dvander@4182: compiler.postlink += [ dvander@4182: compiler.Dep(os.path.join(lib_folder, 'tier1_i486.a')), dvander@4182: compiler.Dep(os.path.join(lib_folder, 'mathlib_i486.a')) dvander@4182: ] dvander@4182: dvander@4182: if sdk.name in ['blade', 'insurgency', 'csgo', 'dota']: dvander@4182: compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'interfaces_i486.a'))] dvander@4182: dvander@4182: binary = self.LibraryBuilder(compiler, name) ds@3828: dvander@4182: dynamic_libs = [] dvander@4182: if builder.target_platform == 'linux': dvander@4182: compiler.linkflags[0:0] = ['-lm'] dvander@4182: if sdk.name in ['css', 'hl2dm', 'dods', 'tf2', '2013', 'l4d2']: dvander@4182: dynamic_libs = ['libtier0_srv.so', 'libvstdlib_srv.so'] dvander@4182: elif sdk.name in ['l4d', 'nd', 'blade', 'insurgency', 'csgo']: dvander@4182: dynamic_libs = ['libtier0.so', 'libvstdlib.so'] dvander@4182: else: dvander@4182: dynamic_libs = ['tier0_i486.so', 'vstdlib_i486.so'] dvander@4182: elif builder.target_platform == 'mac': dvander@4182: binary.compiler.linkflags.append('-liconv') dvander@4182: dynamic_libs = ['libtier0.dylib', 'libvstdlib.dylib'] dvander@4182: elif builder.target_platform == 'windows': dvander@4182: libs = ['tier0', 'tier1', 'vstdlib', 'mathlib'] dvander@4182: if sdk.name in ['swarm', 'blade', 'insurgency', 'csgo', 'dota']: dvander@4182: libs.append('interfaces') dvander@4182: for lib in libs: dvander@4182: lib_path = os.path.join(sdk.path, 'lib', 'public', lib) + '.lib' dvander@4182: binary.compiler.linkflags.append(binary.Dep(lib_path)) dvander@4182: dvander@4182: for library in dynamic_libs: dvander@4182: source_path = os.path.join(lib_folder, library) dvander@4182: output_path = os.path.join(binary.localFolder, library) dvander@4182: dvander@4182: def make_linker(source_path, output_path): dvander@4182: def link(context, binary): dvander@4182: cmd_node, (output,) = context.AddSymlink(source_path, output_path) dvander@4182: return output dvander@4182: return link dvander@2784: dvander@4182: linker = make_linker(source_path, output_path) dvander@4182: binary.compiler.linkflags[0:0] = [binary.Dep(library, linker)] dvander@4182: dvander@4182: return binary dvander@4182: dvander@4182: SM = SMConfig() dvander@4187: SM.detectProductVersion() dvander@4182: SM.detectSDKs() dvander@4182: SM.configure() dvander@4182: dvander@4187: SM.generated_headers = builder.RunScript( dvander@4187: 'tools/buildbot/Versioning', dvander@4187: { 'SM': SM } dvander@4187: ) dvander@4188: SM.versionlib = builder.RunScript( dvander@4188: 'versionlib/AMBuilder', dvander@4188: { 'SM': SM } dvander@4188: ) dvander@4187: dvander@4182: builder.RunBuildScripts( dvander@4182: [ dvander@4182: 'loader/AMBuilder', dvander@4182: 'core/AMBuilder', dvander@4182: 'core/logic/AMBuilder', dvander@4182: 'extensions/bintools/AMBuilder', dvander@4182: 'extensions/clientprefs/AMBuilder', dvander@4183: 'extensions/curl/AMBuilder', dvander@4182: 'extensions/cstrike/AMBuilder', dvander@4182: 'extensions/geoip/AMBuilder', dvander@4182: 'extensions/mysql/AMBuilder', dvander@4182: 'extensions/regex/AMBuilder', dvander@4182: 'extensions/sdkhooks/AMBuilder', dvander@4182: 'extensions/sdktools/AMBuilder', dvander@4182: 'extensions/sqlite/AMBuilder', dvander@4182: 'extensions/tf2/AMBuilder', dvander@4182: 'extensions/topmenus/AMBuilder', dvander@4182: 'extensions/updater/AMBuilder', dvander@4182: 'sourcepawn/compiler/AMBuilder', dvander@4182: 'sourcepawn/jit/AMBuilder', dvander@4185: 'plugins/AMBuilder', dvander@4186: 'tools/buildbot/PackageScript', dvander@4182: ], dvander@4182: { dvander@4182: 'SM': SM dvander@4182: } dvander@4182: ) dvander@4193: dvander@4193: if builder.options.breakpad_dump: dvander@4193: builder.RunScript('tools/buildbot/BreakpadSymbols', { 'SM': SM })