cmake_minimum_required(VERSION 3.16)
project(snatcher C CXX)
set(CMAKE_CXX_STANDARD 17)
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()
option(USE_SDL "Build the SDL2 front end (window, audio, input)" ON)

find_package(Threads REQUIRED)
file(GLOB GEN gen/*.cpp)
file(GLOB RT runtime/*.cpp)
add_library(musashi STATIC third_party/musashi/m68kcpu.c third_party/musashi/m68kops.c
            third_party/musashi/m68kdasm.c third_party/musashi/softfloat/softfloat.c)
target_include_directories(musashi PUBLIC third_party/musashi)
add_library(ymfm STATIC third_party/ymfm/ymfm_opn.cpp third_party/ymfm/ymfm_adpcm.cpp third_party/ymfm/ymfm_ssg.cpp)
target_compile_options(ymfm PRIVATE -w)
set_source_files_properties(${GEN} PROPERTIES COMPILE_OPTIONS "-Wno-unused-label;-Wno-unused-variable")
add_executable(snatcher ${RT} ${GEN})
target_include_directories(snatcher PRIVATE runtime)
target_link_libraries(snatcher PRIVATE musashi ymfm Threads::Threads)

if(USE_SDL)
  target_compile_definitions(snatcher PRIVATE USE_SDL)
  if(MINGW)
    # Windows: SDL2 mingw development package (x86_64-w64-mingw32 folder), SDL2.dll ships alongside
    set(SDL2_DIR "" CACHE PATH "SDL2 mingw development package (x86_64-w64-mingw32 folder)")
    target_include_directories(snatcher PRIVATE ${SDL2_DIR}/include/SDL2)
    target_compile_definitions(snatcher PRIVATE SDL_MAIN_HANDLED)
    target_link_directories(snatcher PRIVATE ${SDL2_DIR}/lib)
    target_link_libraries(snatcher PRIVATE SDL2 -mwindows -static-libgcc -static-libstdc++
                          -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive,-Bdynamic)
  else()
    # Linux / SteamOS: SDL2 from the system (it is on SteamOS)
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(SDL2 REQUIRED sdl2)
    target_include_directories(snatcher PRIVATE ${SDL2_INCLUDE_DIRS})
    target_link_libraries(snatcher PRIVATE ${SDL2_LIBRARIES})
  endif()
endif()
