cmake_minimum_required(VERSION 3.16)
project(occt_spike CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(occt_spike box_spike.cpp)

if(EMSCRIPTEN)
    function(configure_occt_wasm_target target_name export_es6 environment)
        target_include_directories(${target_name} PRIVATE ${OCCT_INC})
        target_link_directories(${target_name} PRIVATE ${OCCT_LIB})
        # Перехват C++ исключений: без него try/catch — no-op, а throw из OCCT
        # (BRepOffset_MakeOffset и др.) = abort всего модуля. Включаем, чтобы
        # операции честно возвращали 0/ошибку, а битый STEP/капризный offset не
        # ронял сессию (харденинг геом-движка).
        target_compile_options(${target_name} PRIVATE -fexceptions)
        # TKBO/TKBool — булевы операции (BRepAlgoAPI_Cut) для полой полусферы
        # (exportHollowHemisphereBoundaryMesh); порядок как в build-wasm-gmsh.sh.
        # TKDESTEP/TKDEIGES + TKXSBase/TKXCAF/TKDE-стек — импорт STEP/IGES
        # (STEPControl_Reader/IGESControl_Reader); высокоуровневые либы перед
        # низкоуровневыми (порядок для статической линковки wasm-ld).
        target_link_libraries(${target_name}
            TKDESTEP TKDEIGES TKXCAF TKVCAF TKV3d TKCAF TKLCAF TKCDF TKDE TKXSBase TKService
            TKBO TKBool TKPrim TKTopAlgo TKGeomAlgo TKFillet TKOffset TKFeat TKHLR
            TKBRep TKGeomBase TKG3d TKG2d TKMath TKernel TKMesh TKXMesh TKShHealing
        )
        target_link_options(${target_name} PRIVATE
            "-fexceptions"
            "-lembind"
            "-sMODULARIZE=1"
            "-sEXPORT_ES6=${export_es6}"
            "-sENVIRONMENT=${environment}"
            "-sALLOW_MEMORY_GROWTH=1"
            "-sEXPORT_NAME=createOcctSpikeModule"
        )
    endfunction()

    configure_occt_wasm_target(occt_spike 0 node)

    add_executable(occt_spike_web box_spike.cpp)
    configure_occt_wasm_target(occt_spike_web 1 "web,worker")
else()
    find_package(OpenCASCADE REQUIRED)
    target_include_directories(occt_spike PRIVATE ${OpenCASCADE_INCLUDE_DIR})
    target_link_directories(occt_spike PRIVATE ${OpenCASCADE_LIBRARY_DIR})
    target_link_libraries(occt_spike
        # Native smoke запускает тот же kernel-path, что и WASM: без TKBO
        # линкер маскировал regressions в Boolean/Split/Imprint как "build OK".
        # TKDESTEP/TKDEIGES + TKXSBase — STEP/IGES импорт/экспорт (import*Shape,
        # exportShapesToStep, exportShapeToIges) теперь тоже в native, чтобы
        # K1-тесты fillet/chamfer/hollow могли использовать общий shape-handle API.
        TKDESTEP TKDEIGES TKXCAF TKVCAF TKV3d TKCAF TKLCAF TKCDF TKDE TKXSBase TKService
        TKBO TKBool TKPrim TKTopAlgo TKGeomAlgo TKFillet TKOffset TKFeat TKHLR
        TKBRep TKGeomBase TKG3d TKG2d TKMath TKernel TKMesh TKXMesh TKShHealing
    )
endif()
