#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" VENDOR_DIR="$ROOT_DIR/vendor/linuxcnc" WRAP_DIR="$ROOT_DIR/runtime/core/linuxcnc_wrap" SHIM_DIR="$ROOT_DIR/runtime/core/shims" INCLUDE_DIR="$ROOT_DIR/runtime/core/include" OUT_DIR="$ROOT_DIR/build/wasm/kinematics" OBJ_DIR="$OUT_DIR/obj" source "$ROOT_DIR/tools/wasm_incremental_build_lib.sh" mkdir -p "$OUT_DIR" "$OBJ_DIR" COMMON_FLAGS=( -O2 -D_GNU_SOURCE -DM_PI=3.14159265358979323846 -I"$WRAP_DIR" -I"$SHIM_DIR" -I"$INCLUDE_DIR" -I"$VENDOR_DIR/src" -I"$VENDOR_DIR/src/rtapi" -I"$VENDOR_DIR/src/emc" -I"$VENDOR_DIR/src/emc/nml_intf" -I"$VENDOR_DIR/src/emc/motion" -I"$VENDOR_DIR/src/emc/tp" -I"$VENDOR_DIR/src/emc/kinematics" -I"$VENDOR_DIR/src/libnml/posemath" ) C_FLAGS=( -std=gnu11 "${COMMON_FLAGS[@]}" ) CXX_FLAGS=( -std=c++20 -fpermissive -include "$SHIM_DIR/linuxcnc_wasm_compat.hh" "${COMMON_FLAGS[@]}" ) build_kinematics_module() { local target="$1" local output="$2" shift 2 local sources=("$@") local target_obj_dir="$OBJ_DIR/$target" mkdir -p "$target_obj_dir" : > "$OUT_DIR/$target.stdout.log" : > "$OUT_DIR/$target.stderr.log" local objects=() local source obj for source in "${sources[@]}"; do obj="$(source_object_path "$source" "$ROOT_DIR" "$target_obj_dir")" objects+=("$obj") case "$source" in *.cc|*.cpp|*.cxx) compile_wasm_object "$target" "$source" "$obj" "$OUT_DIR" "${CXX_FLAGS[@]}" ;; *) compile_wasm_object "$target" "$source" "$obj" "$OUT_DIR" "${C_FLAGS[@]}" ;; esac done link_wasm_module \ "$target" \ "$OUT_DIR/$output.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","_lckins_init","_lckins_exit","_lckins_type","_lckins_switchable","_lckins_switch","_lckins_forward","_lckins_inverse","_lckins_run_probe","_lckins_free_string"]' \ -s EXPORTED_RUNTIME_METHODS='["UTF8ToString","HEAPF64","HEAPU32"]' } TRT_COMMON_SOURCES=( "$VENDOR_DIR/src/emc/kinematics/kins_util.c" "$VENDOR_DIR/src/emc/kinematics/switchkins.c" "$VENDOR_DIR/src/emc/kinematics/userkfuncs.c" "$VENDOR_DIR/src/emc/kinematics/trtfuncs.c" "$WRAP_DIR/linuxcnc_hal_adapter.cpp" "$WRAP_DIR/linuxcnc_kinematics_wasm.c" ) SWITCHKINS_COMMON_SOURCES=( "$VENDOR_DIR/src/emc/kinematics/kins_util.c" "$VENDOR_DIR/src/emc/kinematics/switchkins.c" "$VENDOR_DIR/src/emc/kinematics/userkfuncs.c" "$WRAP_DIR/linuxcnc_hal_adapter.cpp" "$WRAP_DIR/linuxcnc_kinematics_wasm.c" ) POSEMATH_SOURCES=( "$VENDOR_DIR/src/libnml/posemath/posemath.cc" "$VENDOR_DIR/src/libnml/posemath/_posemath.c" "$VENDOR_DIR/src/libnml/posemath/sincos.c" ) build_kinematics_module \ linuxcnc_trivkins_kinematics_wasm \ linuxcnc_trivkins_kinematics \ "$VENDOR_DIR/src/emc/kinematics/kins_util.c" \ "$VENDOR_DIR/src/emc/kinematics/trivkins.c" \ "$WRAP_DIR/linuxcnc_hal_adapter.cpp" \ "$WRAP_DIR/linuxcnc_kinematics_wasm.c" build_kinematics_module \ linuxcnc_5axiskins_kinematics_wasm \ linuxcnc_5axiskins_kinematics \ "${SWITCHKINS_COMMON_SOURCES[@]}" \ "$VENDOR_DIR/src/emc/kinematics/5axiskins.c" build_kinematics_module \ linuxcnc_xyzac_trt_kinematics_wasm \ linuxcnc_xyzac_trt_kinematics \ "${TRT_COMMON_SOURCES[@]}" \ "$VENDOR_DIR/src/emc/kinematics/xyzac-trt-kins.c" build_kinematics_module \ linuxcnc_xyzbc_trt_kinematics_wasm \ linuxcnc_xyzbc_trt_kinematics \ "${TRT_COMMON_SOURCES[@]}" \ "$VENDOR_DIR/src/emc/kinematics/xyzbc-trt-kins.c" build_kinematics_module \ linuxcnc_corexy_kinematics_wasm \ linuxcnc_corexy_kinematics \ "$VENDOR_DIR/src/emc/kinematics/corexykins.c" \ "$WRAP_DIR/linuxcnc_hal_adapter.cpp" \ "$WRAP_DIR/linuxcnc_kinematics_wasm.c" build_kinematics_module \ linuxcnc_rotate_kinematics_wasm \ linuxcnc_rotate_kinematics \ "$VENDOR_DIR/src/emc/kinematics/rotatekins.c" \ "$WRAP_DIR/linuxcnc_hal_adapter.cpp" \ "$WRAP_DIR/linuxcnc_kinematics_wasm.c" build_kinematics_module \ linuxcnc_rose_kinematics_wasm \ linuxcnc_rose_kinematics \ "$VENDOR_DIR/src/emc/kinematics/rosekins.c" \ "$WRAP_DIR/linuxcnc_hal_adapter.cpp" \ "$WRAP_DIR/linuxcnc_kinematics_wasm.c" build_kinematics_module \ linuxcnc_max_kinematics_wasm \ linuxcnc_max_kinematics \ "$VENDOR_DIR/src/emc/kinematics/maxkins.c" \ "$WRAP_DIR/linuxcnc_hal_adapter.cpp" \ "$WRAP_DIR/linuxcnc_kinematics_wasm.c" build_kinematics_module \ linuxcnc_lineardelta_kinematics_wasm \ linuxcnc_lineardelta_kinematics \ "$VENDOR_DIR/src/emc/kinematics/lineardeltakins.c" \ "$WRAP_DIR/linuxcnc_hal_adapter.cpp" \ "$WRAP_DIR/linuxcnc_kinematics_wasm.c" build_kinematics_module \ linuxcnc_rotarydelta_kinematics_wasm \ linuxcnc_rotarydelta_kinematics \ "$VENDOR_DIR/src/emc/kinematics/rotarydeltakins.c" \ "$WRAP_DIR/linuxcnc_hal_adapter.cpp" \ "$WRAP_DIR/linuxcnc_kinematics_wasm.c" build_kinematics_module \ linuxcnc_scorbot_kinematics_wasm \ linuxcnc_scorbot_kinematics \ "$VENDOR_DIR/src/emc/kinematics/scorbot-kins.c" \ "$WRAP_DIR/linuxcnc_hal_adapter.cpp" \ "$WRAP_DIR/linuxcnc_kinematics_wasm.c" build_kinematics_module \ linuxcnc_tripod_kinematics_wasm \ linuxcnc_tripod_kinematics \ "$VENDOR_DIR/src/emc/kinematics/tripodkins.c" \ "$WRAP_DIR/linuxcnc_hal_adapter.cpp" \ "$WRAP_DIR/linuxcnc_kinematics_wasm.c" build_kinematics_module \ linuxcnc_scara_kinematics_wasm \ linuxcnc_scara_kinematics \ "${SWITCHKINS_COMMON_SOURCES[@]}" \ "$VENDOR_DIR/src/emc/kinematics/scarakins.c" build_kinematics_module \ linuxcnc_puma_kinematics_wasm \ linuxcnc_puma_kinematics \ "${SWITCHKINS_COMMON_SOURCES[@]}" \ "$VENDOR_DIR/src/emc/kinematics/pumakins.c" \ "${POSEMATH_SOURCES[@]}" build_kinematics_module \ linuxcnc_genser_kinematics_wasm \ linuxcnc_genser_kinematics \ "${SWITCHKINS_COMMON_SOURCES[@]}" \ "$VENDOR_DIR/src/emc/kinematics/genserfuncs.c" \ "$VENDOR_DIR/src/emc/kinematics/genserkins.c" \ "$VENDOR_DIR/src/libnml/posemath/gomath.c" \ "$VENDOR_DIR/src/libnml/posemath/sincos.c" build_kinematics_module \ linuxcnc_genhex_kinematics_wasm \ linuxcnc_genhex_kinematics \ "${SWITCHKINS_COMMON_SOURCES[@]}" \ "$VENDOR_DIR/src/emc/kinematics/genhexkins.c" \ "${POSEMATH_SOURCES[@]}" build_kinematics_module \ linuxcnc_pentakins_kinematics_wasm \ linuxcnc_pentakins_kinematics \ "$VENDOR_DIR/src/emc/kinematics/pentakins.c" \ "${POSEMATH_SOURCES[@]}" \ "$WRAP_DIR/linuxcnc_hal_adapter.cpp" \ "$WRAP_DIR/linuxcnc_kinematics_wasm.c"