满庭芳·源流归一

结论:LinuxCNC rs274ngc 源码移植边界继续收拢。已将 rs274ngc 头文件纳入 manifest 跟踪,core 编译组仍只包含可编译源文件;启用 CNC_SIM_ENABLE_LINUXCNC_RS274_BACKEND 时 API 默认使用 LinuxCNC rs274 后端;M428/M429/M430 与 5axis/TRT/TDR/RTCP 相关路径继续保持来自 LinuxCNC 源码或 remap 配置的薄桥接。

验证:./test-linuxcnc-source-syntax.sh;./test-linuxcnc-api-native.sh;./test-native.sh;./test-linuxcnc-source-link.sh。
This commit is contained in:
cnc
2026-05-28 18:00:53 +08:00
parent 40a63c76f7
commit b40914747d
65 changed files with 5189 additions and 1117 deletions

View File

@@ -8,12 +8,128 @@ linuxcnc_root=${LINUXCNC_ROOT:-../linuxcnc}
missing_root=/tmp/does-not-exist-linuxcnc
missing_root_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_missing_root.XXXXXX.log")
missing_manifest=${TMPDIR:-/tmp}/cnc_sim_missing_native_manifest.txt
missing_manifest_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_native_manifest.XXXXXX.log")
unknown_group_manifest=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_unknown_manifest_group.XXXXXX.txt")
unknown_group_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_unknown_manifest_group.XXXXXX.log")
duplicate_manifest=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_duplicate_manifest.XXXXXX.txt")
duplicate_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_duplicate_manifest.XXXXXX.log")
unknown_filter_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_unknown_manifest_filter.XXXXXX.log")
unknown_output_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_unknown_manifest_output.XXXXXX.log")
missing_dump_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_rs274_dump_project_source.XXXXXX.log")
missing_api_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_rs274_api_project_source.XXXXXX.log")
missing_core_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_core_source.XXXXXX.log")
missing_bridge_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_bridge_smoke_project_source.XXXXXX.log")
missing_support_object_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_linuxcnc_support_object.XXXXXX.log")
missing_source_manifest=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_syntax_missing_source_manifest.XXXXXX.txt")
missing_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_syntax_missing_source.XXXXXX.log")
cleanup_native_test_temps() {
rm -f \
"$missing_root_log" \
"$missing_manifest" \
"$missing_manifest_log" \
"$unknown_group_manifest" \
"$unknown_group_log" \
"$duplicate_manifest" \
"$duplicate_log" \
"$unknown_filter_log" \
"$unknown_output_log" \
"$missing_dump_source_log" \
"$missing_api_source_log" \
"$missing_core_source_log" \
"$missing_bridge_source_log" \
"$missing_support_object_log" \
"$missing_source_manifest" \
"$missing_source_log"
}
trap cleanup_native_test_temps EXIT
grep -Fx 'trap cleanup_native_test_temps EXIT' test-all-native.sh >/dev/null
if ! awk '
/cleanup_native_test_temps\(\)/ { in_cleanup = 1 }
in_cleanup && index($0, "\"$missing_manifest\"") { found_missing_manifest = 1 }
in_cleanup && /^}/ { in_cleanup = 0 }
END { exit !found_missing_manifest }
' test-all-native.sh; then
echo "native aggregate test cleanup no longer removes fixed missing-manifest path" >&2
exit 1
fi
for forbidden_manual_cleanup in \
'rm -f "$missing_root_log"' \
'rm -f "$missing_manifest_log"' \
'rm -f "$unknown_group_manifest" "$unknown_group_log"' \
'rm -f "$duplicate_manifest" "$duplicate_log"' \
'rm -f "$unknown_filter_log"' \
'rm -f "$unknown_output_log"' \
'rm -f "$missing_dump_source_log"' \
'rm -f "$missing_api_source_log"' \
'rm -f "$missing_core_source_log"' \
'rm -f "$missing_bridge_source_log"' \
'rm -f "$missing_support_object_log"' \
'rm -f "$missing_source_manifest" "$missing_source_log"'; do
if grep -Fx "$forbidden_manual_cleanup" test-all-native.sh >/dev/null; then
echo "native aggregate test still relies on manual cleanup: $forbidden_manual_cleanup" >&2
exit 1
fi
done
grep -F 'exec 9>"${TMPDIR:-/tmp}/cnc_sim_rs274_source_link.lock"' test-linuxcnc-source-link.sh >/dev/null
grep -F "flock 9" test-linuxcnc-source-link.sh >/dev/null
grep -F "missing LinuxCNC support object:" list-linuxcnc-source-support-objects.sh >/dev/null
grep -F "missing LinuxCNC support object" list-linuxcnc-source-support-objects.sh >/dev/null
grep -F 'echo "$missing_path_message: $path"' list-filtered-existing-paths.sh >/dev/null
grep -F "build LinuxCNC first or set LINUXCNC_ROOT to a built tree" list-linuxcnc-source-support-objects.sh >/dev/null
native_link_flags=$(LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-native-linkflags.sh)
grep -Fx -- "-L" <<<"$native_link_flags" >/dev/null
grep -Fx -- "$linuxcnc_root/lib" <<<"$native_link_flags" >/dev/null
grep -Fx -- "-Wl,-rpath,$linuxcnc_root/lib" <<<"$native_link_flags" >/dev/null
grep -F 'exec 9>"${TMPDIR:-/tmp}/cnc_sim_linuxcnc_rs274_native.lock"' test-linuxcnc-rs274-native.sh >/dev/null
grep -F "flock 9" test-linuxcnc-rs274-native.sh >/dev/null
for build_dir_probe_script in \
test-linuxcnc-source-objects.sh \
test-linuxcnc-source-link.sh \
test-linuxcnc-bridge-native.sh \
test-linuxcnc-rs274-native.sh \
test-linuxcnc-api-native.sh; do
if ! awk '
index($0, "trap '\''rm -rf \"$build_dir\"'\'' EXIT") { trap_line = NR }
index($0, "./check-linuxcnc-inputs.sh") && !check_line { check_line = NR }
END { exit !(trap_line && check_line && trap_line < check_line) }
' "$build_dir_probe_script"; then
echo "$build_dir_probe_script installs build_dir cleanup after input validation" >&2
exit 1
fi
done
grep -F 'python_include_output=$(python3.13-config --includes 2>/dev/null || python3-config --includes)' list-linuxcnc-source-common-cxxflags.sh >/dev/null
if grep -F 'read -r -a python_includes <<<"$(' list-linuxcnc-source-common-cxxflags.sh >/dev/null; then
echo "source common cxxflags still hides python-config failures behind read" >&2
exit 1
fi
forbidden_common_flags_process_substitution='readarray -t common_flags < <('
forbidden_link_flags_process_substitution='readarray -t link_flags < <('
forbidden_source_common_flags_helper='./list-linuxcnc-source-common-cxxflags.sh'
forbidden_native_link_flags_helper='./list-linuxcnc-native-linkflags.sh'
if grep -RInF "${forbidden_common_flags_process_substitution}LINUXCNC_ROOT=\"\$linuxcnc_root\" ${forbidden_source_common_flags_helper}" test-linuxcnc-*.sh >/dev/null; then
echo "native probes still read source common flags through process substitution" >&2
grep -RInF "${forbidden_common_flags_process_substitution}LINUXCNC_ROOT=\"\$linuxcnc_root\" ${forbidden_source_common_flags_helper}" test-linuxcnc-*.sh >&2
exit 1
fi
if grep -RInF "${forbidden_link_flags_process_substitution}LINUXCNC_ROOT=\"\$linuxcnc_root\" ${forbidden_native_link_flags_helper}" test-linuxcnc-*.sh >/dev/null; then
echo "native probes still read link flags through process substitution" >&2
grep -RInF "${forbidden_link_flags_process_substitution}LINUXCNC_ROOT=\"\$linuxcnc_root\" ${forbidden_native_link_flags_helper}" test-linuxcnc-*.sh >&2
exit 1
fi
syntax_only_source_common_flags=$(LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-common-cxxflags.sh --syntax-only)
grep -Fx -- "-fsyntax-only" <<<"$syntax_only_source_common_flags" >/dev/null
core_include_source_common_flags=$(LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-common-cxxflags.sh --core-include)
grep -Fx -- "-I" <<<"$core_include_source_common_flags" >/dev/null
grep -Fx -- "core/include" <<<"$core_include_source_common_flags" >/dev/null
python_source_common_flags=$(LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-common-cxxflags.sh --python)
grep -F "include/python" <<<"$python_source_common_flags" >/dev/null
no_ulapi_source_common_flags=$(LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-common-cxxflags.sh --no-ulapi)
if grep -Fx -- "-DULAPI" <<<"$no_ulapi_source_common_flags" >/dev/null; then
echo "source common cxxflags emitted ULAPI with --no-ulapi" >&2
exit 1
fi
grep -F "CNC_SIM_ENABLE_LINUXCNC_RS274_BACKEND is native-only; it links LinuxCNC librs274" core/CMakeLists.txt >/dev/null
grep -F "Set CNC_SIM_LINUXCNC_ROOT to the LinuxCNC source root" core/CMakeLists.txt >/dev/null
grep -F "find_package(Python3 REQUIRED COMPONENTS Development)" core/CMakeLists.txt >/dev/null
@@ -34,6 +150,11 @@ grep -F './list-linuxcnc-rs274-api-project-sources.sh > "$project_source_list"'
grep -F './list-cnc-sim-core-sources.sh > "$core_source_list"' test-native.sh >/dev/null
grep -F './list-linuxcnc-bridge-smoke-project-sources.sh > "$project_source_list"' test-linuxcnc-bridge-native.sh >/dev/null
grep -F 'LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-support-objects.sh > "$support_object_list"' test-linuxcnc-source-link.sh >/dev/null
grep -F 'trap '\''rm -f "$source_list" "$missing_source_manifest" "$missing_source_log"'\'' EXIT' test-linuxcnc-source-syntax.sh >/dev/null
if grep -F 'rm -f "$missing_source_manifest" "$missing_source_log"' test-linuxcnc-source-syntax.sh >/dev/null; then
echo "linuxcnc source syntax probe still relies on manual cleanup for missing-source temporaries" >&2
exit 1
fi
for script in \
test-linuxcnc-source-syntax.sh \
test-linuxcnc-source-objects.sh \
@@ -51,10 +172,7 @@ for script in \
exit 1
fi
done
rm -f "$missing_root_log"
missing_manifest=${TMPDIR:-/tmp}/cnc_sim_missing_native_manifest.txt
missing_manifest_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_native_manifest.XXXXXX.log")
rm -f "$missing_manifest"
for script in \
list-linuxcnc-source-manifest-sources.sh \
@@ -71,10 +189,7 @@ for script in \
exit 1
fi
done
rm -f "$missing_manifest_log"
unknown_group_manifest=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_unknown_manifest_group.XXXXXX.txt")
unknown_group_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_unknown_manifest_group.XXXXXX.log")
printf 'bogus:src/emc/rs274ngc/interp_arc.cc:test unknown group\n' >"$unknown_group_manifest"
for script in \
list-linuxcnc-source-manifest-sources.sh \
@@ -91,10 +206,7 @@ for script in \
exit 1
fi
done
rm -f "$unknown_group_manifest" "$unknown_group_log"
duplicate_manifest=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_duplicate_manifest.XXXXXX.txt")
duplicate_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_duplicate_manifest.XXXXXX.log")
printf 'core:src/emc/rs274ngc/interp_arc.cc:test duplicate source\ncore:src/emc/rs274ngc/interp_arc.cc:test duplicate source\n' >"$duplicate_manifest"
for script in \
list-linuxcnc-source-manifest-sources.sh \
@@ -111,16 +223,20 @@ for script in \
exit 1
fi
done
rm -f "$duplicate_manifest" "$duplicate_log"
./list-linuxcnc-source-manifest-sources.sh "$manifest" core >/dev/null
grep -Fx "src/emc/rs274ngc/interp_arc.cc" \
< <(./list-linuxcnc-source-manifest-sources.sh "$manifest" core) >/dev/null
grep -Fx "src/emc/rs274ngc/interpmodule.cc" \
< <(./list-linuxcnc-source-manifest-sources.sh "$manifest" binding) >/dev/null
grep -Fx "src/emc/tooldata/tooldata_common.cc" \
< <(./list-linuxcnc-source-manifest-sources.sh "$manifest" tooldata) >/dev/null
unknown_filter_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_unknown_manifest_filter.XXXXXX.log")
native_manifest_core=$(./list-linuxcnc-source-manifest-sources.sh "$manifest" core)
grep -Fx "src/emc/rs274ngc/interp_arc.cc" <<<"$native_manifest_core" >/dev/null
native_manifest_binding=$(./list-linuxcnc-source-manifest-sources.sh "$manifest" binding)
grep -Fx "src/emc/rs274ngc/interpmodule.cc" <<<"$native_manifest_binding" >/dev/null
native_manifest_tooldata=$(./list-linuxcnc-source-manifest-sources.sh "$manifest" tooldata)
grep -Fx "src/emc/tooldata/tooldata_common.cc" <<<"$native_manifest_tooldata" >/dev/null
native_manifest_header=$(./list-linuxcnc-source-manifest-sources.sh "$manifest" header)
grep -Fx "src/emc/rs274ngc/rs274ngc_interp.hh" <<<"$native_manifest_header" >/dev/null
if grep -E '\.(hh|h)$' <<<"$native_manifest_core" >/dev/null; then
echo "native manifest core compile group includes headers" >&2
exit 1
fi
if ./list-linuxcnc-source-manifest-sources.sh "$manifest" bogus >"$unknown_filter_log" 2>&1; then
echo "native manifest source lister accepted unknown filter" >&2
exit 1
@@ -130,8 +246,6 @@ if ! grep -F "unknown manifest source filter: bogus" "$unknown_filter_log" >/dev
sed -n '1,20p' "$unknown_filter_log" >&2
exit 1
fi
rm -f "$unknown_filter_log"
unknown_output_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_unknown_manifest_output.XXXXXX.log")
if ./list-linuxcnc-source-manifest-sources.sh "$manifest" core bogus >"$unknown_output_log" 2>&1; then
echo "native manifest source lister accepted unknown output mode" >&2
exit 1
@@ -141,14 +255,12 @@ if ! grep -F "unknown manifest source output mode: bogus" "$unknown_output_log"
sed -n '1,20p' "$unknown_output_log" >&2
exit 1
fi
rm -f "$unknown_output_log"
grep -Fx "$linuxcnc_root/src/emc/rs274ngc/interp_arc.cc" \
< <(LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-manifest-sources.sh "$manifest" core full) >/dev/null
native_manifest_core_full=$(LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-manifest-sources.sh "$manifest" core full)
grep -Fx "$linuxcnc_root/src/emc/rs274ngc/interp_arc.cc" <<<"$native_manifest_core_full" >/dev/null
./list-linuxcnc-rs274-dump-project-sources.sh >/dev/null
grep -Fx "core/tools/linuxcnc_rs274_dump.cpp" \
< <(./list-linuxcnc-rs274-dump-project-sources.sh linuxcnc_rs274_dump.cpp) >/dev/null
missing_dump_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_rs274_dump_project_source.XXXXXX.log")
rs274_dump_source=$(./list-linuxcnc-rs274-dump-project-sources.sh linuxcnc_rs274_dump.cpp)
grep -Fx "core/tools/linuxcnc_rs274_dump.cpp" <<<"$rs274_dump_source" >/dev/null
if ./list-linuxcnc-rs274-dump-project-sources.sh does_not_exist.cc >"$missing_dump_source_log" 2>&1; then
echo "rs274 dump project source lister accepted missing source filter" >&2
exit 1
@@ -158,12 +270,10 @@ if ! grep -F "missing LinuxCNC rs274 dump project source in list: does_not_exist
sed -n '1,20p' "$missing_dump_source_log" >&2
exit 1
fi
rm -f "$missing_dump_source_log"
./list-linuxcnc-rs274-api-project-sources.sh >/dev/null
grep -Fx "core/src/linuxcnc_rs274_backend.cpp" \
< <(./list-linuxcnc-rs274-api-project-sources.sh linuxcnc_rs274_backend.cpp) >/dev/null
missing_api_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_rs274_api_project_source.XXXXXX.log")
rs274_api_source=$(./list-linuxcnc-rs274-api-project-sources.sh linuxcnc_rs274_backend.cpp)
grep -Fx "core/src/linuxcnc_rs274_backend.cpp" <<<"$rs274_api_source" >/dev/null
if ./list-linuxcnc-rs274-api-project-sources.sh does_not_exist.cc >"$missing_api_source_log" 2>&1; then
echo "rs274 API project source lister accepted missing source filter" >&2
exit 1
@@ -173,12 +283,10 @@ if ! grep -F "missing LinuxCNC rs274 API project source in CMake list: does_not_
sed -n '1,20p' "$missing_api_source_log" >&2
exit 1
fi
rm -f "$missing_api_source_log"
./list-cnc-sim-core-sources.sh >/dev/null
grep -Fx "core/src/smoke_gcode_parser.cpp" \
< <(./list-cnc-sim-core-sources.sh smoke_gcode_parser.cpp) >/dev/null
missing_core_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_core_source.XXXXXX.log")
cnc_sim_core_source=$(./list-cnc-sim-core-sources.sh smoke_gcode_parser.cpp)
grep -Fx "core/src/smoke_gcode_parser.cpp" <<<"$cnc_sim_core_source" >/dev/null
if ./list-cnc-sim-core-sources.sh does_not_exist.cc >"$missing_core_source_log" 2>&1; then
echo "cnc sim core source lister accepted missing source filter" >&2
exit 1
@@ -188,12 +296,10 @@ if ! grep -F "missing cnc sim core source in CMake list: does_not_exist.cc" "$mi
sed -n '1,20p' "$missing_core_source_log" >&2
exit 1
fi
rm -f "$missing_core_source_log"
./list-linuxcnc-bridge-smoke-project-sources.sh >/dev/null
grep -Fx "core/src/linuxcnc_canon_bridge.cpp" \
< <(./list-linuxcnc-bridge-smoke-project-sources.sh linuxcnc_canon_bridge.cpp) >/dev/null
missing_bridge_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_bridge_smoke_project_source.XXXXXX.log")
bridge_smoke_source=$(./list-linuxcnc-bridge-smoke-project-sources.sh linuxcnc_canon_bridge.cpp)
grep -Fx "core/src/linuxcnc_canon_bridge.cpp" <<<"$bridge_smoke_source" >/dev/null
if ./list-linuxcnc-bridge-smoke-project-sources.sh does_not_exist.cc >"$missing_bridge_source_log" 2>&1; then
echo "LinuxCNC bridge smoke project source lister accepted missing source filter" >&2
exit 1
@@ -203,12 +309,10 @@ if ! grep -F "missing LinuxCNC bridge smoke project source in list: does_not_exi
sed -n '1,20p' "$missing_bridge_source_log" >&2
exit 1
fi
rm -f "$missing_bridge_source_log"
LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-support-objects.sh >/dev/null
grep -F "/src/objects/emc/rs274ngc/interpmodule.o" \
< <(LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-support-objects.sh interpmodule.o) >/dev/null
missing_support_object_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_linuxcnc_support_object.XXXXXX.log")
interpmodule_support_object=$(LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-support-objects.sh interpmodule.o)
grep -F "/src/objects/emc/rs274ngc/interpmodule.o" <<<"$interpmodule_support_object" >/dev/null
if LINUXCNC_ROOT="$missing_root" ./list-linuxcnc-source-support-objects.sh >"$missing_support_object_log" 2>&1; then
echo "LinuxCNC support object lister accepted missing LinuxCNC root: $missing_root" >&2
exit 1
@@ -227,10 +331,7 @@ if ! grep -F "missing LinuxCNC support object in list: does_not_exist.o" "$missi
sed -n '1,20p' "$missing_support_object_log" >&2
exit 1
fi
rm -f "$missing_support_object_log"
missing_source_manifest=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_syntax_missing_source_manifest.XXXXXX.txt")
missing_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_native_syntax_missing_source.XXXXXX.log")
printf 'core:src/emc/rs274ngc/does_not_exist.cc:test missing source\n' >"$missing_source_manifest"
if ./test-linuxcnc-source-syntax.sh "$missing_source_manifest" >"$missing_source_log" 2>&1; then
echo "test-linuxcnc-source-syntax.sh accepted missing manifest file" >&2
@@ -241,7 +342,6 @@ if ! grep -F "missing manifest file: src/emc/rs274ngc/does_not_exist.cc" "$missi
sed -n '1,20p' "$missing_source_log" >&2
exit 1
fi
rm -f "$missing_source_manifest" "$missing_source_log"
./test-native.sh
./test-linuxcnc-source-syntax.sh "$manifest"