Files
wasm-simulator/check-linuxcnc-inputs.sh
cnc de273bf830 接续上一轮:推进浏览器验证与M428配置收拢
结论:已完成浏览器侧真实加载验证,M428/M429/M430 的配置入口进一步从 LinuxCNC INI/HALFILE/REMAP 来源生成,native 与 source-link 验证通过。
2026-05-30 10:03:21 +08:00

169 lines
5.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
linuxcnc_root=${LINUXCNC_ROOT:-../linuxcnc}
manifest=${1:-}
require_complete=${2:-}
if [[ "$manifest" == "--root-only" ]]; then
manifest=
fi
if [[ "$manifest" == "--require-rs274-complete" || "$manifest" == "--require-kinematics-complete" ]]; then
echo "usage: $0 [manifest] [--require-rs274-complete|--require-kinematics-complete]" >&2
exit 1
fi
case "$require_complete" in
""|--require-rs274-complete|--require-kinematics-complete)
;;
*)
echo "unknown check-linuxcnc-inputs option: $require_complete" >&2
exit 1
;;
esac
if [[ -n "$manifest" && ! -f "$manifest" ]]; then
echo "missing manifest: $manifest" >&2
exit 1
fi
if [[ ! -d "$linuxcnc_root" ]]; then
echo "missing LinuxCNC root: $linuxcnc_root" >&2
exit 1
fi
if [[ -n "$manifest" && "$require_complete" == "--require-rs274-complete" ]]; then
rs274_dir="$linuxcnc_root/src/emc/rs274ngc"
if [[ ! -d "$rs274_dir" ]]; then
echo "missing LinuxCNC rs274ngc source directory: $rs274_dir" >&2
exit 1
fi
mapfile -t rs274_sources < <(
find "$rs274_dir" -maxdepth 1 -type f \
| sed "s#^$linuxcnc_root/##" \
| sort
)
mapfile -t manifest_rs274_sources < <(
awk -F: '
$1 !~ /^($|#)/ && $2 ~ /^src\/emc\/rs274ngc\// { print $2 }
' "$manifest" | sort -u
)
missing_rs274_sources=()
for source in "${rs274_sources[@]}"; do
if ! printf '%s\n' "${manifest_rs274_sources[@]}" | grep -Fx -- "$source" >/dev/null; then
missing_rs274_sources+=("$source")
fi
done
if ((${#missing_rs274_sources[@]} > 0)); then
echo "manifest does not cover all LinuxCNC rs274ngc sources: $manifest" >&2
printf 'missing rs274ngc source: %s\n' "${missing_rs274_sources[@]}" >&2
exit 1
fi
fi
if [[ -n "$manifest" && "$require_complete" == "--require-kinematics-complete" ]]; then
kinematics_dir="$linuxcnc_root/src/emc/kinematics"
if [[ ! -d "$kinematics_dir" ]]; then
echo "missing LinuxCNC kinematics source directory: $kinematics_dir" >&2
exit 1
fi
mapfile -t kinematics_sources < <(
find "$kinematics_dir" -maxdepth 1 -type f \
| sed "s#^$linuxcnc_root/##" \
| sort
)
mapfile -t manifest_kinematics_sources < <(
awk -F: '
$1 !~ /^($|#)/ && $2 ~ /^src\/emc\/kinematics\// { print $2 }
' "$manifest" | sort -u
)
missing_kinematics_sources=()
for source in "${kinematics_sources[@]}"; do
if ! printf '%s\n' "${manifest_kinematics_sources[@]}" | grep -Fx -- "$source" >/dev/null; then
missing_kinematics_sources+=("$source")
fi
done
if ((${#missing_kinematics_sources[@]} > 0)); then
echo "manifest does not cover all LinuxCNC kinematics sources: $manifest" >&2
printf 'missing kinematics source: %s\n' "${missing_kinematics_sources[@]}" >&2
exit 1
fi
mapfile -t m428_m430_remap_sources < <(
find "$linuxcnc_root/configs" -path '*/remap_subs/*' -type f \
\( -name '428remap.ngc' -o -name '429remap.ngc' -o -name '430remap.ngc' \) \
| sed "s#^$linuxcnc_root/##" \
| sort
)
mapfile -t manifest_m428_m430_remap_sources < <(
awk -F: '
$1 !~ /^($|#)/ && $2 ~ /\/remap_subs\/(428|429|430)remap\.ngc$/ { print $2 }
' "$manifest" | sort -u
)
missing_m428_m430_remap_sources=()
for source in "${m428_m430_remap_sources[@]}"; do
if ! printf '%s\n' "${manifest_m428_m430_remap_sources[@]}" | grep -Fx -- "$source" >/dev/null; then
missing_m428_m430_remap_sources+=("$source")
fi
done
if ((${#missing_m428_m430_remap_sources[@]} > 0)); then
echo "manifest does not cover all LinuxCNC M428/M429/M430 remap sources: $manifest" >&2
printf 'missing M428/M429/M430 remap source: %s\n' "${missing_m428_m430_remap_sources[@]}" >&2
exit 1
fi
mismatched_m428_m430_remap_notes=()
for source in "${m428_m430_remap_sources[@]}"; do
kinstype=$(sed -n 's/^[[:space:]]*#<kinstype>[[:space:]]*=[[:space:]]*\([0-9][0-9]*\).*/\1/p' "$linuxcnc_root/$source" | head -n 1)
manifest_note=$(awk -F: -v path="$source" '
$1 !~ /^($|#)/ && $2 == path { print $3; exit }
' "$manifest")
if [[ -z "$kinstype" || "$manifest_note" != *"kinstype $kinstype"* ]]; then
mismatched_m428_m430_remap_notes+=("$source")
fi
done
if ((${#mismatched_m428_m430_remap_notes[@]} > 0)); then
echo "manifest M428/M429/M430 remap notes do not match LinuxCNC #<kinstype> assignments: $manifest" >&2
printf 'mismatched M428/M429/M430 remap note: %s\n' "${mismatched_m428_m430_remap_notes[@]}" >&2
exit 1
fi
mapfile -t m428_m430_ini_sources < <(
find "$linuxcnc_root/configs" -name '*.ini' -type f -print0 \
| while IFS= read -r -d '' source; do
if grep -Eiq 'REMAP[[:space:]]*=[[:space:]]*M(428|429|430)([^0-9]|$)' "$source"; then
printf '%s\n' "${source#"$linuxcnc_root/"}"
fi
done \
| sort
)
mapfile -t manifest_m428_m430_ini_sources < <(
awk -F: '
$1 !~ /^($|#)/ && $1 == "config" && $2 ~ /\.ini$/ { print $2 }
' "$manifest" | sort -u
)
missing_m428_m430_ini_sources=()
for source in "${m428_m430_ini_sources[@]}"; do
if ! printf '%s\n' "${manifest_m428_m430_ini_sources[@]}" | grep -Fx -- "$source" >/dev/null; then
missing_m428_m430_ini_sources+=("$source")
fi
done
if ((${#missing_m428_m430_ini_sources[@]} > 0)); then
echo "manifest does not cover all LinuxCNC INI files that declare M428/M429/M430 remaps: $manifest" >&2
printf 'missing M428/M429/M430 INI source: %s\n' "${missing_m428_m430_ini_sources[@]}" >&2
exit 1
fi
fi