From f66867e53570476ed6b26da5452b6f9f09bd531e Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sun, 1 Oct 2023 08:25:32 -0700 Subject: [PATCH] Sketch out what a meson build might look like. --- core/meson.build | 47 ++++++++ loader/meson.build | 33 ++++++ meson.build | 252 +++++++++++++++++++++++++++++++++++++++++ versionlib/meson.build | 27 +++++ 4 files changed, 359 insertions(+) create mode 100644 core/meson.build create mode 100644 loader/meson.build create mode 100644 meson.build create mode 100644 versionlib/meson.build diff --git a/core/meson.build b/core/meson.build new file mode 100644 index 0000000..09fabd6 --- /dev/null +++ b/core/meson.build @@ -0,0 +1,47 @@ + +core_builds = [] +core_sources = [ + 'metamod.cpp', + 'metamod_console.cpp', + 'metamod_oslink.cpp', + 'metamod_plugins.cpp', + 'metamod_util.cpp', + 'provider/provider_base.cpp', + 'sourcehook/sourcehook.cpp', + 'sourcehook/sourcehook_impl_chookidman.cpp', + 'sourcehook/sourcehook_impl_chookmaninfo.cpp', + 'sourcehook/sourcehook_impl_cproto.cpp', + 'sourcehook/sourcehook_impl_cvfnptr.cpp', + 'gamedll_bridge.cpp', + 'vsp_bridge.cpp' +] + +if target_machine.cpu_family() == 'x86' + core_sources += [ + 'sourcehook/sourcehook_hookmangen.cpp', + ] +endif + +foreach sdk : SDKs + core_binary_name = 'metamod.2.' + sdk['name'] + + sdk_core_sources = core_sources + if sdk['name'] == 'cs2' or sdk['name'] == 'dota' + sdk_core_sources += [ + 'provider/source2/provider_source2.cpp', + ] + else + sdk_core_sources += [ + 'provider/source/provider_source.cpp', + 'provider/source/provider_source_console.cpp', + ] + endif + + shared_module(core_binary_name, + sdk_core_sources, + versionlib_header, + name_prefix: '', + cpp_args: sdk['rules']['cpp_args'], + link_args: sdk['rules']['link_args'], + include_directories: sdk['rules']['include_directories']) +endforeach diff --git a/loader/meson.build b/loader/meson.build new file mode 100644 index 0000000..269f8e0 --- /dev/null +++ b/loader/meson.build @@ -0,0 +1,33 @@ +loader_srcs = [ + 'loader.cpp', + 'gamedll.cpp', + 'serverplugin.cpp', + 'utility.cpp', +] + +loader_cpp_args = [] +loader_include_directories = [ + SourcehookIncludes +] +loader_link_args = ['-lgcc_eh'] +if target_machine.system() == 'linux' + if target_machine.cpu_family() == 'x86_64' + shared_module('libserver', loader_srcs, + include_directories: loader_include_directories, + link_args: loader_link_args, + name_prefix: '', + cpp_args: ['-DLIB_PREFIX="lib"', '-DLIB_SUFFIX=".so"']) + elif target_machine.cpu_family() == 'x86' + shared_module('server_i486', loader_srcs, + include_directories: loader_include_directories, + link_args: loader_link_args, + name_prefix: '', + cpp_args: ['-DLIB_PREFIX=""', '-DLIB_SUFFIX="_i486.so"']) + endif +endif + +shared_module('server', loader_srcs, + include_directories: loader_include_directories, + link_args: loader_link_args, + name_prefix: '', + cpp_args: ['-DLIB_PREFIX="lib"', '-DLIB_SUFFIX=".so"']) diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..8dc2091 --- /dev/null +++ b/meson.build @@ -0,0 +1,252 @@ +project('metamod', 'c', 'cpp') + +fs = import('fs') +compiler = meson.get_compiler('cpp') + +if compiler.get_id() == 'clang' or compiler.get_id() == 'gcc' + global_defines = [ + '-Dstricmp=strcasecmp', + '-D_stricmp=strcasecmp', + '-D_snprintf=snprintf', + '-D_vsnprintf=vsnprintf', + '-DHAVE_STDINT_H', + '-DGNUC', + ] + add_project_arguments(global_defines, language: ['c', 'cpp']) + + global_arguments = [ + '-pipe', + '-fno-strict-aliasing', + '-Wall', + '-Werror', + '-Wno-uninitialized', + '-Wno-unused', + '-Wno-switch', + '-msse', + '-fPIC', + '-fno-omit-frame-pointer', + ] + add_project_arguments(global_arguments, language: ['c', 'cpp']) + + global_cxx_arguments = [ + '-std=c++14', + '-fno-exceptions', + '-fno-rtti', + '-fno-threadsafe-statics', + '-Wno-non-virtual-dtor', + '-Wno-overloaded-virtual', + ] + add_project_arguments(global_cxx_arguments, language: ['cpp']) + + if compiler.has_argument('-Wno-delete-non-virtual-dtor') + add_project_arguments('-Wno-delete-non-virtual-dtor', language: 'cpp') + endif + if compiler.has_argument('-mfpmath') + add_project_arguments('-mfpmath=sse', language: 'cpp') + endif + if compiler.has_argument('-Wno-implicit-exception-spec-mismatch') + add_project_arguments('-Wno-implicit-exception-spec-mismatch', language: 'cpp') + endif + if compiler.has_argument('-Wno-expansion-to-defined') + add_project_arguments('-Wno-expansion-to-defined', language: 'cpp') + endif + if compiler.has_argument('-Wno-inconsistent-missing-override') + add_project_arguments('-Wno-inconsistent-missing-override', language: 'cpp') + endif + if compiler.has_argument('-Wno-deprecated-register') + add_project_arguments('-Wno-deprecated-register', language: 'cpp') + elif compiler.has_argument('-Wno-deprecated') + add_project_arguments('-Wno-deprecated', language: 'cpp') + endif + if compiler.has_argument('-Wno-implicit-int-float-conversion') + add_project_arguments('-Wno-implicit-int-float-conversion', language: 'cpp') + endif + if compiler.has_argument('') + add_project_arguments('-Wno-tautological-overlap-compare', language: 'cpp') + endif + + add_project_arguments('-D_LINUX', language: 'cpp') + add_project_arguments('-DPOSIX', language: 'cpp') + add_project_arguments('-D_FILE_OFFSET_BITS=64', language: 'cpp') +endif + +TargetPlatform = target_machine.system() + '-' + target_machine.cpu_family() +SourcehookIncludes = include_directories('core/sourcehook') +AMTL = include_directories('third_party/amtl') + +PossibleSDKs = { + 'l4d': { + 'sdk_def': 'LEFT4DEAD', + 'sdk_code': '13', + 'platforms': ['windows-x86', 'linux-x86'], + 'linux-x86': { + 'dynamic_libs': ['libtier0.so', 'libvstdlib.so'], + } + }, + 'l4d2': { + 'sdk_def': 'LEFT4DEAD2', + 'sdk_code': '16', + 'platforms': ['windows-x86', 'linux-x86'], + 'linux-x86': { + 'dynamic_libs': ['libtier0_srv.so', 'libvstdlib_srv.so'], + 'flags': ['-DNO_HOOK_MALLOC', '-DNO_MALLOC_OVERRIDE'], + } + }, + 'csgo': { + 'sdk_def': 'CSGO', + 'sdk_code': '23', + 'platforms': ['windows-x86', 'linux-x86', 'linux-x86_64'], + 'linux-x86': { + 'interfaces': 'interfaces.a', + 'dynamic_libs': ['libtier0.so', 'libvstdlib.so'], + 'flags': ['-D_GLIBCXX_USE_CXX11_ABI=0'], + 'link_flags': ['-lstdc++'], + }, + 'linux-x86_64': { + 'dynamic_libs': ['libtier0_client.so', 'libvstdlib_client.so'], + 'flags': ['-D_GLIBCXX_USE_CXX11_ABI=0'], + 'link_flags': ['-lstdc++'], + }, + }, + 'mock': { + 'sdk_def': 'MOCK', + 'sdk_code': '999', + 'platforms': ['windows-x86', 'windows-x86_64', 'linux-x86', 'linux-x86_64'], + 'linux-x86': { + 'dynamic_libs': ['tier0_i486.so', 'vstdlib_i486.so'], + }, + 'linux-x86_64': { + 'dynamic_libs': ['libtier0_client.so', 'libvstdlib_client.so'], + }, + } +} + +subdir('versionlib') + +SDKDefines = [] +foreach sdk_name, sdk : PossibleSDKs + SDKDefines += ['-DSE_' + sdk['sdk_def'] + '=' + sdk['sdk_code']] +endforeach + +SDKs = [] +foreach sdk_name, sdk : PossibleSDKs + if TargetPlatform not in sdk['platforms'] + continue + endif + + sdk_dir_name = sdk_name + if 'dir_name' in sdk + sdk_dir_name = sdk['dir_name'] + endif + sdk_path = join_paths(fs.parent(meson.source_root()), 'hl2sdk-' + sdk_dir_name) + if not fs.is_dir(sdk_path) + message(sdk_path) + continue + endif + + sdk += { + 'path': sdk_path, + 'name': sdk_name, + } + + platform_rules = {} + if TargetPlatform in sdk + platform_rules += sdk[TargetPlatform] + endif + + if 'lib_folder' not in platform_rules + if target_machine.system() == 'linux' + if target_machine.cpu_family() == 'x86_64' + platform_rules += { 'lib_folder': join_paths('lib', 'linux64') } + elif target_machine.cpu_family() == 'x86' + platform_rules += { 'lib_folder': join_paths('lib', 'linux') } + endif + endif + endif + + if 'tier1_name' not in platform_rules + if target_machine.system() == 'linux' + if target_machine.cpu_family() == 'x86_64' + platform_rules += { 'tier1': 'tier1.a' } + elif target_machine.cpu_family() == 'x86' + platform_rules += { 'tier1': 'tier1_i486.a' } + endif + endif + endif + + link_flags = [] + if target_machine.system() == 'linux' + if sdk_name == 'mock' + link_flags += ['-Wl,-z,-origin'] + endif + link_flags += [join_paths(sdk_path, platform_rules['lib_folder'], platform_rules['tier1'])] + endif + + if 'interfaces' in platform_rules + link_flags += [join_paths(sdk_path, platform_rules['lib_folder'], platform_rules['interfaces'])] + endif + if 'mathlib' in platform_rules + link_flags += [join_paths(sdk_path, platform_rules['lib_folder'], platform_rules['mathlib'])] + endif + + if target_machine.system() == 'linux' + link_flags = ['-lm'] + link_flags + endif + if 'link_flags' in platform_rules + link_flags += platform_rules['link_flags'] + endif + + include_dirs = [ + AMTL, + SourcehookIncludes, + include_directories('loader'), + include_directories('public'), + ] + + paths = [ + 'common', + 'public', + join_paths('game', 'shared'), + join_paths('game_shared'), + join_paths('public', 'dlls'), + join_paths('public', 'engine'), + join_paths('public', 'game', 'server'), + join_paths('public', 'mathlib'), + join_paths('public', 'tier0'), + join_paths('public', 'tier1'), + join_paths('public', 'vstdlib'), + ] + foreach path : paths + full_path = join_paths(sdk_path, path) + if fs.is_dir(full_path) + include_dirs += [include_directories(full_path)] + endif + endforeach + + flags = [] + flags += SDKDefines + flags += ['-DSOURCE_ENGINE=' + sdk['sdk_code']] + + if compiler.get_id() in ['gcc', 'clang'] + flags += ['-DCOMPILER_GCC'] + endif + if target_machine.cpu_family() == 'x86_64' + flags += ['-DX64BITS', '-DPLATFORM_64BITS'] + endif + + if 'flags' in platform_rules + flags += platform_rules['flags'] + endif + + platform_rules += { + 'cpp_args': flags, + 'link_args': link_flags, + 'include_directories': include_dirs, + } + sdk += { 'rules': platform_rules } + + SDKs += [sdk] +endforeach + +subdir('loader') +subdir('core') diff --git a/versionlib/meson.build b/versionlib/meson.build new file mode 100644 index 0000000..7bb24a1 --- /dev/null +++ b/versionlib/meson.build @@ -0,0 +1,27 @@ +python3 = find_program('python3') + +versionlib_inputs = [ + join_paths('..', 'support', 'buildbot', 'generate_headers.py'), + join_paths('..', 'product.version'), +] +versionlib_cmd = [ + python3, + versionlib_inputs[0], + meson.source_root(), + '@OUTDIR@', +] + +versionlib_header_tgt = custom_target('versionlib_header', + output: 'metamod_version_auto.h', + input: versionlib_inputs, + command: versionlib_cmd) +versionlib_header = versionlib_header_tgt[0] + +versionlib_includes = [ + include_directories(join_paths('..', 'public')), +] + +versionlib = static_library('version', + ['versionlib.cpp'], + versionlib_header, + include_directories: versionlib_includes)