From 0c282853a22feafe4664b03f1dc37c068940791d Mon Sep 17 00:00:00 2001 From: maxime1907 <19607336+maxime1907@users.noreply.github.com> Date: Mon, 28 Nov 2022 16:45:34 +0100 Subject: [PATCH] feat: github ci --- .github/workflows/ci.yml | 138 ++++++++++++++++ .gitignore | 2 +- AMBuildScript | 342 ++++++++++++++++++++++++++++++++------- AMBuilder | 57 ++++--- PackageScript | 38 ++--- configure.py | 40 +++-- version.rc | 103 ++++++++++++ 7 files changed, 605 insertions(+), 115 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 version.rc diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..445485c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,138 @@ +name: CI + +on: + push: + branches: + - main + - master + tags: + - '*' + pull_request: + branches: + - main + - master + +jobs: + build: + name: Build + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-20.04] + sourcemod-version: [1.11-dev] + libboost-version: [boost-1.82.0] + python-version: ['3.10'] + include: + - os: ubuntu-20.04 + compiler_cc: clang + compiler_cxx: clang++ + + steps: + - name: Install Linux packages + if: runner.os == 'Linux' + run: | + sudo apt update + sudo apt install -yq --no-install-recommends g++-multilib ${{ matrix.compiler_cc }} + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Checkout + uses: actions/checkout@v3 + with: + path: extension + + - name: Checkout SourceMod ${{ matrix.sourcemod-version }} + uses: actions/checkout@v3 + with: + repository: alliedmodders/sourcemod + ref: ${{ matrix.sourcemod-version }} + path: sourcemod + submodules: recursive + + - name: Download libboost ${{ matrix.libboost-version }} + run: | + curl -L https://github.com/boostorg/boost/releases/download/${{ matrix.libboost-version }}/${{ matrix.libboost-version }}.tar.gz -o libboost.tar.gz + tar -xvf libboost.tar.gz && rm libboost.tar.gz + mv ${{ matrix.libboost-version }} libboost + + - name: Install AMBuild + run: | + python -m pip install wheel + pip install git+https://github.com/alliedmodders/ambuild + + - name: Install sourcemod dependencies + run: | + bash sourcemod/tools/checkout-deps.sh -m -s ${{ matrix.sdks }} + + - name: Select clang compiler + if: startsWith(runner.os, 'Linux') + run: | + echo "CC=${{ matrix.compiler_cc }}" >> $GITHUB_ENV + echo "CXX=${{ matrix.compiler_cxx }}" >> $GITHUB_ENV + ${{ matrix.compiler_cc }} --version + ${{ matrix.compiler_cxx }} --version + + - name: Build libboost + working-directory: libboost + run: | + ./bootstrap.sh --prefix=build --with-libraries=thread,system + ./b2 -j8 cflags=-m32 cxxflags=-m32 address-model=32 threading=multi architecture=x86 instruction-set=i686 link=static runtime-link=static + ./b2 install + + - name: Build + working-directory: extension + shell: bash + env: + BREAKPAD_SYMBOL_SERVER: ${{ secrets.BREAKPAD_SYMBOL_SERVER }} + run: | + mkdir build && cd build + python ../configure.py --enable-optimize --symbol-files + ambuild + + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: ${{ runner.os }} + path: extension/build/package + + release: + name: Release + if: startsWith(github.ref, 'refs/tags/') + needs: build + runs-on: ubuntu-latest + + steps: + - name: Download artifacts + uses: actions/download-artifact@v3 + + - name: Package + run: | + version=`echo $GITHUB_REF | sed "s/refs\/tags\///"` + ls -Rall + if [ -d "./Linux/" ]; then + cd ./Linux/ + tar -czf ../${{ github.event.repository.name }}-${version}-linux.tar.gz -T <(\ls -1) + cd - + fi + if [ -d "./macOS/" ]; then + cd ./macOS/ + tar -czf ../${{ github.event.repository.name }}-${version}-mac.tar.gz -T <(\ls -1) + cd - + fi + if [ -d "./Windows/" ]; then + cd ./Windows/ + tar -czf ../${{ github.event.repository.name }}-${version}-windows.tar.gz -T <(\ls -1) + cd - + fi + + - name: Release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: '*.tar.gz' + tag: ${{ github.ref }} + file_glob: true diff --git a/.gitignore b/.gitignore index 821c222..bda8697 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,4 @@ a.out *~ Release/ Debug/ -build/ \ No newline at end of file +build/ diff --git a/AMBuildScript b/AMBuildScript index cefb8f5..d5c0188 100644 --- a/AMBuildScript +++ b/AMBuildScript @@ -1,5 +1,35 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: -import os +import os, sys +import traceback + +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.platform = platform + 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, targets): + for cxx in targets: + if cxx.target.platform in self.platformSpec: + if cxx.target.arch in self.platformSpec[cxx.target.platform]: + return True + return False + +WinOnly = ['windows'] +WinLinux = ['windows', 'linux'] +WinLinuxMac = ['windows', 'linux', 'mac'] def ResolveEnvPath(env, folder): if env in os.environ: @@ -21,12 +51,55 @@ def ResolveEnvPath(env, folder): def Normalize(path): return os.path.abspath(os.path.normpath(path)) + +def SetArchFlags(compiler): + if compiler.behavior == 'gcc': + if compiler.target.arch == 'x86_64': + compiler.cflags += ['-fPIC'] + elif compiler.like('msvc'): + if compiler.target.arch == 'x86_64': + compiler.defines += ['WIN64'] class ExtensionConfig(object): def __init__(self): + self.sdks = {} + self.binaries = [] + self.spvm = [] self.extensions = [] + self.generated_headers = None self.sm_root = None - self.boost_root = None + self.mms_root = None + self.mysql_root = {} + self.spcomp = None + self.spcomp_bins = None + self.smx_files = {} + self.versionlib = None + self.all_targets = [] + self.target_archs = set() + self.libboost_root = None + + + if builder.options.targets: + target_archs = builder.options.targets.split(',') + else: + target_archs = ['x86'] + if builder.backend != 'amb2': + target_archs.append('x86_64') + + for arch in target_archs: + try: + cxx = builder.DetectCxx(target_arch = arch) + self.target_archs.add(cxx.target.arch) + except Exception as e: + # Error if archs were manually overridden. + if builder.options.targets: + raise + print('Skipping target {}: {}'.format(arch, e)) + continue + self.all_targets.append(cxx) + + if not self.all_targets: + raise Exception('No suitable C/C++ compiler was found.') @property def tag(self): @@ -34,36 +107,90 @@ class ExtensionConfig(object): return 'Debug' return 'Release' - def detectSourceMod(self): + 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): if builder.options.sm_path: self.sm_root = builder.options.sm_path else: - self.sm_root = ResolveEnvPath('SOURCEMOD18', 'sourcemod-1.8') + self.sm_root = ResolveEnvPath('SOURCEMOD18', 'sourcemod-1.10') if not self.sm_root: - self.sm_root = ResolveEnvPath('SOURCEMOD', 'sourcemod') + self.sm_root = ResolveEnvPath('SOURCEMOD', 'sourcemod-source') if not self.sm_root: self.sm_root = ResolveEnvPath('SOURCEMOD_DEV', 'sourcemod-central') + if not self.sm_root: + self.sm_root = ResolveEnvPath('SOURCEMOD', 'sourcemod') if not self.sm_root or not os.path.isdir(self.sm_root): - raise Exception('Could not find a source copy of SourceMod') - + raise Exception('Could not find a source copy of Sourcemod') self.sm_root = Normalize(self.sm_root) - def detectBoost(self): - if builder.options.boost_path: - self.boost_root = builder.options.boost_path + if builder.options.mms_path: + self.mms_root = builder.options.mms_path else: - raise Exception('Could not find a copy of Boost') + self.mms_root = ResolveEnvPath('MMSOURCE110', 'mmsource-1.10') + if not self.mms_root: + self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'metamod-source') + if not self.mms_root: + self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'mmsource-central') + if not self.mms_root: + self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'metamod') + + if not self.mms_root or not os.path.isdir(self.mms_root): + raise Exception('Could not find a source copy of Metamod:Source') + self.mms_root = Normalize(self.mms_root) + + if builder.options.libboost_path: + self.libboost_root = builder.options.libboost_path + else: + self.libboost_root = ResolveEnvPath('LIBBOOSTSOURCE144', 'libboost-1.44') + if not self.libboost_root: + self.libboost_root = ResolveEnvPath('LIBBOOSTSOURCE_DEV', 'libboost-source') + if not self.libboost_root: + self.libboost_root = ResolveEnvPath('LIBBOOSTSOURCE_DEV', 'libboost-central') + if not self.libboost_root: + self.libboost_root = ResolveEnvPath('LIBBOOSTSOURCE_DEV', 'libboost') + + if not self.libboost_root or not os.path.isdir(self.libboost_root): + raise Exception('Could not find a source copy of libboost') + self.libboost_root = Normalize(self.libboost_root) def configure(self): - cxx = builder.DetectCompilers() + if not set(self.target_archs).issubset(['x86', 'x86_64']): + raise Exception('Unknown target architecture: {0}'.format(self.target_archs)) + + for cxx in self.all_targets: + self.configure_cxx(cxx) + + def configure_cxx(self, cxx): + if cxx.family == 'msvc': + if cxx.version < 1900: + raise Exception('Only MSVC 2015 and later are supported, c++14 support is required.') + if cxx.family == 'gcc': + if cxx.version < 'gcc-4.9': + raise Exception('Only GCC versions 4.9 or greater are supported, c++14 support is required.') + if cxx.family == 'clang': + if cxx.version < 'clang-3.4': + raise Exception('Only clang versions 3.4 or greater are supported, c++14 support is required.') if cxx.like('gcc'): self.configure_gcc(cxx) - elif cxx.vendor == 'msvc': + elif cxx.family == 'msvc': self.configure_msvc(cxx) - # Optimization + # Optimizaiton if builder.options.opt == '1': cxx.defines += ['NDEBUG'] @@ -72,11 +199,11 @@ class ExtensionConfig(object): cxx.defines += ['DEBUG', '_DEBUG'] # Platform-specifics - if builder.target_platform == 'linux': + if cxx.target.platform == 'linux': self.configure_linux(cxx) - elif builder.target_platform == 'mac': + elif cxx.target.platform == 'mac': self.configure_mac(cxx) - elif builder.target_platform == 'windows': + elif cxx.target.platform == 'windows': self.configure_windows(cxx) # Finish up. @@ -102,31 +229,39 @@ class ExtensionConfig(object): '-Wno-switch', '-Wno-array-bounds', '-msse', - '-m32', '-fvisibility=hidden', ] + + if cxx.version == 'apple-clang-6.0' or cxx.version == 'clang-3.4': + cxx.cxxflags += ['-std=c++1y'] + else: + cxx.cxxflags += ['-std=c++14'] + cxx.cxxflags += [ - '-std=c++11', - # '-fno-exceptions', '-fno-threadsafe-statics', '-Wno-non-virtual-dtor', '-Wno-overloaded-virtual', '-fvisibility-inlines-hidden', - '-D_GLIBCXX_USE_CXX11_ABI=0', ] - cxx.linkflags += ['-m32'] - have_gcc = cxx.vendor == 'gcc' - have_clang = cxx.vendor == 'clang' - if cxx.version >= 'clang-3.6': + have_gcc = cxx.family == 'gcc' + have_clang = cxx.family == 'clang' + if cxx.version >= 'clang-3.9' or cxx.version == 'clang-3.4' or cxx.version > 'apple-clang-6.0': + cxx.cxxflags += ['-Wno-expansion-to-defined'] + if cxx.version == 'clang-3.9' or cxx.version == 'apple-clang-8.0': + cxx.cflags += ['-Wno-varargs'] + if cxx.version >= 'clang-3.4' or cxx.version >= 'apple-clang-7.0': cxx.cxxflags += ['-Wno-inconsistent-missing-override'] + if cxx.version >= 'clang-2.9' or cxx.version >= 'apple-clang-3.0': + cxx.cxxflags += ['-Wno-null-dereference'] if have_clang or (cxx.version >= 'gcc-4.6'): cxx.cflags += ['-Wno-narrowing'] if have_clang or (cxx.version >= 'gcc-4.7'): cxx.cxxflags += ['-Wno-delete-non-virtual-dtor'] if cxx.version >= 'gcc-4.8': cxx.cflags += ['-Wno-unused-result'] - + if cxx.version >= 'gcc-9.0': + cxx.cxxflags += ['-Wno-class-memaccess', '-Wno-packed-not-aligned'] if have_clang: cxx.cxxflags += ['-Wno-implicit-exception-spec-mismatch'] if cxx.version >= 'apple-clang-5.1' or cxx.version >= 'clang-3.4': @@ -135,11 +270,33 @@ class ExtensionConfig(object): cxx.cxxflags += ['-Wno-deprecated'] cxx.cflags += ['-Wno-sometimes-uninitialized'] + # Work around SDK warnings. + if cxx.version >= 'clang-10.0': + cxx.cflags += [ + '-Wno-implicit-int-float-conversion', + '-Wno-tautological-overlap-compare', + ] + if have_gcc: cxx.cflags += ['-mfpmath=sse'] + cxx.cflags += ['-Wno-maybe-uninitialized'] if builder.options.opt == '1': - cxx.cflags += ['-O3'] + cxx.cflags += [ + '-O3', + '-ftree-vectorize', + ] + if have_clang: + cxx.cflags += [ + '-fexperimental-new-pass-manager', + '-mllvm', + '-inline-threshold=1000', + '-mllvm', + '-vectorize-loops', + ] + + # Don't omit the frame pointer. + cxx.cflags += ['-fno-omit-frame-pointer'] def configure_msvc(self, cxx): if builder.options.debug == '1': @@ -152,7 +309,6 @@ class ExtensionConfig(object): '_CRT_SECURE_NO_WARNINGS', '_CRT_NONSTDC_NO_DEPRECATE', '_ITERATOR_DEBUG_LEVEL=0', - '_WIN32_WINNT=0x0601', ] cxx.cflags += [ '/W3', @@ -163,7 +319,6 @@ class ExtensionConfig(object): '/TP', ] cxx.linkflags += [ - '/MACHINE:X86', 'kernel32.lib', 'user32.lib', 'gdi32.lib', @@ -178,9 +333,6 @@ class ExtensionConfig(object): 'odbccp32.lib', ] - # setup boost libraries - cxx.linkflags += ['/LIBPATH:"' + os.path.join(self.boost_root, 'stage', 'x86', 'lib') + '"'] - if builder.options.opt == '1': cxx.cflags += ['/Ox', '/Zo'] cxx.linkflags += ['/OPT:ICF', '/OPT:REF'] @@ -193,62 +345,130 @@ class ExtensionConfig(object): cxx.cflags += ['/Oy-'] def configure_linux(self, cxx): - cxx.defines += ['_LINUX', 'POSIX'] - - # link flags based off of socket Makefile - cxx.linkflags += ['-lpthread', '-Wl,-Bstatic', '-lm', '-lstdc++'] - cxx.linkflags += ['-L', os.path.join(self.boost_root, 'stage', 'x86', 'lib')] - cxx.linkflags += ['-lboost_thread'] - cxx.linkflags += ['-Wl,-Bdynamic'] - if cxx.vendor == 'gcc': + cxx.defines += ['_LINUX', 'POSIX', '_FILE_OFFSET_BITS=64'] + cxx.linkflags += ['-lm'] + if cxx.family == 'gcc': cxx.linkflags += ['-static-libgcc'] - elif cxx.vendor == 'clang': + elif cxx.family == 'clang': cxx.linkflags += ['-lgcc_eh'] + cxx.linkflags += [ + '-static-libstdc++', + '-lpthread' + ] def configure_mac(self, cxx): - cxx.defines += ['OSX', '_OSX', 'POSIX'] - cxx.cflags += ['-mmacosx-version-min=10.5'] + cxx.defines += ['OSX', '_OSX', 'POSIX', 'KE_ABSOLUTELY_NO_STL'] + cxx.cflags += ['-mmacosx-version-min=10.7'] cxx.linkflags += [ - '-mmacosx-version-min=10.5', - '-arch', 'i386', - '-lstdc++', - '-stdlib=libstdc++', + '-mmacosx-version-min=10.7', + '-stdlib=libc++', + '-lc++', ] - cxx.cxxflags += ['-stdlib=libstdc++'] + cxx.cxxflags += ['-stdlib=libc++'] def configure_windows(self, cxx): cxx.defines += ['WIN32', '_WINDOWS'] + def add_libamtl(self): + # Add libamtl. + self.libamtl = {} + for cxx in self.all_targets: + def get_configure_fn(cxx): + return lambda builder, name: self.StaticLibrary(builder, cxx, name) + extra_vars = {'Configure': get_configure_fn(cxx)} + libamtl = builder.Build('public/amtl/amtl/AMBuilder', extra_vars) + self.libamtl[cxx.target.arch] = libamtl.binary + + def AddVersioning(self, binary): + if binary.compiler.target.platform == 'windows': + binary.sources += ['version.rc'] + binary.compiler.rcdefines += [ + 'BINARY_NAME="{0}"'.format(binary.outputFile), + 'RC_COMPILE', + ] + elif binary.compiler.target.platform == 'mac': + if binary.type == 'library': + binary.compiler.postlink += [ + '-compatibility_version', '1.0.0', + '-current_version', self.productVersion + ] + return binary + + def LibraryBuilder(self, compiler, name): + binary = compiler.Library(name) + self.AddVersioning(binary) + if binary.compiler.like('msvc'): + binary.compiler.linkflags += ['/SUBSYSTEM:WINDOWS'] + return binary + + def ProgramBuilder(self, compiler, name): + binary = compiler.Program(name) + self.AddVersioning(binary) + if '-static-libgcc' in binary.compiler.linkflags: + binary.compiler.linkflags.remove('-static-libgcc') + if '-lgcc_eh' in binary.compiler.linkflags: + binary.compiler.linkflags.remove('-lgcc_eh') + if binary.compiler.like('gcc'): + binary.compiler.linkflags += ['-lstdc++', '-lpthread'] + if binary.compiler.like('msvc'): + binary.compiler.linkflags += ['/SUBSYSTEM:CONSOLE'] + return binary + + def StaticLibraryBuilder(self, compiler, name): + return compiler.StaticLibrary(name) + + def Library(self, context, compiler, name): + compiler = compiler.clone() + SetArchFlags(compiler) + return self.LibraryBuilder(compiler, name) + + def Program(self, context, compiler, name): + compiler = compiler.clone() + SetArchFlags(compiler) + return self.ProgramBuilder(compiler, name) + + def StaticLibrary(self, context, compiler, name): + compiler = compiler.clone() + SetArchFlags(compiler) + return self.StaticLibraryBuilder(compiler, name) + def ConfigureForExtension(self, context, compiler): compiler.cxxincludes += [ os.path.join(context.currentSourcePath), + os.path.join(context.currentSourcePath, 'sdk'), os.path.join(self.sm_root, 'public'), os.path.join(self.sm_root, 'public', 'extensions'), os.path.join(self.sm_root, 'sourcepawn', 'include'), os.path.join(self.sm_root, 'public', 'amtl', 'amtl'), os.path.join(self.sm_root, 'public', 'amtl'), - os.path.join(self.boost_root) + os.path.join(self.libboost_root, 'build', 'include'), ] return compiler - def Library(self, context, name): - binary = context.compiler.Library(name) + def ExtLibrary(self, context, compiler, name): + binary = self.Library(context, compiler, name) + SetArchFlags(compiler) self.ConfigureForExtension(context, binary.compiler) return binary -Extension = ExtensionConfig() -Extension.detectSourceMod() -Extension.detectBoost() -Extension.configure() +if getattr(builder, 'target', None) is not None: + sys.stderr.write("Your output folder was configured for AMBuild 2.1, and SourceMod is now\n") + sys.stderr.write("configured to use AMBuild 2.2. Please remove your output folder and\n") + sys.stderr.write("reconfigure to continue.\n") + os._exit(1) -# Add additional buildscripts here -BuildScripts = [ - 'AMBuilder', -] +SM = ExtensionConfig() +SM.detectSDKs() +SM.configure() + +# This will clone the list and each cxx object as we recurse, preventing child +# scripts from messing up global state. +builder.targets = builder.CloneableList(SM.all_targets) if builder.backend == 'amb2': - BuildScripts += [ + BuildScripts = [ + 'AMBuilder', 'PackageScript', ] -builder.RunBuildScripts(BuildScripts, {'Extension': Extension}) +builder.Build(BuildScripts, { 'SM': SM}) diff --git a/AMBuilder b/AMBuilder index a86a866..d570e80 100644 --- a/AMBuilder +++ b/AMBuilder @@ -1,30 +1,45 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: -import os, sys +import os projectName = 'socket' -# smsdk_ext.cpp will be automatically added later -sourceFiles = [ - 'Extension.cpp', - 'Callback.cpp', - 'CallbackHandler.cpp', - 'Socket.cpp', - 'SocketHandler.cpp', -] +for cxx in builder.targets: + binary = SM.ExtLibrary(builder, cxx, projectName + ".ext") -############### -# Make sure to edit PackageScript, which copies your files to their appropriate locations -# Simple extensions do not need to modify past this point. + binary.compiler.defines += [ + 'HAVE_STRING_H', + ] -project = Extension.Library(builder, projectName + '.ext') + if cxx.target.platform == 'linux': + cxx.postlink += ['-lpthread', '-lrt'] + elif cxx.target.platform == 'mac': + cxx.cflags += ['-Wno-deprecated-declarations'] + cxx.postlink += ['-framework', 'CoreServices'] -if os.path.isfile(os.path.join(builder.currentSourcePath, 'sdk', 'smsdk_ext.cpp')): - # Use the copy included in the project - project.sources += [os.path.join('sdk', 'smsdk_ext.cpp')] -else: - # Use the copy included with SM 1.6 and newer - project.sources += [os.path.join(Extension.sm_root, 'public', 'smsdk_ext.cpp')] + if cxx.family == 'gcc' or cxx.family == 'clang': + cxx.cxxflags += ['-fno-rtti'] + elif cxx.family == 'msvc': + cxx.cxxflags += ['/GR-'] -project.sources += sourceFiles + binary.compiler.postlink += [ + os.path.join(SM.libboost_root, 'build', 'lib', 'libboost_thread.a'), + os.path.join(SM.libboost_root, 'build', 'lib', 'libboost_system.a'), + ] -Extension.extensions = [builder.Add(project)] + binary.sources += [ + 'Extension.cpp', + 'Socket.cpp', + 'SocketHandler.cpp', + 'Callback.cpp', + 'CallbackHandler.cpp', + os.path.join(SM.sm_root, 'public', 'smsdk_ext.cpp'), + os.path.join(SM.sm_root, 'public', 'asm', 'asm.c'), + os.path.join(SM.sm_root, 'public', 'libudis86', 'decode.c'), + os.path.join(SM.sm_root, 'public', 'libudis86', 'itab.c'), + os.path.join(SM.sm_root, 'public', 'libudis86', 'syn-att.c'), + os.path.join(SM.sm_root, 'public', 'libudis86', 'syn-intel.c'), + os.path.join(SM.sm_root, 'public', 'libudis86', 'syn.c'), + os.path.join(SM.sm_root, 'public', 'libudis86', 'udis86.c'), + ] + + SM.extensions += [builder.Add(binary)] diff --git a/PackageScript b/PackageScript index db05d93..1234c8e 100644 --- a/PackageScript +++ b/PackageScript @@ -9,16 +9,26 @@ builder.SetBuildFolder('package') folder_list = [ 'addons/sourcemod/extensions', 'addons/sourcemod/scripting/include', - #'addons/sourcemod/gamedata', - #'addons/sourcemod/configs', ] +if 'x86_64' in SM.target_archs: + folder_list.extend([ + 'addons/sourcemod/extensions/x64', + ]) + # Create the distribution folder hierarchy. folder_map = {} for folder in folder_list: norm_folder = os.path.normpath(folder) folder_map[folder] = builder.AddFolder(norm_folder) +# Copy binaries. +for cxx_task in SM.extensions: + if cxx_task.target.arch == 'x86_64': + builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions/x64']) + else: + builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions']) + # Do all straight-up file copies from the source tree. def CopyFiles(src, dest, files): if not dest: @@ -26,27 +36,11 @@ def CopyFiles(src, dest, files): dest_entry = folder_map[dest] for source_file in files: source_path = os.path.join(builder.sourcePath, src, source_file) - builder.AddCopy(source_path, dest_entry) + dest_path = os.path.join(dest_entry.path, source_file) + if not os.path.isfile(str(dest_path)): + builder.AddCopy(source_path, dest_entry) -# Include files +# Include files CopyFiles('scripting/include', 'addons/sourcemod/scripting/include', [ 'socket.inc', ] ) - -# GameData files -#CopyFiles('gamedata', 'addons/sourcemod/gamedata', -# [ 'myfile.txt', -# 'file2.txt' -# ] -#) - -# Config Files -#CopyFiles('configs', 'addons/sourcemod/configs', -# [ 'configfile.cfg', -# 'otherconfig.cfg, -# ] -#) - -# Copy binaries. -for cxx_task in Extension.extensions: - builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions']) diff --git a/configure.py b/configure.py index ce16768..aa502ed 100644 --- a/configure.py +++ b/configure.py @@ -1,18 +1,38 @@ -# vim: set sts=2 ts=8 sw=2 tw=99 et: +# vim: set ts=2 sw=2 tw=99 noet: import sys -from ambuild2 import run +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) -# Simple extensions do not need to modify this file. +# Hack to show a decent upgrade message, which wasn't done until 2.2. +ambuild_version = getattr(run, 'CURRENT_API', '2.1') +if ambuild_version.startswith('2.1'): + sys.stderr.write("AMBuild 2.2 or higher is required; please update\n") + sys.exit(1) -builder = run.PrepareBuild(sourcePath = sys.path[0]) +parser = run.BuildParser(sourcePath = sys.path[0], api='2.2') -builder.options.add_option('--sm-path', type=str, dest='sm_path', default=None, +parser.options.add_argument('--hl2sdk-root', type=str, dest='hl2sdk_root', default=None, + help='Root search folder for HL2SDKs') +parser.options.add_argument('--mms-path', type=str, dest='mms_path', default=None, + help='Path to Metamod:Source') +parser.options.add_argument('--sm-path', type=str, dest='sm_path', default=None, help='Path to SourceMod') -builder.options.add_option('--boost-path', type=str, dest='boost_path', default=None, - help='Path to Boost') -builder.options.add_option('--enable-debug', action='store_const', const='1', dest='debug', +parser.options.add_argument('--libboost-path', type=str, dest='libboost_path', default=None, + help='Path to libboost') +parser.options.add_argument('--enable-debug', action='store_const', const='1', dest='debug', help='Enable debugging symbols') -builder.options.add_option('--enable-optimize', action='store_const', const='1', dest='opt', +parser.options.add_argument('--enable-optimize', action='store_const', const='1', dest='opt', help='Enable optimization') +parser.options.add_argument('--targets', type=str, dest='targets', default=None, + help="Override the target architecture (use commas to separate multiple targets).") -builder.Configure() +parser.Configure() diff --git a/version.rc b/version.rc new file mode 100644 index 0000000..d45a0c7 --- /dev/null +++ b/version.rc @@ -0,0 +1,103 @@ +// Microsoft Visual C++ generated resource script. +// +//#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION SM_VERSION_FILE + PRODUCTVERSION SM_VERSION_FILE + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "SourceMod Extension" + VALUE "FileDescription", "SourceMod Extension" + VALUE "FileVersion", SM_VERSION_STRING + VALUE "InternalName", "SourceMod Extension" + VALUE "LegalCopyright", "Copyright (c) 2004-2022, AlliedModders LLC" + VALUE "OriginalFilename", BINARY_NAME + VALUE "ProductName", "SourceMod Extension" + VALUE "ProductVersion", SM_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED