aboutsummaryrefslogtreecommitdiffstats
path: root/meson.build
diff options
context:
space:
mode:
Diffstat (limited to 'meson.build')
-rw-r--r--meson.build141
1 files changed, 141 insertions, 0 deletions
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..0f528a2
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,141 @@
+project('forts-clone', 'cpp',
+ version: '0.1.0',
+ license: 'GPL-3.0-or-later',
+ default_options: [
+ 'cpp_std=c++20',
+ 'warning_level=3',
+ 'buildtype=debugoptimized',
+ 'default_library=static',
+ ],
+ meson_version: '>=1.4.0',
+)
+
+cpp = meson.get_compiler('cpp')
+
+# =============================================================================
+# Dependencies (pre-built in /usr/local by Containerfile)
+# =============================================================================
+
+# SDL3 -- windowing + input (system package)
+sdl3_dep = dependency('sdl3', required: true)
+
+# bgfx -- GPU rendering (built from source in Containerfile)
+# CMake on Fedora installs to lib64
+bgfx_dep = cpp.find_library('bgfx', dirs: ['/usr/local/lib64', '/usr/local/lib'])
+bimg_dep = cpp.find_library('bimg', dirs: ['/usr/local/lib64', '/usr/local/lib'])
+bx_dep = cpp.find_library('bx', dirs: ['/usr/local/lib64', '/usr/local/lib'])
+
+# Box2D v3 -- physics engine (built from source in Containerfile)
+box2d_dep = cpp.find_library('box2d', dirs: ['/usr/local/lib64', '/usr/local/lib'])
+
+# SoLoud -- audio engine (built from source in Containerfile)
+soloud_dep = cpp.find_library('soloud', dirs: ['/usr/local/lib64', '/usr/local/lib'])
+
+# ENet -- networking (built from source in Containerfile)
+enet_dep = cpp.find_library('enet', dirs: ['/usr/local/lib/static', '/usr/local/lib64', '/usr/local/lib'])
+
+# IMPORTANT: only add /usr/local/include, NOT /usr/local/include/bx etc.
+# as individual paths. sys/types.h does #include <endian.h> and would
+# collide with bx/endian.h if -I/usr/local/include/bx is in the path.
+local_inc = include_directories('/usr/local/include')
+
+# Lua -- scripting. Linked STATICALLY from /usr/local/lib/liblua.a (built in the
+# Containerfile) so the binary needs no liblua .so at runtime and runs on the
+# host regardless of its distro's lua soname. Headers come from /usr/local/include.
+lua_static = cpp.find_library('lua', dirs: ['/usr/local/lib'], static: true, required: true)
+m_dep = cpp.find_library('m', required: false)
+dl_dep = cpp.find_library('dl', required: false)
+lua_dep = declare_dependency(dependencies: [lua_static, m_dep, dl_dep])
+
+# glm -- math (system package)
+glm_dep = dependency('glm', required: true)
+
+# sol2 -- Lua C++ bindings (header-only, installed to /usr/local/include)
+sol2_dep = declare_dependency(include_directories: '/usr/local/include')
+
+# EnTT -- ECS (header-only, installed to /usr/local/include)
+entt_dep = declare_dependency(include_directories: '/usr/local/include')
+
+# ImGui -- skipped for M0, added when debug UI is needed
+
+# =============================================================================
+# Engine library and executable
+# =============================================================================
+
+engine_inc = include_directories('src')
+stb_inc = include_directories('third_party/stb')
+
+# Dear ImGui (dev UI) — built as its own lib with relaxed warnings.
+imgui_inc = include_directories('third_party/imgui', 'third_party/imgui/backends')
+imgui_lib = static_library('imgui',
+ [
+ 'third_party/imgui/imgui.cpp',
+ 'third_party/imgui/imgui_draw.cpp',
+ 'third_party/imgui/imgui_tables.cpp',
+ 'third_party/imgui/imgui_widgets.cpp',
+ 'third_party/imgui/backends/imgui_impl_sdl3.cpp',
+ 'third_party/imgui/backends/imgui_impl_sdlrenderer3.cpp',
+ ],
+ include_directories: imgui_inc,
+ dependencies: sdl3_dep,
+ override_options: ['warning_level=0', 'werror=false'],
+)
+imgui_dep = declare_dependency(link_with: imgui_lib, include_directories: imgui_inc)
+
+engine_src = [
+ 'src/engine/app.cpp',
+ 'src/engine/renderer.cpp',
+ 'src/engine/input.cpp',
+ 'src/engine/camera.cpp',
+ 'src/engine/physics.cpp',
+ 'src/engine/script.cpp',
+ 'src/engine/stb_impl.cpp',
+ 'src/game/build_graph.cpp',
+ 'src/game/data.cpp',
+]
+
+engine_deps = [
+ sdl3_dep,
+ bgfx_dep, bimg_dep, bx_dep,
+ box2d_dep,
+ soloud_dep,
+ enet_dep,
+ lua_dep,
+ glm_dep,
+ sol2_dep,
+ entt_dep,
+ imgui_dep,
+]
+
+extra_inc = [local_inc, stb_inc]
+
+# Required by bx/bgfx (normally set by cmake targets; we need them manually
+# since we link raw .a files).
+# GCC 14+ on glibc: __BEGIN_DECLS from sys/types.h wraps bx endian.inl
+# templates in extern "C". -fpermissive downgrades to warnings.
+buildtype = get_option('buildtype')
+bx_debug = buildtype.startswith('debug') ? '1' : '0'
+
+extra_cpp_args = [
+ '-msse4.2',
+ '-DBX_CONFIG_DEBUG=@0@'.format(bx_debug),
+ '-DBGFX_CONFIG_DEBUG_ANNOTATION=@0@'.format(bx_debug),
+ '-DBGFX_CONFIG_MULTITHREADED=1',
+ '-DBGFX_CONFIG_VIDEO=1',
+ '-D__STDC_LIMIT_MACROS',
+ '-D__STDC_FORMAT_MACROS',
+ '-D__STDC_CONSTANT_MACROS',
+]
+
+engine_lib = static_library('engine', engine_src,
+ include_directories: [engine_inc] + extra_inc,
+ dependencies: engine_deps,
+ cpp_args: extra_cpp_args,
+)
+
+executable('forts-clone', 'src/main.cpp',
+ link_with: engine_lib,
+ include_directories: [engine_inc] + extra_inc,
+ dependencies: engine_deps,
+ cpp_args: extra_cpp_args,
+)