cmake_minimum_required(VERSION 3.16)
project(ASCWeb LANGUAGES C CXX)
if(NOT EMSCRIPTEN)
  message(FATAL_ERROR "Configure with the Emscripten toolchain")
endif()
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_OBJECT_PATH_MAX 220)
get_filename_component(WORK "${CMAKE_CURRENT_LIST_DIR}/../../native-build" ABSOLUTE)
set(DEPS "${WORK}/deps")
set(ASC_SRC_DIR "${WORK}/src/source")
set(ASC_PARAGUI_INCLUDE "${ASC_SRC_DIR}/libs/paragui/include")
set(ASC_LOKI_INCLUDE "${ASC_SRC_DIR}/libs/loki-0.1.6/include")

add_compile_options(-O2 -fexceptions -Wno-deprecated-declarations
  -Wno-register -Wno-inconsistent-missing-override -Wno-switch
  "-sUSE_SDL=2" "-sUSE_SDL_IMAGE=2" "-sUSE_SDL_MIXER=2"
  "-sUSE_FREETYPE=1" "-sUSE_LIBPNG=1" "-sUSE_BZIP2=1" "-sUSE_BOOST_HEADERS=1")
add_compile_definitions(_UNIX_ _SDL_ sgmain SIZE_T_not_identical_to_INT
  BOOST_FILESYSTEM_SINGLE_THREADED BOOST_FILESYSTEM_DISABLE_STATX
  BOOST_FILESYSTEM_NO_CXX20_ATOMIC_REF BOOST_ALL_NO_LIB)
include_directories("${CMAKE_CURRENT_LIST_DIR}" "${WORK}" "${ASC_SRC_DIR}" "${ASC_PARAGUI_INCLUDE}"
  "${ASC_LOKI_INCLUDE}" "${ASC_SRC_DIR}/libs/getopt"
  "${ASC_SRC_DIR}/libs/SDL_sound-2.0.4/src"
  "${DEPS}/libsigc++-2.10.8" "${DEPS}/lua-5.1.5/src"
  "${DEPS}/physfs-release-3.2.0/src"
  "${DEPS}/filesystem-boost-1.83.0/include")

file(GLOB_RECURSE SIGC_SOURCES "${DEPS}/libsigc++-2.10.8/sigc++/*.cc")
add_library(sigc STATIC ${SIGC_SOURCES})
file(GLOB LUA_SOURCES "${DEPS}/lua-5.1.5/src/*.c")
list(FILTER LUA_SOURCES EXCLUDE REGEX "/(lua|luac|print)\\.c$")
add_library(lua STATIC ${LUA_SOURCES})
file(GLOB BOOST_FS_SOURCES "${DEPS}/filesystem-boost-1.83.0/src/*.cpp")
list(FILTER BOOST_FS_SOURCES EXCLUDE REGEX "/(windows_tools|error_handling)\\.cpp$")
add_library(boost_filesystem STATIC ${BOOST_FS_SOURCES})

set(CMAKE_POLICY_VERSION_MINIMUM 3.5)
set(PHYSFS_BUILD_SHARED OFF CACHE BOOL "" FORCE)
set(PHYSFS_BUILD_TEST OFF CACHE BOOL "" FORCE)
set(PHYSFS_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(EXPAT_BUILD_TOOLS OFF CACHE BOOL "" FORCE)
set(EXPAT_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(EXPAT_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(EXPAT_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(EXPAT_SHARED_LIBS OFF CACHE BOOL "" FORCE)
add_subdirectory("${DEPS}/physfs-release-3.2.0" physfs)
add_subdirectory("${DEPS}/libexpat-R_2_6_4/expat" expat)
include_directories("${DEPS}/libexpat-R_2_6_4/expat/lib" "${CMAKE_CURRENT_BINARY_DIR}/expat")

file(GLOB SDL_SOUND_INT_SRCS "${ASC_SRC_DIR}/libs/SDL_sound-2.0.4/src/*.c")
list(FILTER SDL_SOUND_INT_SRCS EXCLUDE REGEX "/SDL_sound_skeleton\\.c$")
add_compile_definitions(SOUND_SUPPORTS_MIDI=0 SOUND_SUPPORTS_MODPLUG=0)
include("${WORK}/sources.cmake")
target_sources(asc PRIVATE "${CMAKE_CURRENT_LIST_DIR}/webbridge.cpp")
file(GLOB SELFTEST_SOURCES "${ASC_SRC_DIR}/unittests/*.cpp")
list(FILTER SELFTEST_SOURCES EXCLUDE REGEX "/main\\.cpp$")
target_sources(asc PRIVATE ${SELFTEST_SOURCES} "${WORK}/selftests.cpp")
target_include_directories(asc PRIVATE "${ASC_SRC_DIR}/unittests")
target_link_libraries(asc PRIVATE sigc lua boost_filesystem physfs-static expat)
set_target_properties(asc PROPERTIES SUFFIX ".js")
target_link_options(asc PRIVATE -O2 -fexceptions --profiling-funcs
  "-sUSE_SDL=2" "-sUSE_SDL_IMAGE=2" "-sSDL2_IMAGE_FORMATS=['png','jpg','pcx','bmp','gif','tga']"
  "-sUSE_SDL_MIXER=2" "-sSDL2_MIXER_FORMATS=['ogg','mp3']"
  "-sUSE_FREETYPE=1" "-sUSE_LIBPNG=1" "-sUSE_BZIP2=1"
  "-sUSE_BOOST_HEADERS=1" "-sALLOW_MEMORY_GROWTH=1"
  "-sINITIAL_MEMORY=134217728" "-sMAXIMUM_MEMORY=1073741824"
  "-sSTACK_SIZE=4194304" "-sASYNCIFY=1" "-sASYNCIFY_STACK_SIZE=65536"
  "-sFORCE_FILESYSTEM=1" "-sMODULARIZE=1" "-sEXPORT_NAME=createASC"
  "-sENVIRONMENT=web,worker,node" "-sEXIT_RUNTIME=1"
  "-sEXPORTED_RUNTIME_METHODS=['FS','IDBFS','ENV','callMain']"
  "-sINVOKE_RUN=0" "-lidbfs.js")
