cmake_minimum_required(VERSION 3.24)
project(webmetal-engine LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()

option(WEBMETAL_BUILD_NODE_TEST
       "Also build a Node-targeted wasm module for the conformance runner"
       OFF)

add_library(engine_core STATIC src/engine.cpp src/ir.cpp)
target_include_directories(engine_core PUBLIC include third_party)
target_compile_options(engine_core PRIVATE -Wall -Wextra)

set(WEBMETAL_EMCC_OPTIONS
    -lembind
    -sMODULARIZE=1
    -sEXPORT_ES6=1
    -sEXPORT_NAME=createWebMetalModule
    -sALLOW_MEMORY_GROWTH=1
    -sEXPORTED_RUNTIME_METHODS=HEAPU8,HEAPU32)

if(EMSCRIPTEN)
  add_executable(webmetal-engine src/bindings.cpp)
  target_link_libraries(webmetal-engine PRIVATE engine_core)
  set_target_properties(webmetal-engine PROPERTIES SUFFIX ".mjs")
  target_link_options(webmetal-engine PRIVATE
    ${WEBMETAL_EMCC_OPTIONS}
    -sENVIRONMENT=web,worker)

  if(WEBMETAL_BUILD_NODE_TEST)
    add_executable(webmetal-engine-node src/bindings.cpp)
    target_link_libraries(webmetal-engine-node PRIVATE engine_core)
    set_target_properties(webmetal-engine-node PROPERTIES SUFFIX ".mjs")
    target_link_options(webmetal-engine-node PRIVATE
      ${WEBMETAL_EMCC_OPTIONS}
      -sENVIRONMENT=node)
  endif()
else()
  enable_testing()

  add_executable(engine_tests tests/engine_test.cpp)
  target_link_libraries(engine_tests PRIVATE engine_core)
  target_include_directories(engine_tests PRIVATE tests)
  target_compile_options(engine_tests PRIVATE -Wall -Wextra)
  add_test(NAME engine_tests COMMAND engine_tests)

  add_executable(conformance_tests tests/conformance_test.cpp)
  target_link_libraries(conformance_tests PRIVATE engine_core)
  target_include_directories(conformance_tests PRIVATE tests)
  target_compile_definitions(conformance_tests PRIVATE
    WEBMETAL_CONFORMANCE_PATH="${CMAKE_CURRENT_SOURCE_DIR}/../conformance/microop-vectors.json")
  add_test(NAME conformance_tests COMMAND conformance_tests)
endif()
