cmake_minimum_required(VERSION 3.16)
project(module)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(NOT DEFINED MODULE_SOURCE)
    message(FATAL_ERROR "MODULE_SOURCE must be defined")
endif()

if(NOT DEFINED OUTPUT_NAME)
    set(OUTPUT_NAME "module")
endif()

if(NOT DEFINED SPACETIMEDB_LIBRARY_DIR)
    message(FATAL_ERROR "SPACETIMEDB_LIBRARY_DIR must be defined")
endif()

if(NOT DEFINED SPACETIMEDB_INCLUDE_DIR)
    message(FATAL_ERROR "SPACETIMEDB_INCLUDE_DIR must be defined")
endif()

add_executable(${OUTPUT_NAME} ${MODULE_SOURCE})
target_include_directories(${OUTPUT_NAME} PRIVATE ${SPACETIMEDB_INCLUDE_DIR})
target_link_directories(${OUTPUT_NAME} PRIVATE ${SPACETIMEDB_LIBRARY_DIR})
target_link_libraries(${OUTPUT_NAME} PRIVATE spacetimedb_cpp_library)
target_compile_definitions(${OUTPUT_NAME} PRIVATE SPACETIMEDB_UNSTABLE_FEATURES)

if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
  set(EXPORTED_FUNCS "['_malloc','_free','___describe_module__','___call_reducer__','___call_http_handler__']")

  target_link_options(${OUTPUT_NAME} PRIVATE
    "SHELL:-sSTANDALONE_WASM=1"
    "SHELL:-sWASM=1"
    "SHELL:--no-entry"
    "SHELL:-sEXPORTED_FUNCTIONS=${EXPORTED_FUNCS}"
    "SHELL:-sERROR_ON_UNDEFINED_SYMBOLS=1"
    "SHELL:-sFILESYSTEM=0"
    "SHELL:-sDISABLE_EXCEPTION_CATCHING=1"
    "SHELL:-sALLOW_MEMORY_GROWTH=0"
    "SHELL:-sINITIAL_MEMORY=16MB"
    "SHELL:-sSUPPORT_LONGJMP=0"
    "SHELL:-sSUPPORT_ERRNO=0"
    "SHELL:-std=c++20"
    "SHELL:-O2"
  )

  set_target_properties(${OUTPUT_NAME} PROPERTIES OUTPUT_NAME "lib" SUFFIX ".wasm")
endif()
