diff --git a/.gitignore b/.gitignore index c09716e..b9a5f09 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .cache/ build/ +/cmake-*/ compile_commands.json /dist/ node_modules/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 6047ff0..992a2b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,23 +1,30 @@ cmake_minimum_required(VERSION 3.20) set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) - -set(EMSCRIPTEN_ROOT $ENV{EMSDK}) -if(NOT EMSCRIPTEN_ROOT) - set(EMSCRIPTEN_ROOT /usr/lib/emscripten) -endif() - -set(EMSCRIPTEN_ROOT - "${EMSCRIPTEN_ROOT}" - CACHE PATH "Emscripten SDK path") - -set(CMAKE_TOOLCHAIN_FILE - "${EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake" - CACHE FILEPATH "Emscripten toolchain file") +set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) project(ecgsyn.js) +option(BUILD_WITH_EMSCRIPTEN "Build with Emscripten" ON) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) +if(BUILD_WITH_EMSCRIPTEN) + + set(EMSCRIPTEN_ROOT $ENV{EMSDK}) + if(NOT EMSCRIPTEN_ROOT) + set(EMSCRIPTEN_ROOT /usr/lib/emscripten) + endif() + + set(EMSCRIPTEN_ROOT + "${EMSCRIPTEN_ROOT}" + CACHE PATH "Emscripten SDK path") + + set(CMAKE_TOOLCHAIN_FILE + "${EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake" + CACHE FILEPATH "Emscripten toolchain file") + + set(BUILD_SHARED_LIBS OFF FORCE) +endif(BUILD_WITH_EMSCRIPTEN) + set(CMAKE_C_STANDARD 99) set(CMAKE_CXX_STANDARD 20) @@ -25,24 +32,40 @@ set(PFFFT_USE_TYPE_FLOAT OFF CACHE BOOL "activate pffft float" FORCE) -include_directories(BEFORE SYSTEM compat) -add_compile_options(-flto -msimd128 -mavx) -add_link_options(-flto) +include(CheckIPOSupported) +check_ipo_supported(RESULT ipo_supported) +if(ipo_supported) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE ON) +endif() + +if(BUILD_WITH_EMSCRIPTEN) + include_directories(BEFORE SYSTEM compat) + + add_compile_options(-msimd128 -msse -mavx -fwasm-exceptions) + set(ecgsyn_link_options # -flto + -fwasm-exceptions + -sEXPORTED_FUNCTIONS=_rr_gen_new,_rr_gen_new_series,_destroy_obj,_ecgsyn,_realloc,_free + --no-entry + -sSTRICT + -sNO_ASSERTIONS + -sNO_FILESYSTEM + -sMALLOC=emmalloc) + +else() + set(TARGET_C_ARCH haswell) + set(TARGET_CXX_ARCH haswell) + + set(ecgsyn_defs ECGSYN_HOST_BUILD) +endif() add_subdirectory(mini-odeint EXCLUDE_FROM_ALL) add_subdirectory(pffft EXCLUDE_FROM_ALL) add_executable(ecgsyn ecgsyn.cpp) -target_compile_options(ecgsyn PRIVATE) -target_link_options( - ecgsyn - PRIVATE - -flto - -sEXPORTED_FUNCTIONS=_ecgsyn - --no-entry - -sSTRICT - -sNO_ASSERTIONS - -sNO_FILESYSTEM - -sMALLOC=emmalloc) -target_link_libraries(ecgsyn PRIVATE PFFFT) -set_target_properties(ecgsyn PROPERTIES SUFFIX ".wasm") +target_compile_definitions(ecgsyn PRIVATE PFFFT_ENABLE_DOUBLE ${ecgsyn_defs}) +target_link_options(ecgsyn PRIVATE ${ecgsyn_link_options}) +target_link_libraries(ecgsyn PRIVATE PFFFT mini-odeint) + +if(BUILD_WITH_EMSCRIPTEN) + set_target_properties(ecgsyn PROPERTIES SUFFIX ".wasm") +endif(BUILD_WITH_EMSCRIPTEN) diff --git a/demo/index.html b/demo/index.html index b65beaf..c6b3510 100644 --- a/demo/index.html +++ b/demo/index.html @@ -8,15 +8,36 @@ +
+ +