Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
komashchenko committed Mar 20, 2024
0 parents commit 0b0e9f3
Show file tree
Hide file tree
Showing 14 changed files with 1,564 additions and 0 deletions.
100 changes: 100 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
name: Build

on:
push:
paths-ignore:
- LICENSE
- README.md
pull_request:
paths-ignore:
- LICENSE
- README.md
workflow_dispatch:

jobs:
build:
name: Build on ${{ matrix.os_short }}
runs-on: ${{ matrix.os }}
container: ${{ matrix.container }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
include:
- os: ubuntu-latest
os_short: linux
container: registry.gitlab.steamos.cloud/steamrt/sniper/sdk
- os: windows-latest
os_short: win
steps:
- name: Install dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y clang python3-pip
echo "CC=clang" >> $GITHUB_ENV
echo "CXX=clang++" >> $GITHUB_ENV
clang --version
clang++ --version
- name: Install AMBuild
run: |
python -m pip install --upgrade pip setuptools wheel
pip install git+https://github.com/alliedmodders/ambuild
- name: Checkout
uses: actions/checkout@v4
with:
path: project
submodules: recursive

- name: Checkout CS2 SDK
uses: actions/checkout@v4
with:
repository: alliedmodders/hl2sdk
ref: cs2
path: hl2sdk-cs2

- name: Checkout Metamod:Source
uses: actions/checkout@v4
with:
repository: alliedmodders/metamod-source
ref: master
path: metamod-source
submodules: recursive

- name: Build
working-directory: project
shell: bash
run: |
mkdir build && cd build
python ../configure.py --enable-optimize --sdks=cs2 --targets=x86_64 --hl2sdk-manifests=./hl2sdk-manifests
ambuild
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ runner.os }}
path: project/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@v4

