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)