转向直接移植LinuxCNC源程序

结论:明确禁止继续扩展自写 CNC 主体语义,最小 runtime 仅保留为迁移探针;新增 interp_convert.cc 源码直连编译探针,并以最小 emcStatus 状态边界 shim 暴露 native runtime 阻塞点。检查:git diff --check 通过;wasm-port/tests/native/verify_native_probes.sh 通过,linuxcnc_interp_convert_source_probe exitcode=0。
This commit is contained in:
cnc
2026-06-06 23:13:44 +08:00
parent 15b04e8758
commit fb8d8b2d9d
7 changed files with 93 additions and 12 deletions

View File

@@ -19,6 +19,17 @@ Build a standalone CNC simulation system that:
- does not drive real hardware; - does not drive real hardware;
- preserves LinuxCNC software behavior as closely as practical. - preserves LinuxCNC software behavior as closely as practical.
## Current Direction
The migration target is the LinuxCNC source program itself, adapted to run as
the standalone WASM simulation program. The project must not evolve a
project-authored interpreter, planner, or CNC semantics layer now that the
porting harness is running.
Existing minimal runtime wrappers are migration probes only. They are allowed
to expose, compile, and validate vendored LinuxCNC code, but they must not be
expanded into a separate implementation of G-code behavior.
## Repository Boundaries ## Repository Boundaries
1. `../linuxcnc/` is upstream and must be treated as read-only input for the 1. `../linuxcnc/` is upstream and must be treated as read-only input for the
@@ -33,21 +44,24 @@ Build a standalone CNC simulation system that:
## Engineering Rules ## Engineering Rules
1. Reuse LinuxCNC source before reimplementing any CNC logic. 1. Reuse LinuxCNC source before reimplementing any CNC logic.
2. Prefer wrappers, shims, and extraction scripts over invasive source edits. 2. Do not add new project-authored CNC semantics when LinuxCNC source exists.
3. Preserve LinuxCNC semantics for: Replace temporary wrapper behavior with direct calls into vendored LinuxCNC
source, or with the narrowest shims needed to make those calls compile.
3. Prefer wrappers, shims, and extraction scripts over invasive source edits.
4. Preserve LinuxCNC semantics for:
- G-code execution; - G-code execution;
- modal state; - modal state;
- parameter and variable behavior; - parameter and variable behavior;
- kinematics; - kinematics;
- planner behavior; - planner behavior;
- machine and controller state visible to software. - machine and controller state visible to software.
4. Replace only the native runtime edges: 5. Replace only the native runtime edges:
- file IO; - file IO;
- process model; - process model;
- HAL runtime; - HAL runtime;
- IPC; - IPC;
- GUI. - GUI.
5. Frontend code must be implemented with web technology, not migrated from 6. Frontend code must be implemented with web technology, not migrated from
native GUI code. native GUI code.
## Required Layout ## Required Layout

View File

@@ -38,6 +38,8 @@ Use this skill when the work involves any of the following:
4. Native runtime dependencies are replaced at the edges, not copied whole. 4. Native runtime dependencies are replaced at the edges, not copied whole.
5. Machine state and controller-visible behavior are first-class compatibility 5. Machine state and controller-visible behavior are first-class compatibility
targets, not optional nice-to-haves. targets, not optional nice-to-haves.
6. Do not continue building a project-authored CNC program once the porting
harness runs; move behavior back to vendored LinuxCNC source functions.
## Source Reuse Priorities ## Source Reuse Priorities
@@ -96,6 +98,16 @@ Preferred order of work:
6. Build the WASM export layer second. 6. Build the WASM export layer second.
7. Build the JS SDK and HTML frontend last. 7. Build the JS SDK and HTML frontend last.
Current migration emphasis:
- Treat `linuxcnc_interp_minimal_runtime.cpp` as a temporary probe surface.
- Retire hand-written `convert_g()` behavior by linking and calling vendored
LinuxCNC interpreter conversion code.
- Add shims only for host/runtime edges that prevent vendored LinuxCNC source
from compiling.
- Do not add new G-code behavior in JavaScript or in standalone C++ wrappers
except as a short-lived adapter around LinuxCNC code.
## Filesystem And Browser Guidance ## Filesystem And Browser Guidance
For browser use: For browser use:

View File

