# clang might need _LIBCPP_ENABLE_CXX26_REMOVED_CODECVT

project('lel-guecs', 'cpp',
  version: '0.2.0',
  default_options: [
    'cpp_std=c++20',
    'cpp_args=-D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1',
  ])

# use this for common options only for our executables
cpp_args=[]
link_args=[]
# these are passed as override_defaults
exe_defaults = [ 'warning_level=2' ]

cc = meson.get_compiler('cpp')
dependencies = []

if build_machine.system() == 'windows'
  sfml_main = dependency('sfml_main')
  opengl32 = cc.find_library('opengl32', required: true)
  winmm = cc.find_library('winmm', required: true)
  gdi32 = cc.find_library('gdi32', required: true)

  dependencies += [
      opengl32, winmm, gdi32, sfml_main
  ]
  exe_defaults += ['werror=true']

elif build_machine.system() == 'darwin'
  add_global_link_arguments(
    language: 'cpp',
  )

  opengl = dependency('OpenGL')
  corefoundation = dependency('CoreFoundation')
  carbon = dependency('Carbon')
  cocoa = dependency('Cocoa')
  iokit = dependency('IOKit')
  corevideo = dependency('CoreVideo')

  link_args += ['-ObjC']
  exe_defaults += ['werror=false']
  dependencies += [
    opengl, corefoundation, carbon, cocoa, iokit, corevideo
  ]
endif

catch2 = subproject('catch2').get_variable('catch2_with_main_dep')
fmt = subproject('fmt').get_variable('fmt_dep')
json = subproject('nlohmann_json').get_variable('nlohmann_json_dep')
freetype2 = subproject('freetype2').get_variable('freetype_dep')

flac = subproject('flac').get_variable('flac_dep')
ogg = subproject('ogg').get_variable('libogg_dep')
vorbis = subproject('vorbis').get_variable('vorbis_dep')
vorbisfile = subproject('vorbis').get_variable('vorbisfile_dep')
vorbisenc = subproject('vorbis').get_variable('vorbisenc_dep')
sfml_audio = subproject('sfml').get_variable('sfml_audio_dep')
sfml_graphics = subproject('sfml').get_variable('sfml_graphics_dep')
sfml_system = subproject('sfml').get_variable('sfml_system_dep')
sfml_window = subproject('sfml').get_variable('sfml_window_dep')

lib_depends = [ fmt, sfml_graphics, sfml_system, sfml_window ]

dependencies += [
  json, freetype2, flac, ogg,
  vorbis, vorbisfile, vorbisenc, sfml_audio,
] + lib_depends


sources = [
  'src/guecs/ui.cpp',
  'src/guecs/lel.cpp',
  'src/guecs/theme.cpp',
  'src/guecs/sfml/components.cpp',
]

sfml_impl = [
  'src/guecs/sfml/config.cpp',
  'src/guecs/sfml/backend.cpp',
  'src/guecs/sfml/shaders.cpp',
  'src/guecs/sfml/sound.cpp',
  'src/guecs/sfml/textures.cpp',
]

lel_guecs_inc = include_directories('include')

lel_guecs_lib = static_library('lel-guecs',
  sources,
  pic: true,
  cpp_args: cpp_args,
  include_directories: lel_guecs_inc,
  override_options: exe_defaults,
  dependencies: lib_depends)

lel_guecs_dep = declare_dependency(
  link_with: lel_guecs_lib,
  include_directories: lel_guecs_inc)

executable('runtests', sfml_impl + [
  'tests/lel.cpp',
  'tests/shaders.cpp',
  'tests/sound.cpp',
  'tests/textures.cpp',
  'tests/guecs.cpp',
  ],
  cpp_args: cpp_args,
  link_args: link_args,
  override_options: exe_defaults,
  include_directories: lel_guecs_inc,
  link_with: [lel_guecs_lib],
  dependencies: dependencies + [catch2])

executable('clicker_game', sfml_impl + [
  'demos/clicker_game.cpp',
  ],
  cpp_args: cpp_args,
  link_args: link_args,
  override_options: exe_defaults,
  include_directories: lel_guecs_inc,
  link_with: [lel_guecs_lib],
  dependencies: dependencies)

executable('calc', sfml_impl + [
  'demos/calc.cpp',
  ],
  cpp_args: cpp_args,
  link_args: link_args,
  override_options: exe_defaults,
  include_directories: lel_guecs_inc,
  link_with: [lel_guecs_lib],
  dependencies: dependencies)