Files
2026-07-19 18:05:04 +02:00

60 lines
2.0 KiB
CMake

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()