cmake_minimum_required(VERSION 3.16)
project(sc_native VERSION 0.1.0 LANGUAGES CXX)

# Developer tools (casc_tool, sim_test, viewer, ...). The installer turns them off and builds only the game
# and the self-check.
option(SC_BUILD_TOOLS "Build the developer tools" ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE RelWithDebInfo)
endif()
add_compile_options(-Wall -Wextra)
add_compile_definitions(SC_NATIVE_VERSION="${PROJECT_VERSION}")

find_package(ZLIB REQUIRED)

add_library(sccasc STATIC src/casc/casc.cpp)
target_include_directories(sccasc PUBLIC src)
target_link_libraries(sccasc PUBLIC ZLIB::ZLIB)

add_library(scformats STATIC src/formats/terrain.cpp src/formats/grp.cpp src/formats/dat.cpp src/render/scene.cpp src/render/font.cpp src/render/dds.cpp src/render/hd.cpp src/audio/sound.cpp src/audio/ogg.cpp src/media/webm.cpp src/media/codecs.cpp src/media/video.cpp src/formats/mpq.cpp src/formats/stormlib.cpp src/game/iscript.cpp src/game/sprites.cpp src/game/sim.cpp src/game/pathing.cpp src/game/economy.cpp src/game/techtree.cpp src/game/ai.cpp src/game/vision.cpp src/game/abilities.cpp src/game/specials.cpp src/game/scenario.cpp src/game/triggers.cpp src/game/aiscript.cpp src/game/aiplayer.cpp src/game/commands.cpp src/game/replay.cpp src/net/lockstep.cpp src/platform/platform.cpp)
target_link_libraries(scformats PUBLIC sccasc ${CMAKE_DL_LIBS})

add_executable(sc_selfcheck tools/selfcheck.cpp)
target_link_libraries(sc_selfcheck PRIVATE scformats)

if(SC_BUILD_TOOLS)
  add_executable(casc_tool tools/casc_tool.cpp)
  target_link_libraries(casc_tool PRIVATE sccasc)

  add_executable(map_render tools/map_render.cpp)
  target_link_libraries(map_render PRIVATE scformats)

  add_executable(map_check tools/map_check.cpp)
  target_link_libraries(map_check PRIVATE scformats)

  add_executable(iscript_tool tools/iscript_tool.cpp)
  target_link_libraries(iscript_tool PRIVATE scformats)

  add_executable(anim_render tools/anim_render.cpp)
  target_link_libraries(anim_render PRIVATE scformats)

  add_executable(sim_test tools/sim_test.cpp)
  target_link_libraries(sim_test PRIVATE scformats)

  add_executable(dat_tool tools/dat_tool.cpp)
  target_link_libraries(dat_tool PRIVATE scformats)

  add_executable(chk_tool tools/chk_tool.cpp)
  target_link_libraries(chk_tool PRIVATE scformats)

  add_executable(campaign_test tools/campaign_test.cpp)
  target_link_libraries(campaign_test PRIVATE scformats)

  add_executable(aiscript_tool tools/aiscript_tool.cpp)
  target_link_libraries(aiscript_tool PRIVATE scformats)

  add_executable(hd_tool tools/hd_tool.cpp)
  target_link_libraries(hd_tool PRIVATE scformats)

  add_executable(video_tool tools/video_tool.cpp)
  target_link_libraries(video_tool PRIVATE scformats)

  add_executable(sound_tool tools/sound_tool.cpp)
  target_link_libraries(sound_tool PRIVATE scformats)
endif()

find_package(SDL2 QUIET)
if(SDL2_FOUND)
  if(SC_BUILD_TOOLS)
    add_executable(viewer tools/viewer.cpp src/audio/mixer.cpp)
    target_include_directories(viewer PRIVATE src)
    target_include_directories(viewer PRIVATE ${SDL2_INCLUDE_DIRS})
    target_link_libraries(viewer PRIVATE scformats ${SDL2_LIBRARIES})
  endif()
  add_executable(starcraft tools/starcraft.cpp src/audio/mixer.cpp)
  target_include_directories(starcraft PRIVATE src ${SDL2_INCLUDE_DIRS})
  target_link_libraries(starcraft PRIVATE scformats ${SDL2_LIBRARIES})
else()
  message(STATUS "SDL2 not found: the game (starcraft) and viewer are not built")
endif()

# Installed layout: <prefix>/lib/sc-native/{starcraft,sc_selfcheck}; launchers are added by the installers.
install(TARGETS sc_selfcheck DESTINATION lib/sc-native)
if(TARGET starcraft)
  install(TARGETS starcraft DESTINATION lib/sc-native)
endif()
