master
meson.build
1project(
2 'Magnolia',
3 'c',
4 meson_version: '>=1.1',
5 default_options: [
6 'c_std=c89',
7 'warning_level=3',
8 ],
9)
10
11cc = meson.get_compiler('c')
12math_dep = cc.find_library('m', required: false)
13zlib_dep = dependency('zlib')
14crypto_enabled = get_option('crypto')
15
16if crypto_enabled
17 libtls_sp = subproject('libtls-bearssl', default_options: ['default_library=static'])
18 tls_dep = libtls_sp.get_variable('libtls_dep')
19 bearssl_dep = cc.find_library('bearssl')
20else
21 tls_dep = declare_dependency()
22 bearssl_dep = declare_dependency()
23endif
24
25requested_renderer = get_option('renderer')
26requested_window = get_option('windowing')
27
28# resolve windowing and renderer combo automatically
29sdl_dep = dependency('sdl2', required: false)
30opengl_dep = dependency('opengl', required: false)
31if not opengl_dep.found()
32 opengl_dep = dependency('gl', required: false)
33endif
34
35renderer_backend = requested_renderer
36window_backend = requested_window
37
38if renderer_backend == 'auto'
39 if window_backend == 'maus'
40 renderer_backend = 'small3dlib'
41 elif sdl_dep.found() and opengl_dep.found()
42 renderer_backend = 'sokol'
43 else
44 renderer_backend = 'small3dlib'
45 endif
46endif
47
48if window_backend == 'auto'
49 if renderer_backend == 'sokol'
50 window_backend = 'sdl'
51 elif sdl_dep.found()
52 window_backend = 'sdl'
53 else
54 window_backend = 'maus'
55 endif
56endif
57
58if renderer_backend == 'sokol' and window_backend != 'sdl'
59 error('sokol renderer requires -Dwindowing=sdl')
60endif
61if window_backend == 'sdl' and not sdl_dep.found()
62 error('SDL windowing requires the sdl2 dependency')
63endif
64if renderer_backend == 'sokol' and not opengl_dep.found()
65 error(
66 'sokol renderer requires an OpenGL development dependency (opengl or gl)',
67 )
68endif
69
70message('Selected renderer: ' + renderer_backend)
71message('Selected windowing: ' + window_backend)
72
73sources = [
74 'source/main.c',
75 'source/config.c',
76 'source/util.c',
77 'source/world/block.c',
78 'source/world/chunk.c',
79 'source/client/camera.c',
80 'source/client/player.c',
81 'source/client/world.c',
82 'source/net/mc_chunk.c',
83 'source/net/mc_buffer.c',
84 'source/net/mc_client.c',
85 'source/net/packet.c',
86 'vendor/stb_image_c89.c',
87 'vendor/json.c',
88]
89
90if crypto_enabled
91 sources += [
92 'source/mgrandom.c',
93 'source/net/mc_auth.c',
94 'source/net/mc_crypto.c',
95 ]
96endif
97
98include_dirs = [
99 include_directories('include', '/usr/local/include'),
100]
101
102vendor_inc = [
103 include_directories('vendor'),
104]
105
106mgmath_lib = static_library(
107 'mgmath',
108 'source/mgmath_handmade.c',
109 include_directories: include_dirs + vendor_inc,
110 dependencies: math_dep,
111 c_args: ['-Wno-pedantic'],
112 override_options: ['c_std=c99'],
113)
114
115mgmath_dep = declare_dependency(
116 include_directories: include_dirs,
117 link_with: mgmath_lib,
118 dependencies: math_dep,
119)
120
121renderer_c_args = []
122platform_c_args = []
123renderer_sources = []
124
125if window_backend == 'sdl'
126 sources += ['source/platform/platform_sdl.c']
127 platform_c_args += ['-DMG_PLATFORM_SDL']
128 platform_dep = declare_dependency(dependencies: sdl_dep)
129elif window_backend == 'maus'
130 if renderer_backend != 'small3dlib'
131 error('maus windowing requires -Drenderer=small3dlib')
132 endif
133 maus_sp = subproject('maus', default_options: ['default_library=static'])
134 maus_dep = maus_sp.get_variable('maus_dep')
135 sources += ['source/platform/platform_maus.c']
136 platform_c_args += ['-DMG_PLATFORM_MAUS']
137 platform_dep = maus_dep
138endif
139
140if renderer_backend == 'sokol'
141 sokol_gfx_lib = static_library(
142 'sokol_gfx',
143 'vendor/sokol_gfx.c',
144 include_directories: vendor_inc,
145 dependencies: opengl_dep,
146 override_options: ['c_std=c99'],
147 )
148
149 renderer_backend_dep = declare_dependency(
150 include_directories: vendor_inc,
151 link_with: sokol_gfx_lib,
152 dependencies: [opengl_dep, sdl_dep],
153 )
154 renderer_sources += ['source/renderer/renderer_sokol.c']
155 renderer_c_args += ['-DMG_RENDERER_SOKOL']
156else
157 if window_backend == 'maus'
158 software_window_dep = platform_dep
159 else
160 software_window_dep = sdl_dep
161 endif
162 renderer_backend_dep = declare_dependency(
163 include_directories: vendor_inc,
164 dependencies: software_window_dep,
165 )
166 renderer_sources += ['source/renderer/renderer_small3dlib.c']
167 renderer_c_args += ['-DMG_RENDERER_SMALL3DLIB']
168endif
169
170renderer_lib = static_library(
171 'renderer',
172 renderer_sources,
173 include_directories: include_dirs,
174 dependencies: renderer_backend_dep,
175 c_args: platform_c_args + renderer_c_args,
176 override_options: ['c_std=c99'],
177)
178
179renderer_dep = declare_dependency(
180 include_directories: include_dirs,
181 link_with: renderer_lib,
182 dependencies: renderer_backend_dep,
183 compile_args: platform_c_args,
184)
185
186deps = [platform_dep, zlib_dep, tls_dep, bearssl_dep, mgmath_dep, renderer_dep]
187
188crypto_c_args = []
189if crypto_enabled
190 crypto_c_args += ['-DMG_ENABLE_CRYPTO']
191 message('crypto: on')
192else
193 message('crypto: off')
194endif
195
196# illumos needs extra libraries before it links
197if host_machine.system() == 'sunos'
198 extra_libs = ['-lsocket', '-lnsl']
199else
200 extra_libs = []
201endif
202
203executable(
204 'magnolia',
205 sources,
206 include_directories: include_dirs + vendor_inc,
207 dependencies: deps,
208 c_args: platform_c_args + renderer_c_args + crypto_c_args,
209 link_args: extra_libs,
210 override_options: ['c_std=c99'],
211)