- name: Package
run: |
7z a -mx9 linux.zip ./Linux/*
7z a -mx9 windows.zip ./Windows/*
- name: Release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: '*.zip'
tag: ${{ github.ref }}
file_glob: true
6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[submodule "third_party/dynlibutils"]
path = third_party/dynlibutils
url = https://github.com/komashchenko/DynLibUtils
[submodule "hl2sdk-manifests"]
path = hl2sdk-manifests
url = https://github.com/alliedmodders/hl2sdk-manifests
286 changes: 286 additions & 0 deletions AMBuildScript
Original file line number Diff line number Diff line change
@@ -0,0 +1,286 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python:
import os, sys

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 ResolveMMSRoot():
prenormalized_path = None
if builder.options.mms_path:
prenormalized_path = builder.options.mms_path
else:
prenormalized_path = ResolveEnvPath('MMSOURCE112', 'mmsource-1.12')
if not prenormalized_path:
prenormalized_path = ResolveEnvPath('MMSOURCE111', 'mmsource-1.11')
if not prenormalized_path:
prenormalized_path = ResolveEnvPath('MMSOURCE110', 'mmsource-1.10')
if not prenormalized_path:
prenormalized_path = ResolveEnvPath('MMSOURCE_DEV', 'metamod-source')
if not prenormalized_path:
prenormalized_path = ResolveEnvPath('MMSOURCE_DEV', 'mmsource-central')
if not prenormalized_path or not os.path.isdir(prenormalized_path):
raise Exception('Could not find a source copy of Metamod:Source')

return os.path.abspath(os.path.normpath(prenormalized_path))

mms_root = ResolveMMSRoot()

if not builder.options.hl2sdk_manifests:
raise Exception('Could not find a source copy of HL2SDK manifests')
hl2sdk_manifests = builder.options.hl2sdk_manifests

SdkHelpers = builder.Eval(os.path.join(hl2sdk_manifests, 'SdkHelpers.ambuild'), {
'Project': 'metamod'
})

class MMSPluginConfig(object):
def __init__(self):
self.sdk_manifests = []
self.sdks = {}
self.sdk_targets = []
self.binaries = []
self.mms_root = mms_root
self.all_targets = []
self.target_archs = set()

if builder.options.plugin_name is not None:
self.plugin_name = builder.options.plugin_name
else:
self.plugin_name = 'client_cvar_value'

if builder.options.plugin_alias is not None:
self.plugin_alias = builder.options.plugin_alias
else:
self.plugin_alias = 'client_cvar_value'

if builder.options.targets:
target_archs = builder.options.targets.split(',')
else:
target_archs = ['x86', '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.')

def findSdkPath(self, sdk_name):
dir_name = 'hl2sdk-{}'.format(sdk_name)
if builder.options.hl2sdk_root:
sdk_path = os.path.join(builder.options.hl2sdk_root, dir_name)
if os.path.exists(sdk_path):
return sdk_path
return ResolveEnvPath('HL2SDK{}'.format(sdk_name.upper()), dir_name)

def detectSDKs(self):
sdk_list = [s for s in builder.options.sdks.split(',') if s]
SdkHelpers.find_sdk_path = self.findSdkPath
SdkHelpers.findSdks(builder, self.all_targets, sdk_list)

self.sdks = SdkHelpers.sdks
self.sdk_manifests = SdkHelpers.sdk_manifests
self.sdk_targets = SdkHelpers.sdk_targets

if len(self.sdks) > 1:
raise Exception('Only one sdk at a time is supported, for multi-sdk approach use loader based solution.')

def configure(self):
for cxx in self.all_targets:
if cxx.target.arch not in ['x86', 'x86_64']:
raise Exception('Unknown target architecture: {0}'.format(arch))

self.configure_cxx(cxx)

def configure_cxx(self, cxx):
if cxx.behavior == 'gcc':
cxx.defines += [
'stricmp=strcasecmp',
'_stricmp=strcasecmp',
'_snprintf=snprintf',
'_vsnprintf=vsnprintf',
'HAVE_STDINT_H',
'GNUC',
]
cxx.cflags += [
'-pipe',
'-fno-strict-aliasing',
'-Wall',
'-Werror',
'-Wno-uninitialized',
'-Wno-unused',
'-Wno-switch',
'-Wno-parentheses',
'-msse',
'-fPIC',
]

cxx.cxxflags += ['-std=c++17']
if (cxx.version >= 'gcc-4.0') or cxx.family == 'clang':
cxx.cflags += ['-fvisibility=hidden']
cxx.cxxflags += ['-fvisibility-inlines-hidden']
cxx.cxxflags += [
'-fno-exceptions',
'-fno-rtti',
'-fno-threadsafe-statics',
'-Wno-non-virtual-dtor',
'-Wno-overloaded-virtual',
'-Wno-register',
]
if (cxx.version >= 'gcc-4.7' or cxx.family == 'clang'):
cxx.cxxflags += ['-Wno-delete-non-virtual-dtor']
if cxx.family == 'gcc':
cxx.cflags += ['-mfpmath=sse']
if cxx.family == 'clang':
cxx.cxxflags += ['-Wno-implicit-exception-spec-mismatch']
if cxx.version >= 'clang-3.9':
cxx.cxxflags += ['-Wno-expansion-to-defined']
if cxx.version >= 'clang-3.6':
cxx.cxxflags += ['-Wno-inconsistent-missing-override']
if cxx.version >= 'clang-3.4':
cxx.cxxflags += ['-Wno-deprecated-register']
else:
cxx.cxxflags += ['-Wno-deprecated']

# Work around SDK warnings.
if cxx.version >= 'clang-10.0':
cxx.cflags += [
'-Wno-implicit-int-float-conversion',
'-Wno-tautological-overlap-compare',
]

elif cxx.like('msvc'):
if builder.options.debug == '1':
cxx.cflags += ['/MTd']
cxx.linkflags += ['/NODEFAULTLIB:libcmt']
else:
cxx.cflags += ['/MT']
cxx.defines += [
'_CRT_SECURE_NO_DEPRECATE',
'_CRT_SECURE_NO_WARNINGS',
'_CRT_NONSTDC_NO_DEPRECATE',
]
cxx.cflags += [
'/W3',
'/Zi',
'/std:c++17',
]
cxx.cxxflags += ['/TP']

cxx.linkflags += [
'/SUBSYSTEM:WINDOWS',
'kernel32.lib',
'user32.lib',
'gdi32.lib',
'winspool.lib',
'comdlg32.lib',
'advapi32.lib',
'shell32.lib',
'ole32.lib',
'oleaut32.lib',
'uuid.lib',
'odbc32.lib',
'odbccp32.lib',
]

# Optimization
if builder.options.opt == '1':
cxx.defines += ['NDEBUG']
if cxx.behavior == 'gcc':
cxx.cflags += ['-O3']
elif cxx.behavior == 'msvc':
cxx.cflags += ['/Ox', '/Zo']
cxx.linkflags += ['/OPT:ICF', '/OPT:REF']

# Debugging
if builder.options.debug == '1':
cxx.defines += ['DEBUG', '_DEBUG']
if cxx.behavior == 'gcc':
cxx.cflags += ['-g3']
elif cxx.behavior == 'msvc':
cxx.cflags += ['/Od', '/RTC1']

# Don't omit the frame pointer.
# This needs to be after our optimization flags which could otherwise disable it.
if cxx.behavior == 'gcc':
cxx.cflags += ['-fno-omit-frame-pointer']
elif cxx.behavior == 'msvc':
cxx.cflags += ['/Oy-']

# Platform-specifics
if cxx.target.platform == 'linux':
cxx.defines += ['LINUX', '_LINUX', 'POSIX', '_FILE_OFFSET_BITS=64']
if cxx.family == 'gcc':
cxx.linkflags += ['-static-libgcc']
elif cxx.family == 'clang':
cxx.linkflags += ['-lgcc_eh']
cxx.linkflags += ['-static-libstdc++']
elif cxx.target.platform == 'windows':
cxx.defines += ['WIN32', '_WINDOWS']

# Finish up.
# Custom defines here
cxx.defines += [ ]
# Custom includes here
cxx.includes += [ ]

def Library(self, cxx, name):
binary = cxx.Library(name)
return binary

def HL2Library(self, context, compiler, name, sdk):
binary = self.Library(compiler, name)
mms_core_path = os.path.join(self.mms_root, 'core')
cxx = binary.compiler

cxx.cxxincludes += [
os.path.join(context.currentSourcePath),
os.path.join(mms_core_path),
os.path.join(mms_core_path, 'sourcehook'),
]

defines = []
for other_sdk in self.sdk_manifests:
cxx.defines += ['SE_{}={}'.format(other_sdk['define'], other_sdk['code'])]

if sdk['source2']:
cxx.defines += ['META_IS_SOURCE2']
binary.sources += [
os.path.join(sdk['path'], 'public', 'tier0', 'memoverride.cpp'),
]

SdkHelpers.configureCxx(context, binary, sdk)

return binary

MMSPlugin = MMSPluginConfig()
MMSPlugin.detectSDKs()
MMSPlugin.configure()

BuildScripts = [
'AMBuilder',
'PackageScript',
]

builder.Build(BuildScripts, { 'MMSPlugin': MMSPlugin })
Loading

0 comments on commit 0b0e9f3

Please sign in to comment.