From a6de4efe6e6a6daaeab233e4cbee397510f6149e Mon Sep 17 00:00:00 2001 From: PeakKS Date: Sat, 5 Oct 2024 21:53:27 -0400 Subject: [PATCH 1/5] meson: add support for building versionlib --- meson.build | 6 ++++ meson_options.txt | 26 ++++++++++++++++ versionlib/meson.build | 46 ++++++++++++++++++++++++++++ versionlib/metamod_version_auto.h.in | 16 ++++++++++ 4 files changed, 94 insertions(+) create mode 100644 meson.build create mode 100644 meson_options.txt create mode 100644 versionlib/meson.build create mode 100644 versionlib/metamod_version_auto.h.in diff --git a/meson.build b/meson.build new file mode 100644 index 000000000..6b35d61fe --- /dev/null +++ b/meson.build @@ -0,0 +1,6 @@ +project('metamod', 'c', 'cpp') + +public_inc = include_directories('public') + +subdir('versionlib') + diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 000000000..a1b1f16f4 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,26 @@ +option('sdks', type: 'array', choices: [ + 'csgo', + 'hl2dm', + 'nucleardawn', + 'l4d2', + 'dods', + 'l4d', + 'css', + 'tf2', + 'insurgency', + 'sdk2013', + 'dota', + 'doi', + 'orangebox', + 'blade', + 'episode1', + 'bms', + 'pvkii', + 'mcv', + 'darkm', + 'swarm', + 'bgt', + 'eye', + 'contagion', + 'cs2', +]) \ No newline at end of file diff --git a/versionlib/meson.build b/versionlib/meson.build new file mode 100644 index 000000000..ba0463b96 --- /dev/null +++ b/versionlib/meson.build @@ -0,0 +1,46 @@ +fs = import('fs') +metamod_version_string = fs.read('../product.version').strip() + +version_tag = metamod_version_string.split('-') + +version = version_tag[0].split('.') +major = version[0] +minor = version[1] +release = version[2] + +tag = version_tag[1] + +revision = run_command('git', 'rev-list', '--count', 'HEAD', check: true).stdout().strip() +shorthash = run_command('git', 'log', '--pretty=format:%h', '-n', '1', check: true).stdout().strip() +product = '.'.join(major, minor, release) + +if tag != '' + product += '-' + tag + if tag == 'dev' + product += '+' + revision + endif +endif + +metamod_version_config = configuration_data({ + 'tag': tag, + 'shorthash': shorthash, + 'major': major, + 'minor': minor, + 'release': release, + 'product': product, + 'revision': revision, +}) + +configure_file( + input: 'metamod_version_auto.h.in', + output: 'metamod_version_auto.h', + configuration: metamod_version_config +) + +versionlib = static_library( + 'version', + 'versionlib.cpp', + include_directories: [ + public_inc, + ] +) \ No newline at end of file diff --git a/versionlib/metamod_version_auto.h.in b/versionlib/metamod_version_auto.h.in new file mode 100644 index 000000000..06a9ac605 --- /dev/null +++ b/versionlib/metamod_version_auto.h.in @@ -0,0 +1,16 @@ +#ifndef _METAMOD_AUTO_VERSION_INFORMATION_H_ +#define _METAMOD_AUTO_VERSION_INFORMATION_H_ + +#define MMS_BUILD_TAG "@tag@" +#define MMS_BUILD_CSET "@shorthash@" +#define MMS_BUILD_MAJOR "@major@" +#define MMS_BUILD_MINOR "@minor@" +#define MMS_BUILD_RELEASE "@release@" +#define MMS_BUILD_LOCAL_REV "@revision@" + +#define MMS_BUILD_UNIQUEID "@revision@:" MMS_BUILD_CSET + +#define MMS_VERSION_STRING "@product@" +#define MMS_VERSION_FILE @major@,@minor@,@release@,0 + +#endif /* _METAMOD_AUTO_VERSION_INFORMATION_H_ */ From 7fc4c34c2a3158f9ce7df05ddb6775fd5db1a27a Mon Sep 17 00:00:00 2001 From: PeakKS Date: Sat, 5 Oct 2024 23:06:59 -0400 Subject: [PATCH 2/5] meson: add arguments to project --- meson.build | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 6b35d61fe..a53022534 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,65 @@ -project('metamod', 'c', 'cpp') +project('metamod', 'c', 'cpp', default_options: [ + 'warning_level=1', + 'werror=true', + 'cpp_std=c++14', +]) + +compiler = meson.get_compiler('cpp') +if compiler.get_id() == 'clang' or compiler.get_id() == 'gcc' + # C/C++ Defines + add_project_arguments([ + '-Dstricmp=strcasecmp', + '-D_stricmp=strcasecmp', + '-D_snprintf=snprintf', + '-D_vsnprintf=vsnprintf', + '-DHAVE_STDINT_H', + '-DGNUC', + ], language: ['c', 'cpp']) + + # C/C++ Arguments + add_project_arguments([ + '-pipe', + '-fno-strict-aliasing', + '-Wno-uninitialized', + '-Wno-unused', + '-Wno-switch', + '-msse', + '-fPIC', + '-fno-omit-frame-pointer', + ], language: ['c', 'cpp']) + + # C++ Arguments + add_project_arguments([ + '-fno-exceptions', + '-fno-rtti', + '-fno-threadsafe-statics', + '-Wno-non-virtual-dtor', + '-Wno-overloaded-virtual', + ], language: 'cpp') + + # Optional C++ Arguments + optional_arguments = [ + '-Wno-delete-non-virtual-dtor', + '-mfpmath=sse', + '-Wno-implicit-exception-spec-mismatch', + '-Wno-expansion-to-defined', + '-Wno-inconsistent-missing-override', + '-Wno-deprecated-register', + '-Wno-deprecated', + '-Wno-implicit-int-float-conversion', + '-Wno-tautological-overlap-compare', + ] + foreach arg : optional_arguments + if compiler.has_argument(arg) + add_project_arguments(arg, language: 'cpp') + endif + endforeach + + # Platform Arguments + add_project_arguments('-D_LINUX', language: 'cpp') + add_project_arguments('-DPOSIX', language: 'cpp') + add_project_arguments('-D_FILE_OFFSET_BITS=64', language: 'cpp') +endif public_inc = include_directories('public') From 8951660b57396b3f0b1d97e057f4df79695688d5 Mon Sep 17 00:00:00 2001 From: PeakKS Date: Sun, 6 Oct 2024 00:23:00 -0400 Subject: [PATCH 3/5] meson: add support for building loader --- loader/meson.build | 60 ++++++++++++++++++++++++++++++++++++++++++++++ meson.build | 4 +++- 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 loader/meson.build diff --git a/loader/meson.build b/loader/meson.build new file mode 100644 index 000000000..e65c91c21 --- /dev/null +++ b/loader/meson.build @@ -0,0 +1,60 @@ +loader_src = [ + 'loader.cpp', + 'gamedll.cpp', + 'serverplugin.cpp', + 'utility.cpp', +] + +if target_machine.system() == 'linux' + build_target('server', + target_type: 'shared_library', + override_options: 'b_lundef=false', + sources: loader_src, + include_directories: [ + sourcehook_inc, + ], + name_prefix: '', + cpp_args: [ + '-DLIB_PREFIX=""', + '-DLIB_SUFFIX=".so"', + ] + ) + + if target_machine.cpu_family() == 'x86_64' + build_target('libserver', + target_type: 'shared_library', + override_options: 'b_lundef=false', + sources: loader_src, + include_directories: [ + sourcehook_inc, + ], + name_prefix: '', + cpp_args: [ + '-DLIB_PREFIX="lib"', + '-DLIB_SUFFIX=".so"', + ] + ) + elif target_machine.cpu_family() == 'x86' + build_target('server_i486', + target_type: 'shared_library', + override_options: 'b_lundef=false', + sources: loader_src, + include_directories: [ + sourcehook_inc, + ], + cpp_args: [ + '-DLIB_PREFIX=""', + '-DLIB_SUFFIX="_i486.so"', + ] + ) + endif +else + build_target('server', + target_type: 'shared_library', + override_options: 'b_lundef=false', + sources: loader_src, + include_directories: [ + sourcehook_inc, + ], + ) +endif \ No newline at end of file diff --git a/meson.build b/meson.build index a53022534..025e6c38e 100644 --- a/meson.build +++ b/meson.build @@ -62,6 +62,8 @@ if compiler.get_id() == 'clang' or compiler.get_id() == 'gcc' endif public_inc = include_directories('public') +core_inc = include_directories('core') +sourcehook_inc = include_directories('core/sourcehook') subdir('versionlib') - +subdir('loader') \ No newline at end of file From 41fe2a5826aa667ab53d70791c0b0ac2ad396101 Mon Sep 17 00:00:00 2001 From: PeakKS Date: Mon, 7 Oct 2024 10:15:40 -0400 Subject: [PATCH 4/5] meson: add hl2sdk-cs2 as subproject, build core --- core/meson.build | 107 ++++++++++++++++++++++++++++++++++++ meson.build | 11 +++- subprojects/.gitignore | 2 + subprojects/hl2sdk-cs2.wrap | 4 ++ 4 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 core/meson.build create mode 100644 subprojects/.gitignore create mode 100644 subprojects/hl2sdk-cs2.wrap diff --git a/core/meson.build b/core/meson.build new file mode 100644 index 000000000..80cb904a9 --- /dev/null +++ b/core/meson.build @@ -0,0 +1,107 @@ +core_src = [ + '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', + 'sourcehook/sourcehook_hookmangen.cpp', + 'gamedll_bridge.cpp', +] + +foreach sdk : get_option('sdks') + sdk_proj = subproject('hl2sdk-' + sdk) + + sdk_platforms = sdk_proj.get_variable('sdk_platforms') + if target_machine.system() not in sdk_platforms + error(sdk, 'not supported for', target_machine.system()) + elif target_machine.cpu_family() not in sdk_platforms[target_machine.system()] + error(sdk, 'not supported for', target_machine.system(), target_machine.cpu_family()) + endif + + sdk_suffix = sdk_proj.get_variable('sdk_suffix') + sdk_source2 = sdk_proj.get_variable('sdk_source2', false) + sdk_src = [] + sdk_inc = sdk_proj.get_variable('sdk_inc') + sdk_libs = sdk_proj.get_variable('sdk_libs') + sdk_deps = sdk_proj.get_variable('sdk_deps') + sdk_cpp_args = sdk_proj.get_variable('sdk_cpp_args') + sdk_link_args = [] + sdk_proto = sdk_proj.get_variable('sdk_proto') + sdk_proto_lib = sdk_proj.get_variable('sdk_proto_lib') + + if sdk_source2 + sdk_src += [ + 'provider/source2/provider_source2.cpp', + ] + sdk_cpp_args += [ + '-DMETA_IS_SOURCE2', + ] + else + sdk_src += [ + 'provider/source/provider_source.cpp', + 'provider/source/provider_source_console.cpp', + 'vsp_bridge.cpp', + ] + endif + + if target_machine.system() == 'linux' + if compiler.get_id() == 'gcc' + sdk_link_args += [ + '-static-libgcc', + ] + elif compiler.get_id() == 'clang' + sdk_link_args += [ + '-lgcc_eh', + ] + endif + sdk_link_args += [ + '-static-libstdc++', + ] + elif target_machine.system() == 'mac' + sdk_link_args += ['-liconv'] + endif + + if target_machine.cpu_family() == 'x86_64' and target_machine.system() != 'linux' + sdk_src += ['sourcehook/sourcehook_hookmangen_x86_64.cpp'] + elif target_machine.cpu_family() == 'x86' + sdk_src += ['sourcehook/sourcehook_hookmangen_x86.cpp'] + endif + + build_target('metamod.' + sdk_suffix, + name_prefix: '', + target_type: 'shared_library', + override_options: 'b_lundef=false', + sources: [ + core_src, + sdk_src, + sdk_proto, + ], + include_directories: [ + core_inc, + sdk_inc, + loader_inc, + sourcehook_inc, + amtl_inc, + public_inc, + ], + cpp_args: [ + sdk_cpp_args, + ], + link_args: [ + sdk_link_args, + ], + dependencies: [ + sdk_deps, + ], + link_with: [ + versionlib, + sdk_libs, + ] + ) +endforeach \ No newline at end of file diff --git a/meson.build b/meson.build index 025e6c38e..9f84af5f0 100644 --- a/meson.build +++ b/meson.build @@ -14,6 +14,7 @@ if compiler.get_id() == 'clang' or compiler.get_id() == 'gcc' '-D_vsnprintf=vsnprintf', '-DHAVE_STDINT_H', '-DGNUC', + '-DCOMPILER_GCC', ], language: ['c', 'cpp']) # C/C++ Arguments @@ -61,9 +62,17 @@ if compiler.get_id() == 'clang' or compiler.get_id() == 'gcc' add_project_arguments('-D_FILE_OFFSET_BITS=64', language: 'cpp') endif +if target_machine.cpu_family() == 'x86_64' + add_project_arguments('-DPLATFORM_64BITS', language: 'cpp') + add_project_arguments('-DX64BITS', language: 'cpp') +endif + public_inc = include_directories('public') +loader_inc = include_directories('loader') core_inc = include_directories('core') sourcehook_inc = include_directories('core/sourcehook') +amtl_inc = include_directories('third_party/amtl') subdir('versionlib') -subdir('loader') \ No newline at end of file +subdir('loader') +subdir('core') \ No newline at end of file diff --git a/subprojects/.gitignore b/subprojects/.gitignore new file mode 100644 index 000000000..32f8ff102 --- /dev/null +++ b/subprojects/.gitignore @@ -0,0 +1,2 @@ +hl2sdk-* +!hl2sdk-*.wrap diff --git a/subprojects/hl2sdk-cs2.wrap b/subprojects/hl2sdk-cs2.wrap new file mode 100644 index 000000000..a608b6d21 --- /dev/null +++ b/subprojects/hl2sdk-cs2.wrap @@ -0,0 +1,4 @@ +[wrap-git] +url = https://github.com/PeakKS/hl2sdk.git +revision = cs2 +depth = 1 \ No newline at end of file From 168f4c265b52d84ca35e310cfe3031ae6447e277 Mon Sep 17 00:00:00 2001 From: PeakKS Date: Mon, 7 Oct 2024 21:37:39 -0400 Subject: [PATCH 5/5] meson: make sdk configuration dependency based --- core/meson.build | 38 +++++++++---------------------------- subprojects/hl2sdk-cs2.wrap | 5 ++++- 2 files changed, 13 insertions(+), 30 deletions(-) diff --git a/core/meson.build b/core/meson.build index 80cb904a9..6f324c156 100644 --- a/core/meson.build +++ b/core/meson.build @@ -15,41 +15,24 @@ core_src = [ ] foreach sdk : get_option('sdks') - sdk_proj = subproject('hl2sdk-' + sdk) + sdk_dep = dependency(sdk) - sdk_platforms = sdk_proj.get_variable('sdk_platforms') - if target_machine.system() not in sdk_platforms - error(sdk, 'not supported for', target_machine.system()) - elif target_machine.cpu_family() not in sdk_platforms[target_machine.system()] - error(sdk, 'not supported for', target_machine.system(), target_machine.cpu_family()) - endif - - sdk_suffix = sdk_proj.get_variable('sdk_suffix') - sdk_source2 = sdk_proj.get_variable('sdk_source2', false) - sdk_src = [] - sdk_inc = sdk_proj.get_variable('sdk_inc') - sdk_libs = sdk_proj.get_variable('sdk_libs') - sdk_deps = sdk_proj.get_variable('sdk_deps') - sdk_cpp_args = sdk_proj.get_variable('sdk_cpp_args') - sdk_link_args = [] - sdk_proto = sdk_proj.get_variable('sdk_proto') - sdk_proto_lib = sdk_proj.get_variable('sdk_proto_lib') - - if sdk_source2 - sdk_src += [ + if sdk_dep.get_variable('engine') == 'source2' + sdk_src = [ 'provider/source2/provider_source2.cpp', ] - sdk_cpp_args += [ + sdk_cpp_args = [ '-DMETA_IS_SOURCE2', ] else - sdk_src += [ + sdk_src = [ 'provider/source/provider_source.cpp', 'provider/source/provider_source_console.cpp', 'vsp_bridge.cpp', ] endif + sdk_link_args = [] if target_machine.system() == 'linux' if compiler.get_id() == 'gcc' sdk_link_args += [ @@ -73,35 +56,32 @@ foreach sdk : get_option('sdks') sdk_src += ['sourcehook/sourcehook_hookmangen_x86.cpp'] endif - build_target('metamod.' + sdk_suffix, + build_target('metamod.' + sdk_dep.get_variable('suffix'), name_prefix: '', target_type: 'shared_library', override_options: 'b_lundef=false', sources: [ core_src, sdk_src, - sdk_proto, ], include_directories: [ core_inc, - sdk_inc, loader_inc, sourcehook_inc, amtl_inc, public_inc, ], cpp_args: [ - sdk_cpp_args, + sdk_cpp_args ], link_args: [ sdk_link_args, ], dependencies: [ - sdk_deps, + sdk_dep, ], link_with: [ versionlib, - sdk_libs, ] ) endforeach \ No newline at end of file diff --git a/subprojects/hl2sdk-cs2.wrap b/subprojects/hl2sdk-cs2.wrap index a608b6d21..320538321 100644 --- a/subprojects/hl2sdk-cs2.wrap +++ b/subprojects/hl2sdk-cs2.wrap @@ -1,4 +1,7 @@ [wrap-git] url = https://github.com/PeakKS/hl2sdk.git revision = cs2 -depth = 1 \ No newline at end of file +depth = 1 + +[provide] +cs2 = cs2_dep \ No newline at end of file