project('themes', 'cpp', version: '1.0.0', default_options: [ 'cpp_std=c++17', 'buildtype=release', 'warning_level=2' ] ) # Emscripten link flags emscripten_link_args = [ '-s', 'ALLOW_MEMORY_GROWTH=1', '-s', 'USE_WEBGL2=1', '-s', 'FULL_ES3=1', '-s', 'WASM=1', '-s', 'NO_EXIT_RUNTIME=1', '-s', 'FETCH' ] # Source files sources = files( # Main 'src/main.cpp', 'src/main_loop.cpp', 'src/mathlib.cpp', 'src/logger.cpp', 'src/shader.cpp', 'src/shader_fetcher.cpp', 'src/shapes_2d.cpp', 'src/webgl_context.cpp', 'src/renderer_2d.cpp', 'src/renderer_3d.cpp', # Shaders 'src/shaders/renderer2d_frag.cpp', 'src/shaders/renderer2d_vert.cpp', 'src/shaders/renderer3d_frag.cpp', 'src/shaders/renderer3d_vert.cpp', 'src/shaders/sun_frag.cpp', 'src/shaders/sun_vert.cpp', # Autumn theme 'src/autumn/autumn_theme.cpp', 'src/autumn/leaf_particle_render.cpp', 'src/autumn/tree_shape.cpp', # Winter theme 'src/winter/winter_theme.cpp', 'src/winter/snowflake.cpp', 'src/winter/windfield.cpp', # Spring theme 'src/spring/spring_theme.cpp', 'src/spring/grass_renderer.cpp', # Summer theme 'src/summer/summer_theme.cpp' ) # Include directories inc = include_directories( 'src', 'src/autumn', 'src/winter', 'src/spring', 'src/summer', 'src/shaders', 'src/_shaders', 'src/tools' ) # Custom target to build shaders from GLSL files node = find_program('node') shader_script = meson.project_source_root() + '/src/tools/shader.js' # List all GLSL shader files as inputs shader_inputs = files( 'src/_shaders/renderer2d.frag', 'src/_shaders/renderer2d.vert', 'src/_shaders/renderer3d.frag', 'src/_shaders/renderer3d.vert', 'src/_shaders/sun.frag', 'src/_shaders/sun.vert' ) # Custom target that runs whenever shader files change sh = find_program('sh') build_shaders = custom_target('build_shaders', input: shader_inputs, output: 'shaders.stamp', command: [sh, '-c', node.full_path() + ' ' + shader_script + ' && touch @OUTPUT@'], build_always_stale: true, build_by_default: true ) # Build the executable output_exe = executable('output', sources, include_directories: inc, link_args: emscripten_link_args, name_suffix: 'js' ) # Custom target to copy output files to dist directory copy_script = find_program('sh') copy_to_dist = custom_target('copy_to_dist', output: ['copy_to_dist.stamp'], input: output_exe, command: [ copy_script, '-c', 'mkdir -p ' + meson.project_source_root() + '/dist && ' + 'cp $1 ' + meson.project_source_root() + '/dist/output.js && ' + 'cp $2/output.wasm ' + meson.project_source_root() + '/dist/output.wasm && ' + 'touch $3', '--', '@INPUT@', meson.current_build_dir(), '@OUTPUT@' ], build_by_default: true, install: false ) # Add an alias target for convenience alias_target('copy-dist', copy_to_dist)