@@ -371,7 +371,18 @@ Current verified progress:
`interp_convert.cc::convert_straight()` and `interp_convert.cc::convert_straight()` and
`rs274ngc_return.hh::NCE_CANNOT_DO_G1_WITH_ZERO_FEED_RATE`. `rs274ngc_return.hh::NCE_CANNOT_DO_G1_WITH_ZERO_FEED_RATE`.
- This proves the current extracted interpreter slice can parse and execute a - This proves the current extracted interpreter slice can parse and execute a
simple traverse and feed move through a standalone canonical event sink. small fixture set through a standalone canonical event sink.
- Important direction change: the minimal wrapper behavior is a migration
probe, not the program body. Do not expand it into a separate CNC
implementation. The next work must retire hand-written wrapper semantics and
move execution through vendored LinuxCNC interpreter source such as
`interp_convert.cc`, `interp_read.cc`, `interp_check.cc`, and
`interp_execute.cc`.
- `tools/build_native_probes.sh` now includes
`linuxcnc_interp_convert_source_probe`, which directly compiles vendored
`interp_convert.cc`. The required `emcStatus` shim is limited to the native
status boundary used by `tag_arc()` for machine units; it is not a
project-authored CNC behavior implementation.
## Phase 4: Port INI Parsing Without Editing Upstream ## Phase 4: Port INI Parsing Without Editing Upstream
@@ -670,9 +681,11 @@ Keep these documents under `wasm-port/docs/`:
Continue expanding the standalone interpreter core from the verified minimal Continue expanding the standalone interpreter core from the verified minimal
traverse path: traverse path:
1. replace the temporary minimal `convert_g()` implementation with thin 1. replace the temporary minimal `convert_g()` implementation with calls into
wrappers around more vendored interpreter conversion code, vendored LinuxCNC interpreter conversion code.
2. add `_x`/`_y`/`_z` named parameter fixture coverage and align it with 2. identify and shim the native runtime symbols blocking direct compilation of
`#5420`/`#5421`/`#5422`, `interp_convert.cc`, `interp_execute.cc`, and related interpreter files.
3. keep all source changes inside `wasm-port/` and leave `../linuxcnc/` 3. keep fixture coverage as regression protection while deleting temporary
hand-written semantics.
4. keep all source changes inside `wasm-port/` and leave `../linuxcnc/`
read-only. read-only.

View File

@@ -0,0 +1,4 @@
#include "nml_intf/emc.hh"
static EMC_STAT standalone_emc_status;
EMC_STAT *emcStatus = &standalone_emc_status;

View File

@@ -1,7 +1,18 @@
#pragma once #pragma once
// Minimal shim for the standalone INI parser build. // Minimal shim for standalone interpreter source probes.
enum EmcJointType : int { enum EmcJointType : int {
EMC_LINEAR = 1, EMC_LINEAR = 1,
EMC_ANGULAR = 2, EMC_ANGULAR = 2,
}; };
class EMC_STAT {
public:
struct Motion {
struct Traj {
double linearUnits = 1.0;
} traj;
} motion;
};
extern EMC_STAT *emcStatus;

View File

@@ -35,6 +35,7 @@ check_exitcode linuxcnc_namedparam_harness
check_exitcode linuxcnc_interp_minimal_harness check_exitcode linuxcnc_interp_minimal_harness
check_exitcode linuxcnc_interp_minimal_harness.run check_exitcode linuxcnc_interp_minimal_harness.run
check_exitcode linuxcnc_rs274_compile_probe check_exitcode linuxcnc_rs274_compile_probe
check_exitcode linuxcnc_interp_convert_source_probe
check_fixture_output() { check_fixture_output() {
local fixture="$1" local fixture="$1"

View File

@@ -31,7 +31,11 @@ rm -f \
"$BUILD_DIR/linuxcnc_rs274_compile_probe.o" \ "$BUILD_DIR/linuxcnc_rs274_compile_probe.o" \
"$BUILD_DIR/linuxcnc_rs274_compile_probe.exitcode" \ "$BUILD_DIR/linuxcnc_rs274_compile_probe.exitcode" \
"$BUILD_DIR/linuxcnc_rs274_compile_probe.stdout.log" \ "$BUILD_DIR/linuxcnc_rs274_compile_probe.stdout.log" \
"$BUILD_DIR/linuxcnc_rs274_compile_probe.stderr.log" "$BUILD_DIR/linuxcnc_rs274_compile_probe.stderr.log" \
"$BUILD_DIR/linuxcnc_interp_convert_source_probe.o" \
"$BUILD_DIR/linuxcnc_interp_convert_source_probe.exitcode" \
"$BUILD_DIR/linuxcnc_interp_convert_source_probe.stdout.log" \
"$BUILD_DIR/linuxcnc_interp_convert_source_probe.stderr.log"
g++ -std=c++20 -O2 \ g++ -std=c++20 -O2 \
-D_GNU_SOURCE \ -D_GNU_SOURCE \
@@ -160,4 +164,26 @@ RS274_RC=$?
set -e set -e
echo "$RS274_RC" > "$BUILD_DIR/linuxcnc_rs274_compile_probe.exitcode" echo "$RS274_RC" > "$BUILD_DIR/linuxcnc_rs274_compile_probe.exitcode"
set +e
g++ -std=c++20 -O2 \
-D_GNU_SOURCE \
-DM_PI=3.14159265358979323846 \
-DOBJECT_FWD_DWA2002724_HPP \
-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/libnml/posemath" \
-c "$VENDOR_DIR/src/emc/rs274ngc/interp_convert.cc" \
-o "$BUILD_DIR/linuxcnc_interp_convert_source_probe.o" \
>"$BUILD_DIR/linuxcnc_interp_convert_source_probe.stdout.log" \
2>"$BUILD_DIR/linuxcnc_interp_convert_source_probe.stderr.log"
CONVERT_SOURCE_RC=$?
set -e
echo "$CONVERT_SOURCE_RC" > "$BUILD_DIR/linuxcnc_interp_convert_source_probe.exitcode"
echo "native probes complete" echo "native probes complete"