cmake_minimum_required(VERSION 3.15)
project(ecos_wasm_adapter VERSION 2.0.8 LANGUAGES C)

set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)

set(ECOS_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/..")
set(ECOS_INCLUDE_DIRS
    "${ECOS_ROOT}/include"
    "${ECOS_ROOT}/external/amd/include"
    "${ECOS_ROOT}/external/ldl/include"
    "${ECOS_ROOT}/external/SuiteSparse_config"
    "${CMAKE_CURRENT_SOURCE_DIR}/wrapper")

set(ECOS_CONTINUOUS_SOURCES
    "${ECOS_ROOT}/external/amd/src/amd_1.c"
    "${ECOS_ROOT}/external/amd/src/amd_2.c"
    "${ECOS_ROOT}/external/amd/src/amd_aat.c"
    "${ECOS_ROOT}/external/amd/src/amd_control.c"
    "${ECOS_ROOT}/external/amd/src/amd_defaults.c"
    "${ECOS_ROOT}/external/amd/src/amd_dump.c"
    "${ECOS_ROOT}/external/amd/src/amd_global.c"
    "${ECOS_ROOT}/external/amd/src/amd_info.c"
    "${ECOS_ROOT}/external/amd/src/amd_order.c"
    "${ECOS_ROOT}/external/amd/src/amd_post_tree.c"
    "${ECOS_ROOT}/external/amd/src/amd_postorder.c"
    "${ECOS_ROOT}/external/amd/src/amd_preprocess.c"
    "${ECOS_ROOT}/external/amd/src/amd_valid.c"
    "${ECOS_ROOT}/external/ldl/src/ldl.c"
    "${ECOS_ROOT}/src/cone.c"
    "${ECOS_ROOT}/src/ecos.c"
    "${ECOS_ROOT}/src/equil.c"
    "${ECOS_ROOT}/src/expcone.c"
    "${ECOS_ROOT}/src/kkt.c"
    "${ECOS_ROOT}/src/preproc.c"
    "${ECOS_ROOT}/src/spla.c"
    "${ECOS_ROOT}/src/splamm.c"
    "${ECOS_ROOT}/src/timer.c"
    "${ECOS_ROOT}/src/wright_omega.c")

add_library(ecos_continuous STATIC ${ECOS_CONTINUOUS_SOURCES})
target_include_directories(ecos_continuous PUBLIC ${ECOS_INCLUDE_DIRS})
target_compile_definitions(ecos_continuous PUBLIC CTRLC=0)

add_library(ecos_wasm_wrapper STATIC wrapper/ecos_wasm.c)
target_include_directories(ecos_wasm_wrapper PUBLIC ${ECOS_INCLUDE_DIRS})
target_compile_definitions(ecos_wasm_wrapper PUBLIC CTRLC=0)
target_link_libraries(ecos_wasm_wrapper PUBLIC ecos_continuous)

if(EMSCRIPTEN)
    add_executable(ecos wrapper/ecos_wasm.c)
    target_include_directories(ecos PRIVATE ${ECOS_INCLUDE_DIRS})
    target_compile_definitions(ecos PRIVATE CTRLC=0)
    target_link_libraries(ecos PRIVATE ecos_continuous)
    target_link_options(ecos PRIVATE
        -O0
        "SHELL:-sMODULARIZE=1"
        "SHELL:-sEXPORT_ES6=1"
        "SHELL:-sEXPORT_NAME=createEcosModule"
        "SHELL:-sENVIRONMENT=web,node"
        "SHELL:-sALLOW_MEMORY_GROWTH=1"
        "SHELL:-sFILESYSTEM=0"
        "SHELL:-sEXPORTED_FUNCTIONS=['_ecos_wasm_solve_once','_malloc','_free']"
        "SHELL:-sEXPORTED_RUNTIME_METHODS=['HEAPF64','HEAP32','HEAPU8']")
    set_target_properties(ecos PROPERTIES OUTPUT_NAME "ecos" SUFFIX ".js")
else()
    add_executable(ecos_native_compare test/native_compare.c)
    target_include_directories(ecos_native_compare PRIVATE ${ECOS_INCLUDE_DIRS})
    target_compile_definitions(ecos_native_compare PRIVATE CTRLC=0)
    target_link_libraries(ecos_native_compare PRIVATE ecos_wasm_wrapper)
    if(NOT MSVC)
        target_link_libraries(ecos_native_compare PRIVATE m)
    endif()
endif()
