cmake_minimum_required(VERSION 3.20)
project(CoreS3Web LANGUAGES C CXX)
if(NOT EMSCRIPTEN)
    message(FATAL_ERROR "Use bash web/build.sh (Emscripten is required)")
endif()
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
if(NOT EXISTS "${WEB_ROM}")
    message(FATAL_ERROR "WEB_ROM must name the fixed ROM")
endif()

# Use exactly the firmware's source list and the macOS host adaptation.
set(CORE "${CMAKE_CURRENT_SOURCE_DIR}/../src/components/snes9x")
file(READ "${CORE}/CMakeLists.txt" IDF_CORE_CMAKE)
string(REGEX MATCH "SRCS([^)]*)INCLUDE_DIRS" CORE_SOURCES "${IDF_CORE_CMAKE}")
string(REGEX REPLACE "^SRCS|INCLUDE_DIRS$" "" CORE_SOURCES "${CORE_SOURCES}")
separate_arguments(CORE_SOURCES UNIX_COMMAND "${CORE_SOURCES}")
list(TRANSFORM CORE_SOURCES PREPEND "${CORE}/")
add_library(snes9x STATIC ${CORE_SOURCES})
target_include_directories(snes9x PRIVATE ../macos/compat)
target_include_directories(snes9x PUBLIC "${CORE}/..")
target_compile_options(snes9x PRIVATE -O3 -Wno-format -Wno-unused-const-variable
    -include "${CMAKE_CURRENT_SOURCE_DIR}/compat/host.h")

add_executable(core bridge.cpp ../macos/Emulator.cpp)
target_include_directories(core PRIVATE ../macos ../src/main)
target_link_libraries(core PRIVATE snes9x)
target_compile_options(core PRIVATE -O3 -Wall -Wextra -Werror -fexceptions)
set_target_properties(core PROPERTIES SUFFIX ".mjs" LINK_DEPENDS "${WEB_ROM}")
target_link_options(core PRIVATE -O3 --no-entry -fexceptions
    -sMODULARIZE=1 -sEXPORT_ES6=1 -sENVIRONMENT=web,node
    -sALLOW_MEMORY_GROWTH=1 -sINITIAL_MEMORY=33554432 -sSTACK_SIZE=1048576
    -sFORCE_FILESYSTEM=1 -lidbfs.js
    "-sEXPORTED_RUNTIME_METHODS=['FS','IDBFS','UTF8ToString','HEAPU8','HEAP16']"
    --embed-file "${WEB_ROM}@/game.sfc")

# Run the existing diagnostic-ROM suite against actual WebAssembly under Node.
option(WEB_BUILD_TESTS "Build existing core tests for WebAssembly" ON)
if(WEB_BUILD_TESTS)
    add_executable(core_tests ../macos/tests/EmulatorTests.cpp ../macos/Emulator.cpp)
    target_include_directories(core_tests PRIVATE ../macos ../src/main)
    target_link_libraries(core_tests PRIVATE snes9x)
    target_compile_options(core_tests PRIVATE -O2 -Wall -Wextra -Werror -fexceptions)
    target_link_options(core_tests PRIVATE -O2 -fexceptions -sENVIRONMENT=node -sALLOW_MEMORY_GROWTH=1
        -sSTACK_SIZE=1048576 -sEXIT_RUNTIME=1 -sASSERTIONS=1)
    set_target_properties(core_tests PROPERTIES SUFFIX ".cjs")
    add_executable(frame_pacer_tests ../macos/tests/FramePacerTests.cpp)
    target_include_directories(frame_pacer_tests PRIVATE ../macos ../src/main)
    target_compile_options(frame_pacer_tests PRIVATE -O2 -Wall -Wextra -Werror)
    target_link_options(frame_pacer_tests PRIVATE -O2 -sENVIRONMENT=node -sEXIT_RUNTIME=1 -sASSERTIONS=1)
    set_target_properties(frame_pacer_tests PROPERTIES SUFFIX ".cjs")
endif()
