From 2facd37fd8c2f7865a959d7604e60b6ce4a0c160 Mon Sep 17 00:00:00 2001 From: Maksim Smolin Date: Tue, 22 Jan 2019 13:07:37 -0800 Subject: [PATCH 1/4] transition sample_mm to AMBuild --- sample_mm/AMBuildScript | 444 ++++++++++++++++++++++++++++++++++++++ sample_mm/Makefile | 230 -------------------- sample_mm/configure.py | 33 +++ sample_mm/product.version | 1 + 4 files changed, 478 insertions(+), 230 deletions(-) create mode 100644 sample_mm/AMBuildScript delete mode 100644 sample_mm/Makefile create mode 100644 sample_mm/configure.py create mode 100644 sample_mm/product.version diff --git a/sample_mm/AMBuildScript b/sample_mm/AMBuildScript new file mode 100644 index 00000000..a9f156ec --- /dev/null +++ b/sample_mm/AMBuildScript @@ -0,0 +1,444 @@ +proj_name = 'sample_mm' +proj_srcs = [ + 'sample_mm.cpp', +] +proj_c_flags = [ + '-Wall', + '-Wno-non-virtual-dtor', + '-Wno-overloaded-virtual', + '-Werror', +] +proj_c_flags_opt = [ + '-O3', + '-funroll-loops', + '-pipe', +] +proj_c_flags_dbg = [ + '-g', + '-ggdb3', +] + +import os, sys + +class SDK(object): + def __init__(self, sdk, ext, aDef, name, platform, dir): + self.folder = 'hl2sdk-' + dir + self.envvar = sdk + self.ext = ext + self.code = aDef + self.define = name + self.name = dir + self.path = None # Actual path + self.platformSpec = platform + + # By default, nothing supports x64. + if type(platform) is list: + self.platformSpec = {p: ['x86'] for p in platform} + else: + self.platformSpec = platform + + def shouldBuild(self, target, archs): + if target.platform not in self.platformSpec: + return False + if not len([i for i in self.platformSpec[target.platform] if i in archs]): + return False + return True + +WinOnly = ['windows'] +WinLinux = ['windows', 'linux'] +WinLinuxMac = ['windows', 'linux', 'mac'] +CSGO = { + 'windows': ['x86'], + 'linux': ['x86', 'x64'], + 'mac': ['x64'] +} +Source2 = { + 'windows': ['x86', 'x64'], + 'linux': ['x64'], +} + +PossibleSDKs = { + 'episode1': SDK('HL2SDK', '2.ep1', '1', 'EPISODEONE', WinLinux, 'episode1'), + 'ep2': SDK('HL2SDKOB', '2.ep2', '3', 'ORANGEBOX', WinLinux, 'orangebox'), + 'css': SDK('HL2SDKCSS', '2.css', '6', 'CSS', WinLinuxMac, 'css'), + 'hl2dm': SDK('HL2SDKHL2DM', '2.hl2dm', '7', 'HL2DM', WinLinuxMac, 'hl2dm'), + 'dods': SDK('HL2SDKDODS', '2.dods', '8', 'DODS', WinLinuxMac, 'dods'), + 'sdk2013': SDK('HL2SDK2013', '2.sdk2013', '9', 'SDK2013', WinLinuxMac, 'sdk2013'), + 'tf2': SDK('HL2SDKTF2', '2.tf2', '11', 'TF2', WinLinuxMac, 'tf2'), + 'l4d': SDK('HL2SDKL4D', '2.l4d', '12', 'LEFT4DEAD', WinLinuxMac, 'l4d'), + 'nucleardawn': SDK('HL2SDKND', '2.nd', '13', 'NUCLEARDAWN', WinLinuxMac, 'nucleardawn'), + 'l4d2': SDK('HL2SDKL4D2', '2.l4d2', '15', 'LEFT4DEAD2', WinLinuxMac, 'l4d2'), + 'darkm': SDK('HL2SDK-DARKM', '2.darkm', '2', 'DARKMESSIAH', WinOnly, 'darkm'), + 'swarm': SDK('HL2SDK-SWARM', '2.swarm', '16', 'ALIENSWARM', WinOnly, 'swarm'), + 'bgt': SDK('HL2SDK-BGT', '2.bgt', '4', 'BLOODYGOODTIME', WinOnly, 'bgt'), + 'eye': SDK('HL2SDK-EYE', '2.eye', '5', 'EYE', WinOnly, 'eye'), + 'csgo': SDK('HL2SDKCSGO', '2.csgo', '21', 'CSGO', CSGO, 'csgo'), + 'dota': SDK('HL2SDKDOTA', '2.dota', '22', 'DOTA', Source2, 'dota'), + 'portal2': SDK('HL2SDKPORTAL2', '2.portal2', '17', 'PORTAL2', [], 'portal2'), + 'blade': SDK('HL2SDKBLADE', '2.blade', '18', 'BLADE', WinLinux, 'blade'), + 'insurgency': SDK('HL2SDKINSURGENCY', '2.insurgency', '19', 'INSURGENCY', WinLinuxMac, 'insurgency'), + 'doi': SDK('HL2SDKDOI', '2.doi', '20', 'DOI', WinLinuxMac, 'doi'), + 'contagion': SDK('HL2SDKCONTAGION', '2.contagion', '14', 'CONTAGION', WinOnly, 'contagion'), + 'bms': SDK('HL2SDKBMS', '2.bms', '10', 'BMS', WinLinux, 'bms'), +} + +def ResolveEnvPath(env, folder): + if env in os.environ: + path = os.environ[env] + if os.path.isdir(path): + return path + else: + head = os.getcwd() + oldhead = None + while head != None and head != oldhead: + path = os.path.join(head, folder) + if os.path.isdir(path): + return path + oldhead = head + head, tail = os.path.split(head) + return None + +def SetArchFlags(compiler, arch, platform): + if compiler.behavior == 'gcc': + if arch == 'x86': + compiler.cflags += ['-m32'] + compiler.linkflags += ['-m32'] + if platform == 'mac': + compiler.linkflags += ['-arch', 'i386'] + elif arch == 'x64': + compiler.cflags += ['-m64', '-fPIC'] + compiler.linkflags += ['-m64'] + if platform == 'mac': + compiler.linkflags += ['-arch', 'x86_64'] + elif compiler.like('msvc'): + if arch == 'x86': + compiler.linkflags += ['/MACHINE:X86'] + elif arch == 'x64': + compiler.linkflags += ['/MACHINE:X64'] + +def AppendArchSuffix(binary, name, arch): + if arch == 'x64': + binary.localFolder = name + '.x64' + +class MMSConfig(object): + def __init__(self): + self.sdks = {} + self.binaries = [] + self.generated_headers = None + self.archs = builder.target.arch.replace('x86_64', 'x64').split(',') + + def detectProductVersion(self): + builder.AddConfigureFile('product.version') + + # For OS X dylib versioning + import re + with open(os.path.join(builder.sourcePath, 'product.version'), 'r') as fp: + productContents = fp.read() + m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents) + if m == None: + self.productVersion = '1.0.0' + else: + major, minor, release = m.groups() + self.productVersion = '{0}.{1}.{2}'.format(major, minor, release) + + def detectSDKs(self): + sdk_list = builder.options.sdks.split(',') + use_all = sdk_list[0] == 'all' + use_present = sdk_list[0] == 'present' + if sdk_list[0] == '': + sdk_list = [] + + for sdk_name in PossibleSDKs: + sdk = PossibleSDKs[sdk_name] + if sdk.shouldBuild(builder.target, self.archs): + if builder.options.hl2sdk_root: + sdk_path = os.path.join(builder.options.hl2sdk_root, sdk.folder) + else: + sdk_path = ResolveEnvPath(sdk.envvar, sdk.folder) + if sdk_path is None: + if use_all or sdk_name in sdk_list: + raise Exception('Could not find a valid path for {0}'.format(sdk.envvar)) + continue + if use_all or use_present or sdk_name in sdk_list: + sdk.path = sdk_path + self.sdks[sdk_name] = sdk + + if len(self.sdks) < 1 and len(sdk_list): + raise Exception('No SDKs were found that build on {0}-{1}, nothing to do.'.format( + builder.target.platform, builder.target.arch)) + + def configure(self): + if not set(self.archs).issubset(['x86', 'x64']): + raise Exception('Unknown target architecture: {0}'.format(builder.target.arch)) + + cxx = builder.DetectCxx() + + if cxx.like('msvc') and len(self.archs) > 1: + raise Exception('Building multiple archs with MSVC is not currently supported') + + if cxx.behavior == 'gcc': + cxx.defines += [ + 'stricmp=strcasecmp', + '_stricmp=strcasecmp', + '_strnicmp=strncasecmp', + 'strnicmp=strncasecmp', + '_snprintf=snprintf', + '_vsnprintf=vsnprintf', + '_alloca=alloca', + 'strcmpi=strcasecmp', + ] + cxx.cflags += proj_c_flags + cxx.cflags += [ # todo: what is the difference between cflags and cxxflags + '-fPIC', + '-fno-exceptions', + '-fno-rtti', + '-msse', + '-fno-strict-aliasing', + ] + + if (cxx.version >= 'gcc-4.0') or cxx.family == 'clang': + cxx.cflags += [ + '-fvisibility=hidden', + '-fvisibility-inlines-hidden', + '-std=c++11', + ] + # apple clang <-> llvm clang version correspondence is just a guess as there is no way to figure it out for real + if (cxx.version >= 'gcc-4.7' or cxx.version >= 'clang-3.0' or cxx.version >= 'apple-clang-5.1'): + cxx.cflags += [ + '-Wno-delete-non-virtual-dtor', + '-Wno-unused-private-field', + '-Wno-deprecated-register', + ] + if cxx.family == 'clang': + if cxx.version >= 'clang-3.9' or cxx.version >= 'apple-clang-10.0': + cxx.cxxflags += ['-Wno-expansion-to-defined'] + + elif cxx.like('msvc'): + raise Exception('MSVC builds should use the Visual Studio projects until somebody implements support') # todo: implement MSVC support + + # Optimization + if builder.options.opt == '1': + if cxx.behavior == 'gcc': + cxx.cflags += proj_c_flags_opt + # elif cxx.behavior == 'msvc': # todo: implement MSVC support + + # Debugging + if builder.options.debug == '1': + cxx.defines += ['_DEBUG'] + if cxx.behavior == 'gcc': + cxx.cflags += proj_c_flags_dbg + # elif cxx.behavior == 'msvc': # todo: implement MSVC support + + # This needs to be after our optimization flags which could otherwise disable it. + # if cxx.family == 'msvc': # todo: implement MSVC support + + # Platform-specifics + if builder.target.platform == 'linux': + cxx.defines += [ + 'POSIX', + '_LINUX', + ] + cxx.linkflags += ['-shared'] + if cxx.family == 'gcc': + cxx.linkflags += ['-static-libgcc'] + elif builder.target.platform == 'mac': + cxx.defines += [ + 'POSIX', + 'OSX', + '_OSX', + ] + cxx.cflags += ['-mmacosx-version-min=10.9'] + cxx.linkflags += [ + '-dynamiclib', + '-lc++', + '-mmacosx-version-min=10.9', + ] + # elif builder.target.platform == 'windows': # todo: implement MSVC support + + def HL2Compiler(self, context, sdk, arch): + compiler = context.cxx.clone() + compiler.cxxincludes += [ + os.path.join(context.currentSourcePath), + ] + + defines = ['SE_' + PossibleSDKs[i].define + '=' + PossibleSDKs[i].code for i in PossibleSDKs] + compiler.defines += defines + paths = [ + ['public'], + ['public', 'engine'], + ['public', 'mathlib'], + ['public', 'vstdlib'], + ['public', 'tier0'], + ['public', 'tier1'], + ] + + if not builder.options.mms_path: + raise Exception('Metamod:Source path is missing. Supply a --mms_path flag') + + if sdk.name == 'episode1' or sdk.name == 'darkm': + paths.append(['public', 'dlls']) + compiler.cxxincludes.append(os.path.join(builder.options.mms_path, 'core-legacy')) + compiler.cxxincludes.append(os.path.join(builder.options.mms_path, 'core-legacy', 'sourcehook')) + else: + paths.append(['public', 'game', 'server']) + compiler.cxxincludes.append(os.path.join(builder.options.mms_path, 'core')) + compiler.cxxincludes.append(os.path.join(builder.options.mms_path, 'core', 'sourcehook')) + + compiler.defines += ['SOURCE_ENGINE=' + sdk.code] + + if sdk.name in ['sdk2013', 'bms'] and compiler.like('gcc'): + # The 2013 SDK already has these in public/tier0/basetypes.h + compiler.defines.remove('stricmp=strcasecmp') + compiler.defines.remove('_stricmp=strcasecmp') + compiler.defines.remove('_snprintf=snprintf') + compiler.defines.remove('_vsnprintf=vsnprintf') + + if compiler.family == 'msvc': + # todo: verify this for MSVC support + compiler.defines += ['COMPILER_MSVC'] + if arch == 'x86': + compiler.defines += ['COMPILER_MSVC32'] + elif arch == 'x64': + compiler.defines += ['COMPILER_MSVC64'] + + if compiler.version >= 1900: + compiler.linkflags += ['legacy_stdio_definitions.lib'] + else: # todo: is it better to check compiler.behavior? + compiler.defines += ['COMPILER_GCC'] + + for path in paths: + compiler.cxxincludes += [os.path.join(sdk.path, *path)] + + return compiler + + def AddVersioning(self, binary, arch): + if builder.target.platform == 'windows': + # todo: verify this for MSVC support + binary.sources += ['version.rc'] + binary.compiler.rcdefines += [ + 'BINARY_NAME="{0}"'.format(binary.outputFile), + 'RC_COMPILE' + ] + elif builder.target.platform == 'mac' and binary.type == 'library': + binary.compiler.postlink += [ + '-compatibility_version', '1.0.0', + '-current_version', self.productVersion + ] + + return binary + + def LibraryBuilder(self, compiler, name, arch): + binary = compiler.Library(name) + AppendArchSuffix(binary, name, arch) + self.AddVersioning(binary, arch) + return binary + + def HL2Library(self, context, name, sdk, arch): + compiler = self.HL2Compiler(context, sdk, arch) + + SetArchFlags(compiler, arch, builder.target.platform) + + if builder.target.platform == 'linux': + if sdk.name == 'episode1': + lib_folder = os.path.join(sdk.path, 'linux_sdk') + elif sdk.name in ['sdk2013', 'bms']: + lib_folder = os.path.join(sdk.path, 'lib', 'public', 'linux32') + elif arch == 'x64': + lib_folder = os.path.join(sdk.path, 'lib', 'linux64') + else: + lib_folder = os.path.join(sdk.path, 'lib', 'linux') + elif builder.target.platform == 'mac': + if sdk.name in ['sdk2013', 'bms']: + lib_folder = os.path.join(sdk.path, 'lib', 'public', 'osx32') + elif arch == 'x64': + lib_folder = os.path.join(sdk.path, 'lib', 'osx64') + else: + lib_folder = os.path.join(sdk.path, 'lib', 'mac') + + if builder.target.platform in ['linux', 'mac']: + if sdk.name in ['sdk2013', 'bms'] or arch == 'x64': + compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'tier1.a'))] + else: + compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'tier1_i486.a'))] + + if sdk.name in ['blade', 'insurgency', 'doi', 'csgo', 'dota']: + if arch == 'x64': + compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'interfaces.a'))] + else: + compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'interfaces_i486.a'))] + + if sdk.name == 'bms': + compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'mathlib.a'))] + + binary = self.LibraryBuilder(compiler, name, arch) + + dynamic_libs = [] # todo: this whole section is slightly different, but I imagine it is "more correct" + if builder.target.platform == 'linux': + compiler.linkflags[0:0] = ['-lm', '-ldl'] # todo: do we need -ldl? + if sdk.name in ['css', 'hl2dm', 'dods', 'tf2', 'sdk2013', 'bms', 'nucleardawn', 'l4d2', 'insurgency', 'doi']: + dynamic_libs = ['libtier0_srv.so', 'libvstdlib_srv.so'] + elif arch == 'x64' and sdk.name == 'csgo': + dynamic_libs = ['libtier0_client.so', 'libvstdlib_client.so'] + elif sdk.name in ['l4d', 'blade', 'insurgency', 'doi', 'csgo', 'dota']: + dynamic_libs = ['libtier0.so', 'libvstdlib.so'] + else: + dynamic_libs = ['tier0_i486.so', 'vstdlib_i486.so'] + elif builder.target.platform == 'mac': + # binary.compiler.linkflags.append('-liconv') # todo: I imagine we need this, but the Makefile didnt + dynamic_libs = ['libtier0.dylib', 'libvstdlib.dylib'] + elif builder.target.platform == 'windows': + # todo: verify this for MSVC support + libs = ['tier0', 'tier1', 'vstdlib'] + if sdk.name in ['swarm', 'blade', 'insurgency', 'doi', 'csgo', 'dota']: + libs.append('interfaces') + if sdk.name == 'bms': + libs.append('mathlib') + for lib in libs: + if arch == 'x86': + lib_path = os.path.join(sdk.path, 'lib', 'public', lib) + '.lib' + elif arch == 'x64': + lib_path = os.path.join(sdk.path, 'lib', 'public', 'win64', lib) + '.lib' + binary.compiler.linkflags.append(binary.Dep(lib_path)) + + for library in dynamic_libs: + source_path = os.path.join(lib_folder, library) + output_path = os.path.join(binary.localFolder, library) + + def make_linker(source_path, output_path): + def link(context, binary): + cmd_node, (output,) = context.AddSymlink(source_path, output_path) + return output + return link + + linker = make_linker(source_path, output_path) + binary.compiler.linkflags[0:0] = [binary.Dep(library, linker)] + + return binary + +MMS = MMSConfig() +MMS.detectProductVersion() +MMS.detectSDKs() +MMS.configure() + +BuildScripts = [] # add sub-modules here +if getattr(builder.options, 'enable_tests', False): + BuildScripts += [] # add tests here + +import os + +for sdk_name in MMS.sdks: + for arch in MMS.archs: + sdk = MMS.sdks[sdk_name] + + if not arch in sdk.platformSpec[builder.target.platform]: + continue + + name = proj_name + sdk.ext + binary = MMS.HL2Library(builder, name, sdk, arch) + + binary.sources += proj_srcs + + nodes = builder.Add(binary) + MMS.binaries += [nodes] + +builder.Build(BuildScripts, { 'MMS': MMS }) diff --git a/sample_mm/Makefile b/sample_mm/Makefile deleted file mode 100644 index e948f4d0..00000000 --- a/sample_mm/Makefile +++ /dev/null @@ -1,230 +0,0 @@ -# (C)2004-2010 Metamod:Source Development Team -# Makefile written by David "BAILOPAN" Anderson - -########################################### -### EDIT THESE PATHS FOR YOUR OWN SETUP ### -########################################### - -HL2SDK_ORIG = ../../hl2sdk -HL2SDK_OB = ../../hl2sdk-ob -HL2SDK_CSS = ../../hl2sdk-css -HL2SDK_OB_VALVE = ../../hl2sdk-ob-valve -HL2SDK_L4D = ../../hl2sdk-l4d -HL2SDK_L4D2 = ../../hl2sdk-l4d2 -HL2SDK_CSGO = ../../hl2sdk-csgo -MMSOURCE19 = .. - -##################################### -### EDIT BELOW FOR OTHER PROJECTS ### -##################################### - -PROJECT = sample_mm -OBJECTS = sample_mm.cpp - -############################################## -### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### -############################################## - -OPT_FLAGS = -O3 -funroll-loops -pipe -GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden -std=c++11 -DEBUG_FLAGS = -g -ggdb3 -D_DEBUG -CPP = gcc -CPP_OSX = clang - -########################## -### SDK CONFIGURATIONS ### -########################## - -override ENGSET = false - -# Check for valid list of engines -ifneq (,$(filter original orangebox orangeboxvalve css left4dead left4dead2 csgo,$(ENGINE))) - override ENGSET = true -endif - -ifeq "$(ENGINE)" "original" - HL2SDK = $(HL2SDK_ORIG) - CFLAGS += -DSOURCE_ENGINE=1 -endif -ifeq "$(ENGINE)" "orangebox" - HL2SDK = $(HL2SDK_OB) - CFLAGS += -DSOURCE_ENGINE=3 -endif -ifeq "$(ENGINE)" "css" - HL2SDK = $(HL2SDK_CSS) - CFLAGS += -DSOURCE_ENGINE=6 -endif -ifeq "$(ENGINE)" "orangeboxvalve" - HL2SDK = $(HL2SDK_OB_VALVE) - CFLAGS += -DSOURCE_ENGINE=7 -endif -ifeq "$(ENGINE)" "left4dead" - HL2SDK = $(HL2SDK_L4D) - CFLAGS += -DSOURCE_ENGINE=8 -endif -ifeq "$(ENGINE)" "left4dead2" - HL2SDK = $(HL2SDK_L4D2) - CFLAGS += -DSOURCE_ENGINE=9 -endif -ifeq "$(ENGINE)" "csgo" - HL2SDK = $(HL2SDK_CSGO) - CFLAGS += -DSOURCE_ENGINE=12 -endif - -HL2PUB = $(HL2SDK)/public - -ifeq "$(ENGINE)" "original" - INCLUDE += -I$(HL2SDK)/public/dlls - METAMOD = $(MMSOURCE19)/core-legacy -else - INCLUDE += -I$(HL2SDK)/public/game/server - METAMOD = $(MMSOURCE19)/core -endif - -OS := $(shell uname -s) - -ifeq "$(OS)" "Darwin" - LIB_EXT = dylib - ifeq "$(ENGINE)" "csgo" - HL2LIB = $(HL2SDK)/lib/osx64 - else - HL2LIB = $(HL2SDK)/lib/mac - endif -else - LIB_EXT = so - ifeq "$(ENGINE)" "original" - HL2LIB = $(HL2SDK)/linux_sdk - else - HL2LIB = $(HL2SDK)/lib/linux - endif -endif - -# if ENGINE is original or OB -ifneq (,$(filter original orangebox,$(ENGINE))) - LIB_SUFFIX = _i486.$(LIB_EXT) -else - LIB_PREFIX = lib - ifneq (,$(filter orangeboxvalve css left4dead2,$(ENGINE))) - ifneq "$(OS)" "Darwin" - LIB_SUFFIX = _srv.$(LIB_EXT) - else - LIB_SUFFIX = .$(LIB_EXT) - endif - else - LIB_SUFFIX = .$(LIB_EXT) - endif -endif - -ifeq "$(OS)" "Darwin" - ifeq "$(ENGINE)" "csgo" - STATIC_SUFFIX = - LIB_SUFFIX = .x64.$(LIB_EXT) - else - STATIC_SUFFIX = _i486 - endif -else - STATIC_SUFFIX = _i486 -endif - -CFLAGS += -DSE_EPISODEONE=1 -DSE_DARKMESSIAH=2 -DSE_ORANGEBOX=3 -DSE_BLOODYGOODTIME=4 -DSE_EYE=5 \ - -DSE_CSS=6 -DSE_ORANGEBOXVALVE=7 -DSE_LEFT4DEAD=8 -DSE_LEFT4DEAD2=9 -DSE_ALIENSWARM=10 \ - -DSE_PORTAL2=11 -DSE_CSGO=12 - -LINK += $(HL2LIB)/tier1$(STATIC_SUFFIX).a $(LIB_PREFIX)vstdlib$(LIB_SUFFIX) $(LIB_PREFIX)tier0$(LIB_SUFFIX) - -ifeq "$(ENGINE)" "csgo" - LINK += $(HL2LIB)/interfaces$(STATIC_SUFFIX).a -endif - -INCLUDE += -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/mathlib -I$(HL2PUB)/vstdlib \ - -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 -I. -I$(METAMOD) -I$(METAMOD)/sourcehook - -################################################ -### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### -################################################ - -BINARY = $(PROJECT).$(LIB_EXT) - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug.$(ENGINE) - CFLAGS += $(DEBUG_FLAGS) -else - BIN_DIR = Release.$(ENGINE) - CFLAGS += $(OPT_FLAGS) -endif - -ifeq "$(OS)" "Darwin" - CPP = $(CPP_OSX) - LIB_EXT = dylib - CFLAGS += -DOSX -D_OSX -mmacosx-version-min=10.9 - LINK += -dynamiclib -lc++ -mmacosx-version-min=10.9 - ifeq "$(ENGINE)" "csgo" - CFLAGS += -m64 -DX64BITS -DPLATFORM_64BITS - LINK += -m64 - else - CFLAGS += -m32 - LINK += -m32 - endif -else - LIB_EXT = so - CFLAGS += -D_LINUX -m32 - LINK += -shared -m32 -endif - -IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") - -ifeq "$(IS_CLANG)" "1" - CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") - CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") -else - CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) - CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) -endif - -CFLAGS += -DPOSIX -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp \ - -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca \ - -Dstrcmpi=strcasecmp -DCOMPILER_GCC -Wall -Wno-non-virtual-dtor -Wno-overloaded-virtual \ - -Werror -fPIC -fno-exceptions -fno-rtti -msse -fno-strict-aliasing - -# Clang || GCC >= 4 -ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" - CFLAGS += $(GCC4_FLAGS) -endif - -# Clang >= 3 || GCC >= 4.7 -ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" - CFLAGS += -Wno-delete-non-virtual-dtor -Wno-unused-private-field -Wno-deprecated-register -endif - -# OS is Linux and not using clang -ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" - LINK += -static-libgcc -endif - -OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - -$(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -all: check - mkdir -p $(BIN_DIR) - ln -sf $(HL2LIB)/$(LIB_PREFIX)vstdlib$(LIB_SUFFIX) - ln -sf $(HL2LIB)/$(LIB_PREFIX)tier0$(LIB_SUFFIX) - $(MAKE) -f Makefile sample_mm - -check: - if [ "$(ENGSET)" = "false" ]; then \ - echo "You must supply one of the following values for ENGINE:"; \ - echo "csgo, left4dead2, left4dead, css, orangeboxvalve, orangebox, or original"; \ - exit 1; \ - fi - -sample_mm: check $(OBJ_BIN) - $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -ldl -lm -o $(BIN_DIR)/$(BINARY) - -default: all - -clean: check - rm -rf $(BIN_DIR)/*.o - rm -rf $(BIN_DIR)/$(BINARY) - diff --git a/sample_mm/configure.py b/sample_mm/configure.py new file mode 100644 index 00000000..50e87dfd --- /dev/null +++ b/sample_mm/configure.py @@ -0,0 +1,33 @@ +import sys +try: + from ambuild2 import run, util +except: + try: + import ambuild + sys.stderr.write('It looks like you have AMBuild 1 installed, but this project uses AMBuild 2.\n') + sys.stderr.write('Upgrade to the latest version of AMBuild to continue.\n') + except: + sys.stderr.write('AMBuild must be installed to build this project.\n') + sys.stderr.write('http://www.alliedmods.net/ambuild\n') + sys.exit(1) + +def make_objdir_name(p): + return 'obj-' + util.Platform() + '-' + p.target_arch + +parser = run.BuildParser(sourcePath=sys.path[0], api='2.1') +parser.default_arch = 'x86' +parser.default_build_folder = make_objdir_name +parser.options.add_option('--hl2sdk-root', type=str, dest='hl2sdk_root', default=None, + help='Root search folder for HL2SDKs') +parser.options.add_option('--mms_path', type=str, dest='mms_path', default=None, + help='Metamod:Source source tree folder') +parser.options.add_option('--enable-debug', action='store_const', const='1', dest='debug', + help='Enable debugging symbols') +parser.options.add_option('--enable-optimize', action='store_const', const='1', dest='opt', + help='Enable optimization') +parser.options.add_option('-s', '--sdks', default='all', dest='sdks', + help='Build against specified SDKs; valid args are "all", "present", or ' + 'comma-delimited list of engine names (default: %default)') +parser.options.add_option('--enable-tests', default=False, dest='enable_tests', action='store_true', + help='Build tests.') +parser.Configure() diff --git a/sample_mm/product.version b/sample_mm/product.version new file mode 100644 index 00000000..6e8bf73a --- /dev/null +++ b/sample_mm/product.version @@ -0,0 +1 @@ +0.1.0 From c61d0576b126aada4fa9d5c9fe56a11cae8cbba8 Mon Sep 17 00:00:00 2001 From: Maksim Smolin Date: Tue, 22 Jan 2019 17:30:39 -0800 Subject: [PATCH 2/4] remove defines that are re-defined in the SDKs --- sample_mm/AMBuildScript | 3 --- 1 file changed, 3 deletions(-) diff --git a/sample_mm/AMBuildScript b/sample_mm/AMBuildScript index a9f156ec..301ef2c5 100644 --- a/sample_mm/AMBuildScript +++ b/sample_mm/AMBuildScript @@ -180,12 +180,9 @@ class MMSConfig(object): cxx.defines += [ 'stricmp=strcasecmp', '_stricmp=strcasecmp', - '_strnicmp=strncasecmp', - 'strnicmp=strncasecmp', '_snprintf=snprintf', '_vsnprintf=vsnprintf', '_alloca=alloca', - 'strcmpi=strcasecmp', ] cxx.cflags += proj_c_flags cxx.cflags += [ # todo: what is the difference between cflags and cxxflags From c2420c0f17afa0cb8e9d590a498d244c5eef2611 Mon Sep 17 00:00:00 2001 From: Maksim Smolin Date: Tue, 22 Jan 2019 17:31:00 -0800 Subject: [PATCH 3/4] define GNUC so that SDKS build properly --- sample_mm/AMBuildScript | 1 + 1 file changed, 1 insertion(+) diff --git a/sample_mm/AMBuildScript b/sample_mm/AMBuildScript index 301ef2c5..abe6694b 100644 --- a/sample_mm/AMBuildScript +++ b/sample_mm/AMBuildScript @@ -183,6 +183,7 @@ class MMSConfig(object): '_snprintf=snprintf', '_vsnprintf=vsnprintf', '_alloca=alloca', + 'GNUC' ] cxx.cflags += proj_c_flags cxx.cflags += [ # todo: what is the difference between cflags and cxxflags From 628cae70657ca8dc4565430c1391e6612805c923 Mon Sep 17 00:00:00 2001 From: Maksim Smolin Date: Tue, 22 Jan 2019 17:31:21 -0800 Subject: [PATCH 4/4] add iconv as sdk2013 depends on it --- sample_mm/AMBuildScript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample_mm/AMBuildScript b/sample_mm/AMBuildScript index abe6694b..0b767031 100644 --- a/sample_mm/AMBuildScript +++ b/sample_mm/AMBuildScript @@ -382,7 +382,7 @@ class MMSConfig(object): else: dynamic_libs = ['tier0_i486.so', 'vstdlib_i486.so'] elif builder.target.platform == 'mac': - # binary.compiler.linkflags.append('-liconv') # todo: I imagine we need this, but the Makefile didnt + binary.compiler.linkflags.append('-liconv') dynamic_libs = ['libtier0.dylib', 'libvstdlib.dylib'] elif builder.target.platform == 'windows': # todo: verify this for MSVC support