# SPDX-License-Identifier: LGPL-2.1-or-later

cmake_minimum_required(VERSION 3.22)
project(FreeCADWebKernel LANGUAGES CXX)

if(NOT EMSCRIPTEN)
    message(FATAL_ERROR "FreeCADWebKernel requires the Emscripten toolchain")
endif()

find_package(OpenCASCADE 7.6.3 CONFIG REQUIRED COMPONENTS
    FoundationClasses
    ModelingData
    ModelingAlgorithms
    DataExchange
)

add_executable(FreeCADWebKernel FreeCADWebBridge.cpp)
target_compile_features(FreeCADWebKernel PRIVATE cxx_std_11)
target_compile_definitions(FreeCADWebKernel PRIVATE OCC_CONVERT_SIGNALS)
target_include_directories(FreeCADWebKernel PRIVATE "${OpenCASCADE_INCLUDE_DIR}")

# OCCT toolkit exports in 7.6.3 do not carry transitive archive ordering.
# Group the static archives so cyclic algorithm dependencies resolve reliably.
target_link_libraries(FreeCADWebKernel PRIVATE
    "-Wl,--start-group"
    TKSTEP TKSTEP209 TKSTEPAttr TKSTEPBase TKXSBase
    TKFillet TKMesh TKFeat TKOffset TKHLR TKBool TKBO TKShHealing
    TKPrim TKTopAlgo TKGeomAlgo TKGeomBase TKBRep TKG3d TKG2d TKMath TKernel
    "-Wl,--end-group"
)

target_link_options(FreeCADWebKernel PRIVATE
    "--no-entry"
    "-sWASM=1"
    "-sMODULARIZE=1"
    "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebKernel"
    "-sALLOW_MEMORY_GROWTH=1"
    "-sENVIRONMENT=web,worker,node"
    "-sEXPORTED_RUNTIME_METHODS=['ccall','cwrap']"
)

set_target_properties(FreeCADWebKernel PROPERTIES
    SUFFIX ".js"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
)
