cmake_minimum_required(VERSION 3.20) project(linuxcnc_web_wasm_core LANGUAGES C CXX) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_library(sim_core STATIC src/sim_api.c src/sim_protocol.c src/sim_event.c src/sim_task.c src/sim_scheduler.c src/sim_hal.c src/sim_device_io.c src/sim_posemath.c src/sim_interpreter.c src/sim_program.c src/sim_motion_queue.c src/sim_kinematics.c src/sim_switchkins.c src/sim_userkins.c src/sim_kinematics_registry.c src/sim_kinematics_motion.c src/sim_kinematics_feedback.c src/sim_kinematics_home_limit.c src/sim_io.c) target_include_directories(sim_core PUBLIC include) target_compile_definitions(sim_core PRIVATE SIM_API_BUILD=1) add_library(sim_posemath STATIC ${CMAKE_CURRENT_SOURCE_DIR}/../linuxcnc/src/libnml/posemath/_posemath.c ${CMAKE_CURRENT_SOURCE_DIR}/../linuxcnc/src/libnml/posemath/gomath.c ${CMAKE_CURRENT_SOURCE_DIR}/../linuxcnc/src/libnml/posemath/sincos.c ${CMAKE_CURRENT_SOURCE_DIR}/../linuxcnc/src/libnml/posemath/posemath.cc ) target_include_directories(sim_posemath PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../linuxcnc/src ${CMAKE_CURRENT_SOURCE_DIR}/../linuxcnc/src/rtapi ${CMAKE_CURRENT_SOURCE_DIR}/../linuxcnc/src/libnml/posemath ) target_compile_definitions(sim_posemath PRIVATE ULAPI) target_compile_options(sim_posemath PRIVATE -ffp-contract=off -fno-fast-math) target_link_libraries(sim_core PUBLIC sim_posemath) target_compile_options(sim_core PRIVATE -ffp-contract=off -fno-fast-math) if(NOT EMSCRIPTEN) add_executable(sim_api_test tests/sim_api_test.c) target_link_libraries(sim_api_test PRIVATE sim_core) target_include_directories(sim_api_test PRIVATE include) enable_testing() add_test(NAME sim_api_test COMMAND sim_api_test) add_executable(sim_protocol_test tests/sim_protocol_test.c) target_link_libraries(sim_protocol_test PRIVATE sim_core) target_include_directories(sim_protocol_test PRIVATE include) add_test(NAME sim_protocol_test COMMAND sim_protocol_test) add_executable(sim_event_test tests/sim_event_test.c) target_link_libraries(sim_event_test PRIVATE sim_core) target_include_directories(sim_event_test PRIVATE include) add_test(NAME sim_event_test COMMAND sim_event_test) add_executable(sim_contract_test tests/sim_contract_test.c) target_link_libraries(sim_contract_test PRIVATE sim_core) target_include_directories(sim_contract_test PRIVATE include) target_compile_options(sim_contract_test PRIVATE -UNDEBUG) add_test(NAME sim_contract_test COMMAND sim_contract_test) add_executable(sim_task_test tests/sim_task_test.c) target_link_libraries(sim_task_test PRIVATE sim_core) target_include_directories(sim_task_test PRIVATE include) target_compile_options(sim_task_test PRIVATE -UNDEBUG) add_test(NAME sim_task_test COMMAND sim_task_test) add_executable(sim_scheduler_test tests/sim_scheduler_test.c) target_link_libraries(sim_scheduler_test PRIVATE sim_core) target_include_directories(sim_scheduler_test PRIVATE include) target_compile_options(sim_scheduler_test PRIVATE -UNDEBUG) add_test(NAME sim_scheduler_test COMMAND sim_scheduler_test) add_executable(sim_hal_test tests/sim_hal_test.c tests/sim_hal_test_main.c) target_link_libraries(sim_hal_test PRIVATE sim_core) target_include_directories(sim_hal_test PRIVATE include) target_compile_options(sim_hal_test PRIVATE -UNDEBUG) add_test(NAME sim_hal_test COMMAND sim_hal_test) add_executable(sim_posemath_test tests/sim_posemath_test.c) target_link_libraries(sim_posemath_test PRIVATE sim_core) target_include_directories(sim_posemath_test PRIVATE include) add_test(NAME sim_posemath_test COMMAND sim_posemath_test) add_executable(sim_interpreter_test tests/sim_interpreter_test.c) target_link_libraries(sim_interpreter_test PRIVATE sim_core) target_include_directories(sim_interpreter_test PRIVATE include) target_compile_options(sim_interpreter_test PRIVATE -UNDEBUG) add_test(NAME sim_interpreter_test COMMAND sim_interpreter_test) add_executable(sim_source_unit_adapter_test tests/source_unit_adapter_test.c) target_link_libraries(sim_source_unit_adapter_test PRIVATE sim_core) target_include_directories(sim_source_unit_adapter_test PRIVATE include) target_compile_options(sim_source_unit_adapter_test PRIVATE -UNDEBUG) add_test(NAME sim_source_unit_adapter_test COMMAND sim_source_unit_adapter_test) add_executable(sim_motion_queue_test tests/sim_motion_queue_test.c) target_link_libraries(sim_motion_queue_test PRIVATE sim_core) target_include_directories(sim_motion_queue_test PRIVATE include) target_compile_options(sim_motion_queue_test PRIVATE -UNDEBUG) add_test(NAME sim_motion_queue_test COMMAND sim_motion_queue_test) add_executable(sim_kinematics_test tests/sim_kinematics_test.c tests/sim_kinematics_test_main.c) target_link_libraries(sim_kinematics_test PRIVATE sim_core) target_include_directories(sim_kinematics_test PRIVATE include) target_compile_options(sim_kinematics_test PRIVATE -UNDEBUG) add_test(NAME sim_kinematics_test COMMAND sim_kinematics_test) add_executable(sim_switchkins_test tests/sim_switchkins_test.c) target_link_libraries(sim_switchkins_test PRIVATE sim_core) target_include_directories(sim_switchkins_test PRIVATE include) target_compile_options(sim_switchkins_test PRIVATE -UNDEBUG) add_test(NAME sim_switchkins_test COMMAND sim_switchkins_test) add_executable(sim_userkins_test tests/sim_userkins_test.c) target_link_libraries(sim_userkins_test PRIVATE sim_core) target_include_directories(sim_userkins_test PRIVATE include) target_compile_options(sim_userkins_test PRIVATE -UNDEBUG) add_test(NAME sim_userkins_test COMMAND sim_userkins_test) add_executable(sim_kinematics_registry_test tests/sim_kinematics_registry_test.c) target_link_libraries(sim_kinematics_registry_test PRIVATE sim_core) target_include_directories(sim_kinematics_registry_test PRIVATE include) target_compile_options(sim_kinematics_registry_test PRIVATE -UNDEBUG) add_test(NAME sim_kinematics_registry_test COMMAND sim_kinematics_registry_test) add_executable(sim_kinematics_motion_test tests/sim_kinematics_motion_test.c) target_link_libraries(sim_kinematics_motion_test PRIVATE sim_core) target_include_directories(sim_kinematics_motion_test PRIVATE include) target_compile_options(sim_kinematics_motion_test PRIVATE -UNDEBUG) add_test(NAME sim_kinematics_motion_test COMMAND sim_kinematics_motion_test) add_executable(sim_kinematics_feedback_test tests/sim_kinematics_feedback_test.c) target_link_libraries(sim_kinematics_feedback_test PRIVATE sim_core) target_include_directories(sim_kinematics_feedback_test PRIVATE include) target_compile_options(sim_kinematics_feedback_test PRIVATE -UNDEBUG) add_test(NAME sim_kinematics_feedback_test COMMAND sim_kinematics_feedback_test) add_executable(sim_kinematics_home_limit_test tests/sim_kinematics_home_limit_test.c) target_link_libraries(sim_kinematics_home_limit_test PRIVATE sim_core) target_include_directories(sim_kinematics_home_limit_test PRIVATE include) target_compile_options(sim_kinematics_home_limit_test PRIVATE -UNDEBUG) add_test(NAME sim_kinematics_home_limit_test COMMAND sim_kinematics_home_limit_test) add_executable(sim_io_test tests/sim_io_test.c) target_link_libraries(sim_io_test PRIVATE sim_core) target_include_directories(sim_io_test PRIVATE include) target_compile_options(sim_io_test PRIVATE -UNDEBUG) add_test(NAME sim_io_test COMMAND sim_io_test) add_executable(sim_device_io_test tests/sim_device_io_test.c) target_link_libraries(sim_device_io_test PRIVATE sim_core) target_include_directories(sim_device_io_test PRIVATE include) target_compile_options(sim_device_io_test PRIVATE -UNDEBUG) add_test(NAME sim_device_io_test COMMAND sim_device_io_test) add_executable(sim_xyzac_trace_test tests/sim_xyzac_trace_test.c) target_link_libraries(sim_xyzac_trace_test PRIVATE sim_core) target_include_directories(sim_xyzac_trace_test PRIVATE include) target_compile_options(sim_xyzac_trace_test PRIVATE -UNDEBUG) add_test(NAME sim_xyzac_trace_test COMMAND sim_xyzac_trace_test) endif() if(EMSCRIPTEN) add_executable(sim_hal_wasm_test tests/sim_hal_test.c tests/sim_hal_test_main.c) target_link_libraries(sim_hal_wasm_test PRIVATE sim_core) target_include_directories(sim_hal_wasm_test PRIVATE include) target_compile_options(sim_hal_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_hal_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_kinematics_wasm_test tests/sim_kinematics_test.c tests/sim_kinematics_test_main.c) target_link_libraries(sim_kinematics_wasm_test PRIVATE sim_core) target_include_directories(sim_kinematics_wasm_test PRIVATE include) target_compile_options(sim_kinematics_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_kinematics_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_switchkins_wasm_test tests/sim_switchkins_test.c) target_link_libraries(sim_switchkins_wasm_test PRIVATE sim_core) target_include_directories(sim_switchkins_wasm_test PRIVATE include) target_compile_options(sim_switchkins_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_switchkins_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_userkins_wasm_test tests/sim_userkins_test.c) target_link_libraries(sim_userkins_wasm_test PRIVATE sim_core) target_include_directories(sim_userkins_wasm_test PRIVATE include) target_compile_options(sim_userkins_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_userkins_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_kinematics_registry_wasm_test tests/sim_kinematics_registry_test.c) target_link_libraries(sim_kinematics_registry_wasm_test PRIVATE sim_core) target_include_directories(sim_kinematics_registry_wasm_test PRIVATE include) target_compile_options(sim_kinematics_registry_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_kinematics_registry_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_kinematics_motion_wasm_test tests/sim_kinematics_motion_test.c) target_link_libraries(sim_kinematics_motion_wasm_test PRIVATE sim_core) target_include_directories(sim_kinematics_motion_wasm_test PRIVATE include) target_compile_options(sim_kinematics_motion_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_kinematics_motion_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_kinematics_feedback_wasm_test tests/sim_kinematics_feedback_test.c) target_link_libraries(sim_kinematics_feedback_wasm_test PRIVATE sim_core) target_include_directories(sim_kinematics_feedback_wasm_test PRIVATE include) target_compile_options(sim_kinematics_feedback_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_kinematics_feedback_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_kinematics_home_limit_wasm_test tests/sim_kinematics_home_limit_test.c) target_link_libraries(sim_kinematics_home_limit_wasm_test PRIVATE sim_core) target_include_directories(sim_kinematics_home_limit_wasm_test PRIVATE include) target_compile_options(sim_kinematics_home_limit_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_kinematics_home_limit_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_io_wasm_test tests/sim_io_test.c) target_link_libraries(sim_io_wasm_test PRIVATE sim_core) target_include_directories(sim_io_wasm_test PRIVATE include) target_compile_options(sim_io_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_io_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_device_io_wasm_test tests/sim_device_io_test.c) target_link_libraries(sim_device_io_wasm_test PRIVATE sim_core) target_include_directories(sim_device_io_wasm_test PRIVATE include) target_compile_options(sim_device_io_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_device_io_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_motion_queue_wasm_test tests/sim_motion_queue_test.c) target_link_libraries(sim_motion_queue_wasm_test PRIVATE sim_core) target_include_directories(sim_motion_queue_wasm_test PRIVATE include) target_compile_options(sim_motion_queue_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_motion_queue_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_source_unit_adapter_wasm_test tests/source_unit_adapter_test.c) target_link_libraries(sim_source_unit_adapter_wasm_test PRIVATE sim_core) target_include_directories(sim_source_unit_adapter_wasm_test PRIVATE include) target_compile_options(sim_source_unit_adapter_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_source_unit_adapter_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_xyzac_trace_wasm_test tests/sim_xyzac_trace_test.c) target_link_libraries(sim_xyzac_trace_wasm_test PRIVATE sim_core) target_include_directories(sim_xyzac_trace_wasm_test PRIVATE include) target_compile_options(sim_xyzac_trace_wasm_test PRIVATE -UNDEBUG) target_link_options(sim_xyzac_trace_wasm_test PRIVATE -sSINGLE_FILE=1) add_executable(sim_core_module src/sim_api.c src/sim_protocol.c src/sim_event.c src/sim_task.c src/sim_scheduler.c src/sim_hal.c src/sim_device_io.c src/sim_posemath.c src/sim_interpreter.c src/sim_program.c src/sim_motion_queue.c src/sim_kinematics.c src/sim_switchkins.c src/sim_userkins.c src/sim_kinematics_registry.c src/sim_kinematics_motion.c src/sim_kinematics_feedback.c src/sim_kinematics_home_limit.c src/sim_io.c) target_include_directories(sim_core_module PRIVATE include ${CMAKE_CURRENT_SOURCE_DIR}/../linuxcnc/src ${CMAKE_CURRENT_SOURCE_DIR}/../linuxcnc/src/rtapi ${CMAKE_CURRENT_SOURCE_DIR}/../linuxcnc/src/libnml/posemath ) target_compile_options(sim_core_module PRIVATE -ffp-contract=off -fno-fast-math) target_link_libraries(sim_core_module PRIVATE sim_posemath) set_target_properties(sim_core_module PROPERTIES OUTPUT_NAME "linuxcnc-sim-core" SUFFIX ".js" LINK_FLAGS "-sMODULARIZE=1 -sEXPORT_ES6=1 -sENVIRONMENT=web,worker -sEXPORTED_FUNCTIONS=['_malloc','_free','_sim_create','_sim_load_workspace','_sim_command','_sim_step','_sim_read_snapshot','_sim_read_event','_sim_export_state','_sim_import_state','_sim_destroy','_sim_protocol_reset','_sim_protocol_accept','_sim_protocol_pause','_sim_protocol_resume','_sim_protocol_state_value','_sim_protocol_last_seq','_sim_protocol_tick','_sim_protocol_set_tick','_sim_event_reset','_sim_event_append','_sim_event_count','_sim_event_cursor','_sim_event_read','_sim_event_export','_sim_event_import','_sim_task_size','_sim_task_init','_sim_task_reset','_sim_task_attach','_sim_task_set_command','_sim_task_set_tick','_sim_task_set_mode','_sim_task_set_program','_sim_task_transition','_sim_task_fault','_sim_task_estop','_sim_task_recover','_sim_task_restore','_sim_task_read_state','_sim_task_canonical','_sim_task_state_hash','_sim_scheduler_size','_sim_scheduler_init','_sim_scheduler_reset','_sim_scheduler_step','_sim_scheduler_restore','_sim_scheduler_read','_sim_scheduler_tick','_sim_scheduler_state_hash','_sim_scheduler_canonical','_sim_hal_reset','_sim_hal_register_pin','_sim_hal_set_pin','_sim_hal_get_pin','_sim_hal_set_param','_sim_hal_get_param','_sim_hal_connect','_sim_hal_register_thread','_sim_hal_register_function','_sim_hal_register_component','_sim_hal_set_function_failure','_sim_hal_step','_sim_hal_tick','_sim_hal_function_calls','_sim_hal_pin_count','_sim_hal_thread_count','_sim_hal_function_count','_sim_hal_component_count','_sim_hal_param_count','_sim_device_init','_sim_device_reset','_sim_device_encoder_set_speed','_sim_device_encoder_set_config','_sim_device_encoder_set_index_enable','_sim_device_coolant_command','_sim_device_coolant_set_fault','_sim_device_door_set','_sim_device_interlock_set','_sim_device_interlock_reset','_sim_device_estop_set','_sim_device_step','_sim_device_ack_issue','_sim_device_ack_ack','_sim_device_ack_abort','_sim_device_ack_step','_sim_device_state_hash','_sim_device_canonical','_sim_posemath_normalize','_sim_posemath_dot','_sim_posemath_line_point','_sim_posemath_is_finite','_sim_posemath_pose_is_finite','_sim_posemath_pose_line_point','_sim_posemath_segment_validate','_sim_posemath_segment_point','_sim_posemath_hash_state','_sim_tp_init','_sim_tp_reset','_sim_tp_enqueue','_sim_tp_step','_sim_tp_read_state','_sim_tp_state_hash','_sim_interpreter_size','_sim_interpreter_init','_sim_interpreter_reset','_sim_interpreter_execute','_sim_interpreter_read_state','_sim_interpreter_read_motion','_sim_interpreter_motion_size','_sim_interpreter_canonical','_sim_interpreter_state_hash','_sim_interpreter_block_hash','_sim_interpreter_modal_hash','_sim_interpreter_error_column','_sim_interpreter_error_code','_sim_interpreter_parameter_set','_sim_interpreter_parameter_get','_sim_motion_init','_sim_motion_size','_sim_motion_command_size','_sim_motion_state_size','_sim_motion_reset','_sim_motion_enqueue','_sim_motion_step','_sim_motion_read_state','_sim_motion_queue_depth','_sim_motion_state_hash','_sim_motion_canonical','_sim_kinematics_init','_sim_kinematics_forward','_sim_kinematics_forward_ex','_sim_kinematics_inverse','_sim_kinematics_inverse_ex','_sim_kinematics_home','_sim_kinematics_validate_pose','_sim_kinematics_state_hash','_sim_kinematics_switch_init','_sim_kinematics_switch_register','_sim_kinematics_switch_begin','_sim_kinematics_switch_abort','_sim_kinematics_switch_commit','_sim_kinematics_switch_select','_sim_kinematics_switch_forward','_sim_kinematics_switch_inverse','_sim_kinematics_switch_active','_sim_kinematics_switch_state_hash','_sim_kinematics_user_init','_sim_kinematics_user_bind_switch','_sim_kinematics_user_forward','_sim_kinematics_user_inverse','_sim_kinematics_user_reject_dynamic','_sim_kinematics_user_state_hash','_sim_kinematics_registry_count','_sim_kinematics_registry_get','_sim_kinematics_registry_find','_sim_kinematics_registry_require','_sim_kinematics_registry_validate_config','_sim_kinematics_registry_state_hash','_sim_kinematics_motion_init','_sim_kinematics_motion_reset','_sim_kinematics_motion_enqueue','_sim_kinematics_motion_pause','_sim_kinematics_motion_step','_sim_kinematics_motion_peek','_sim_kinematics_motion_pop','_sim_kinematics_motion_depth','_sim_kinematics_motion_state_hash','_sim_kinematics_feedback_init','_sim_kinematics_feedback_reset','_sim_kinematics_feedback_update','_sim_kinematics_feedback_read','_sim_kinematics_feedback_state_hash','_sim_kinematics_home_limit_init','_sim_kinematics_home_limit_reset','_sim_kinematics_home_limit_home','_sim_kinematics_home_limit_check','_sim_kinematics_home_limit_read','_sim_kinematics_home_limit_state_hash','_sim_io_init','_sim_io_reset','_sim_io_register_pins','_sim_io_spindle_command','_sim_io_spindle_set_inhibit','_sim_io_spindle_set_fault','_sim_io_spindle_set_index_enable','_sim_io_spindle_set_feedback','_sim_io_spindle_orient','_sim_io_spindle_set_oriented','_sim_io_tool_prepare','_sim_io_tool_set_prepared','_sim_io_tool_change','_sim_io_tool_set_changed','_sim_io_tool_abort','_sim_io_tool_set_fault','_sim_io_tool_clear_fault','_sim_io_probe_arm','_sim_io_probe_update','_sim_io_probe_disarm','_sim_io_set_estop','_sim_io_recover','_sim_io_step','_sim_io_read_state','_sim_io_state_hash','_sim_io_canonical'] -sEXPORTED_RUNTIME_METHODS=['ccall','cwrap']" ) get_target_property(_sim_module_link_flags sim_core_module LINK_FLAGS) string(REPLACE "_sim_task_recover','_sim_task_restore" "_sim_task_recover','_sim_task_command_gate','_sim_task_restore" _sim_module_link_flags "${_sim_module_link_flags}") string(REPLACE "_sim_interpreter_size" "_sim_program_size','_sim_program_requires_subroutines','_sim_program_init','_sim_program_reset','_sim_program_load','_sim_program_add_subroutine','_sim_program_set_rapid_velocity','_sim_program_start','_sim_program_pause','_sim_program_resume','_sim_program_abort','_sim_program_step','_sim_program_execute_block','_sim_program_seek','_sim_program_read_motion','_sim_program_clear_motion','_sim_program_canonical','_sim_program_state_hash','_sim_interpreter_size" _sim_module_link_flags "${_sim_module_link_flags}") string(REPLACE "_sim_hal_set_pin" "_sim_hal_set_pin_scalar','_sim_hal_set_pin" _sim_module_link_flags "${_sim_module_link_flags}") string(REPLACE "_sim_hal_set_param" "_sim_hal_set_param_scalar','_sim_hal_set_param" _sim_module_link_flags "${_sim_module_link_flags}") string(REPLACE "_sim_io_init" "_sim_io_size','_sim_io_init" _sim_module_link_flags "${_sim_module_link_flags}") string(REPLACE "_sim_io_set_estop','_sim_io_recover" "_sim_io_set_estop','_sim_io_set_power','_sim_io_recover" _sim_module_link_flags "${_sim_module_link_flags}") string(REPLACE "_sim_device_init" "_sim_device_io_size','_sim_device_init" _sim_module_link_flags "${_sim_module_link_flags}") string(REPLACE "_sim_motion_step','_sim_motion_read_state" "_sim_motion_step','_sim_motion_set_profile','_sim_motion_set_lookahead','_sim_motion_peek','_sim_motion_read_state" _sim_module_link_flags "${_sim_module_link_flags}") string(REPLACE "_sim_motion_state_hash','_sim_motion_canonical" "_sim_motion_state_hash','_sim_motion_plan_hash','_sim_motion_canonical" _sim_module_link_flags "${_sim_module_link_flags}") set_target_properties(sim_core_module PROPERTIES LINK_FLAGS "${_sim_module_link_flags}") endif()