#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" WRAP_DIR="$ROOT_DIR/runtime/core/linuxcnc_wrap" SHIM_DIR="$ROOT_DIR/runtime/core/shims" INCLUDE_DIR="$ROOT_DIR/runtime/core/include" VENDOR_SRC_DIR="$ROOT_DIR/vendor/linuxcnc/src" OUT_DIR="$ROOT_DIR/build/wasm/task-hal" OBJ_DIR="$OUT_DIR/obj" source "$ROOT_DIR/tools/wasm_incremental_build_lib.sh" mkdir -p "$OUT_DIR" "$OBJ_DIR" TARGET="linuxcnc_task_hal_wasm" : > "$OUT_DIR/$TARGET.stdout.log" : > "$OUT_DIR/$TARGET.stderr.log" COMMON_FLAGS=( -O2 -D_GNU_SOURCE -I"$WRAP_DIR" -I"$SHIM_DIR" -I"$INCLUDE_DIR" -I"$VENDOR_SRC_DIR" ) SOURCES=( "$VENDOR_SRC_DIR/emc/task/emccanon_wasm_subset.cc" "$VENDOR_SRC_DIR/emc/task/emctask_wasm_subset.cc" "$VENDOR_SRC_DIR/emc/task/taskintf_wasm_subset.cc" "$WRAP_DIR/linuxcnc_hal_runtime.cpp" "$WRAP_DIR/linuxcnc_motion_runtime.c" "$WRAP_DIR/linuxcnc_task_hal_wasm.cpp" ) OBJECTS=() for source in "${SOURCES[@]}"; do obj="$(source_object_path "$source" "$ROOT_DIR" "$OBJ_DIR")" OBJECTS+=("$obj") if [[ "$source" == *.c ]]; then compile_wasm_object "$TARGET" "$source" "$obj" "$OUT_DIR" -std=c11 "${COMMON_FLAGS[@]}" else compile_wasm_object "$TARGET" "$source" "$obj" "$OUT_DIR" -std=c++20 "${COMMON_FLAGS[@]}" fi done link_wasm_module \ "$TARGET" \ "$OUT_DIR/linuxcnc_task_hal.js" \ "$OUT_DIR" \ -O2 \ "${OBJECTS[@]}" \ -s MODULARIZE=1 \ -s EXPORT_ES6=1 \ -s ENVIRONMENT=web,node \ -s ALLOW_MEMORY_GROWTH=1 \ -s NO_EXIT_RUNTIME=1 \ -s EXPORTED_FUNCTIONS='["_malloc","_free","_hal_init","_hal_ready","_hal_exit","_hal_malloc","_hal_pin_bit_new","_hal_pin_float_new","_hal_pin_s32_new","_hal_pin_u32_new","_hal_pin_s64_new","_hal_pin_u64_new","_hal_pin_bit_newf","_hal_pin_float_newf","_hal_pin_s32_newf","_hal_pin_u32_newf","_hal_pin_s64_newf","_hal_pin_u64_newf","_hal_param_bit_new","_hal_param_float_new","_hal_param_s32_new","_hal_param_u32_new","_hal_param_s64_new","_hal_param_u64_new","_hal_param_bit_newf","_hal_param_float_newf","_hal_param_s32_newf","_hal_param_u32_newf","_hal_param_s64_newf","_hal_param_u64_newf","_hal_get_pin_value_by_name","_hal_get_signal_value_by_name","_hal_get_param_value_by_name","_hal_link","_hal_unlink","_hal_set_p","_hal_get_p","_hal_create_thread","_hal_add_funct_to_thread","_hal_del_funct_from_thread","_hal_start_threads","_hal_stop_threads","_lchal_init_runtime","_lchal_load_hal_file","_lchal_set_pin_float","_lchal_set_pin_s32","_lchal_set_pin_bit","_lchal_get_pin_json","_lchal_get_snapshot_json","_lchal_step_threads","_lchal_reset_runtime","_lcmot_init_from_ini","_lcmot_write_command_json","_lcmot_write_linear_move","_lcmot_write_jog_incr","_lcmot_write_joint_home","_lcmot_write_joint_unhome","_lcmot_write_aout","_lcmot_step_servo","_lcmot_read_status_snapshot","_lcmot_read_config_snapshot","_lcmot_read_error_message","_lcmot_read_status_json","_lcmot_read_hal_snapshot_json","_lcmot_reset","_lctask_init_session","_lctask_stage_file","_lctask_open_program","_lctask_load_program_motion_plan_json","_lctask_send_command_json","_lctask_run_cycles","_lctask_read_status_json","_lctask_read_events_json","_lctask_reset_session"]' \ -s EXPORTED_RUNTIME_METHODS='["UTF8ToString","stringToUTF8","lengthBytesUTF8","getValue","setValue"]' echo "linuxcnc_task_hal_wasm_build=ok"