按推荐建议,继续执行
结论:已为 LinuxCNC genserkins 增加 native runtime baseline,并保持 Go math 通过窄 C++ wrapper 复用 vendored gomath.c,完整 native 验证通过。
This commit is contained in:
@@ -29,7 +29,8 @@ semantic rewrites:
|
|||||||
| Python/remap | Python/remap hooks are stubbed at the runtime edge. |
|
| Python/remap | Python/remap hooks are stubbed at the runtime edge. |
|
||||||
| Dynamic interpreter path | `interp_base.cc` probe uses standalone `EMC2_HOME` compile-time path boundary. |
|
| Dynamic interpreter path | `interp_base.cc` probe uses standalone `EMC2_HOME` compile-time path boundary. |
|
||||||
| Realtime scheduler | TP probes seed deterministic status/config data instead of running LinuxCNC realtime process topology. |
|
| Realtime scheduler | TP probes seed deterministic status/config data instead of running LinuxCNC realtime process topology. |
|
||||||
| Kinematics component lifecycle | `trivkins.c`, `5axiskins.c`, and TRT switchkins modules are initialized through LinuxCNC module entry points while HAL component init/ready/exit, HAL pin allocation, and RTAPI module metadata are handled by standalone shims. |
|
| Kinematics component lifecycle | Kinematics modules are initialized through LinuxCNC module entry points where native runtime probes exist, while HAL component init/ready/exit, HAL pin allocation, and RTAPI module metadata are handled by standalone shims. |
|
||||||
|
| Go math C/C++ linkage | `genserkins` runtime probing compiles vendored `gomath.c` through a narrow C++ wrapper so LinuxCNC `genserfuncs.c` can link to the upstream Go math symbols without editing vendored source. |
|
||||||
| Browser storage | OPFS remains outside the native core and is not yet connected. |
|
| Browser storage | OPFS remains outside the native core and is not yet connected. |
|
||||||
|
|
||||||
## Enforced Non-Drift Rules
|
## Enforced Non-Drift Rules
|
||||||
@@ -51,8 +52,8 @@ semantic rewrites:
|
|||||||
serial, hexapod, pentapod, and related kinematics sources now have native
|
serial, hexapod, pentapod, and related kinematics sources now have native
|
||||||
source-probe coverage.
|
source-probe coverage.
|
||||||
- Full machine baselines beyond the current identity/trivial, `5axiskins`,
|
- Full machine baselines beyond the current identity/trivial, `5axiskins`,
|
||||||
TRT, delta, SCARA, PUMA, and other existing runtime probes are not
|
TRT, delta, SCARA, PUMA, serial `genserkins`, and other existing runtime
|
||||||
established.
|
probes are not established.
|
||||||
- Fixture expectations are currently checked against the standalone vendored
|
- Fixture expectations are currently checked against the standalone vendored
|
||||||
source path, not by running a native LinuxCNC binary for every fixture.
|
source path, not by running a native LinuxCNC binary for every fixture.
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ Current validation is intentionally mechanical:
|
|||||||
| Identity/trivial kinematics | `src/emc/kinematics/kinematics.h`, `cubic.h`, `kins_util.c`, `trivkins.c` | Copy unchanged | HAL component lifecycle and RTAPI module metadata are replaced by standalone shims; forward/inverse mapping behavior remains LinuxCNC source | Vendor byte sync, per-file source probes, `linuxcnc_kinematics_probe` |
|
| Identity/trivial kinematics | `src/emc/kinematics/kinematics.h`, `cubic.h`, `kins_util.c`, `trivkins.c` | Copy unchanged | HAL component lifecycle and RTAPI module metadata are replaced by standalone shims; forward/inverse mapping behavior remains LinuxCNC source | Vendor byte sync, per-file source probes, `linuxcnc_kinematics_probe` |
|
||||||
| Switchable 5-axis bridge kinematics | `src/emc/kinematics/5axiskins.c`, `switchkins.c`, `switchkins.h`, `userkfuncs.c`, plus `src/rtapi/rtapi_ctype.h` | Copy unchanged | HAL pin allocation, HAL component lifecycle, and RTAPI module metadata are standalone runtime edges; switchable 5-axis forward/inverse behavior remains LinuxCNC source | Vendor byte sync, per-file source probes, `linuxcnc_5axis_kinematics_probe` |
|
| Switchable 5-axis bridge kinematics | `src/emc/kinematics/5axiskins.c`, `switchkins.c`, `switchkins.h`, `userkfuncs.c`, plus `src/rtapi/rtapi_ctype.h` | Copy unchanged | HAL pin allocation, HAL component lifecycle, and RTAPI module metadata are standalone runtime edges; switchable 5-axis forward/inverse behavior remains LinuxCNC source | Vendor byte sync, per-file source probes, `linuxcnc_5axis_kinematics_probe` |
|
||||||
| TRT table-rotary kinematics | `src/emc/kinematics/trtfuncs.c`, `xyzac-trt-kins.c`, `xyzbc-trt-kins.c` | Copy unchanged | HAL pin allocation and switchkins lifecycle stay runtime boundaries; XYZAC/XYZBC TRT forward/inverse behavior remains LinuxCNC source | Vendor byte sync, per-file source probes, `linuxcnc_xyzac_trt_kinematics_probe`, `linuxcnc_xyzbc_trt_kinematics_probe` |
|
| TRT table-rotary kinematics | `src/emc/kinematics/trtfuncs.c`, `xyzac-trt-kins.c`, `xyzbc-trt-kins.c` | Copy unchanged | HAL pin allocation and switchkins lifecycle stay runtime boundaries; XYZAC/XYZBC TRT forward/inverse behavior remains LinuxCNC source | Vendor byte sync, per-file source probes, `linuxcnc_xyzac_trt_kinematics_probe`, `linuxcnc_xyzbc_trt_kinematics_probe` |
|
||||||
| Additional non-switchable kinematics | `src/emc/kinematics/corexykins.c`, `rotatekins.c`, `rosekins.c`, `maxkins.c`, `lineardeltakins.c`, `lineardeltakins-common.h`, `rotarydeltakins.c`, `rotarydeltakins-common.h`, `scorbot-kins.c`, `tripodkins.c`, `scarakins.c`, `pumakins.c`, `pumakins.h`, `genhexkins.c`, `genhexkins.h`, `genserfuncs.c`, `genserkins.c`, `genserkins.h`, `ugenserkins.c`, `pentakins.c`, `pentakins.h`, `cubic.c` | Copy unchanged | HAL pin allocation, HAL parameter allocation, HAL component lifecycle, RTAPI module metadata, and userspace test-program process entry remain standalone runtime edges; forward/inverse behavior remains LinuxCNC source where the module exposes it | Vendor byte sync, per-file source probes, `linuxcnc_corexy_kinematics_probe`, `linuxcnc_rotate_kinematics_probe`, `linuxcnc_rose_kinematics_probe`, `linuxcnc_max_kinematics_probe`, `linuxcnc_lineardelta_kinematics_probe`, `linuxcnc_rotarydelta_kinematics_probe`, `linuxcnc_scorbot_kinematics_probe`, `linuxcnc_tripod_kinematics_probe`, `linuxcnc_scara_kinematics_probe`, `linuxcnc_puma_kinematics_probe` |
|
| Additional non-switchable kinematics | `src/emc/kinematics/corexykins.c`, `rotatekins.c`, `rosekins.c`, `maxkins.c`, `lineardeltakins.c`, `lineardeltakins-common.h`, `rotarydeltakins.c`, `rotarydeltakins-common.h`, `scorbot-kins.c`, `tripodkins.c`, `scarakins.c`, `pumakins.c`, `pumakins.h`, `genhexkins.c`, `genhexkins.h`, `genserfuncs.c`, `genserkins.c`, `genserkins.h`, `ugenserkins.c`, `pentakins.c`, `pentakins.h`, `cubic.c` | Copy unchanged | HAL pin allocation, HAL parameter allocation, HAL component lifecycle, RTAPI module metadata, Go math C/C++ linkage, and userspace test-program process entry remain standalone runtime edges; forward/inverse behavior remains LinuxCNC source where the module exposes it | Vendor byte sync, per-file source probes, `linuxcnc_corexy_kinematics_probe`, `linuxcnc_rotate_kinematics_probe`, `linuxcnc_rose_kinematics_probe`, `linuxcnc_max_kinematics_probe`, `linuxcnc_lineardelta_kinematics_probe`, `linuxcnc_rotarydelta_kinematics_probe`, `linuxcnc_scorbot_kinematics_probe`, `linuxcnc_tripod_kinematics_probe`, `linuxcnc_scara_kinematics_probe`, `linuxcnc_puma_kinematics_probe`, `linuxcnc_genser_kinematics_probe` |
|
||||||
| Trajectory planner | `src/emc/tp/tp.c`, `tc.c`, `tcq.c`, `spherical_arc.c`, `blendmath.c`, `sp_scurve.c`, `ruckig_wrapper.c`, plus matching `*.h` files | Copy unchanged | Native realtime scheduling and motion process state are replaced by standalone probe setup | Vendor byte sync, per-file source probes, `linuxcnc_tp_api_probe` |
|
| Trajectory planner | `src/emc/tp/tp.c`, `tc.c`, `tcq.c`, `spherical_arc.c`, `blendmath.c`, `sp_scurve.c`, `ruckig_wrapper.c`, plus matching `*.h` files | Copy unchanged | Native realtime scheduling and motion process state are replaced by standalone probe setup | Vendor byte sync, per-file source probes, `linuxcnc_tp_api_probe` |
|
||||||
| Ruckig C planner support | Selected `src/emc/tp/cruckig/*.c` and `*.h` files in the manifest | Copy unchanged | Used as LinuxCNC planner support code through vendored TP sources | Vendor byte sync, per-file source probes |
|
| Ruckig C planner support | Selected `src/emc/tp/cruckig/*.c` and `*.h` files in the manifest | Copy unchanged | Used as LinuxCNC planner support code through vendored TP sources | Vendor byte sync, per-file source probes |
|
||||||
| Posemath | `src/libnml/posemath/posemath.cc`, `_posemath.c`, `gomath.c`, `sincos.c`, and matching headers | Copy unchanged | `gomath.c` is compiled as C; `rtapi.h` shim is C/C++ compatible for this boundary | Vendor byte sync, per-file source probes, TP probe |
|
| Posemath | `src/libnml/posemath/posemath.cc`, `_posemath.c`, `gomath.c`, `sincos.c`, and matching headers | Copy unchanged | `gomath.c` is compiled as C; `rtapi.h` shim is C/C++ compatible for this boundary | Vendor byte sync, per-file source probes, TP probe |
|
||||||
@@ -63,8 +63,9 @@ Current validation is intentionally mechanical:
|
|||||||
## Known Gaps
|
## Known Gaps
|
||||||
|
|
||||||
- Additional non-trivial kinematics implementation files are now extracted at
|
- Additional non-trivial kinematics implementation files are now extracted at
|
||||||
source-probe level. Full runtime machine baselines for serial, hexapod,
|
source-probe level. Serial `genserkins` has a native runtime baseline; full
|
||||||
pentapod, and userspace genser flows are not yet established.
|
runtime machine baselines for hexapod, pentapod, and userspace genser flows
|
||||||
|
are not yet established.
|
||||||
- Browser/WASM C ABI and JS SDK layers are not yet built for the full
|
- Browser/WASM C ABI and JS SDK layers are not yet built for the full
|
||||||
interpreter/planner core.
|
interpreter/planner core.
|
||||||
- OPFS persistence is not yet connected to INI, tool table, parameter file, or
|
- OPFS persistence is not yet connected to INI, tool table, parameter file, or
|
||||||
|
|||||||
@@ -0,0 +1,120 @@
|
|||||||
|
#include <cmath>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "emc/kinematics/kinematics.h"
|
||||||
|
#include "emc/motion/emcmotcfg.h"
|
||||||
|
|
||||||
|
int rtapi_app_main(void);
|
||||||
|
void rtapi_app_exit(void);
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
int near(double actual, double expected)
|
||||||
|
{
|
||||||
|
return std::fabs(actual - expected) < 1e-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
int near_joints(const double *actual, const double *expected)
|
||||||
|
{
|
||||||
|
for (int index = 0; index < 6; ++index) {
|
||||||
|
if (!near(actual[index], expected[index])) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int near_identity_pose(const EmcPose &actual, const double *joints)
|
||||||
|
{
|
||||||
|
return near(actual.tran.x, joints[0]) &&
|
||||||
|
near(actual.tran.y, joints[1]) &&
|
||||||
|
near(actual.tran.z, joints[2]) &&
|
||||||
|
near(actual.a, joints[3]) &&
|
||||||
|
near(actual.b, joints[4]) &&
|
||||||
|
near(actual.c, joints[5]) &&
|
||||||
|
near(actual.u, joints[6]) &&
|
||||||
|
near(actual.v, joints[7]) &&
|
||||||
|
near(actual.w, joints[8]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_pose(const char *prefix, const EmcPose &pose)
|
||||||
|
{
|
||||||
|
std::cout << prefix << "_xyz="
|
||||||
|
<< pose.tran.x << ","
|
||||||
|
<< pose.tran.y << ","
|
||||||
|
<< pose.tran.z << "\n";
|
||||||
|
std::cout << prefix << "_abcuvw="
|
||||||
|
<< pose.a << ","
|
||||||
|
<< pose.b << ","
|
||||||
|
<< pose.c << ","
|
||||||
|
<< pose.u << ","
|
||||||
|
<< pose.v << ","
|
||||||
|
<< pose.w << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_joints(const char *prefix, const double *joints)
|
||||||
|
{
|
||||||
|
std::cout << prefix << "_xyzabcuvw="
|
||||||
|
<< joints[0] << ","
|
||||||
|
<< joints[1] << ","
|
||||||
|
<< joints[2] << ","
|
||||||
|
<< joints[3] << ","
|
||||||
|
<< joints[4] << ","
|
||||||
|
<< joints[5] << ","
|
||||||
|
<< joints[6] << ","
|
||||||
|
<< joints[7] << ","
|
||||||
|
<< joints[8] << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
const int init_rc = rtapi_app_main();
|
||||||
|
std::cout << "genser_init=" << init_rc << "\n";
|
||||||
|
std::cout << "genser_type=" << kinematicsType() << "\n";
|
||||||
|
std::cout << "genser_switchable=" << kinematicsSwitchable() << "\n";
|
||||||
|
|
||||||
|
double joints[EMCMOT_MAX_JOINTS]{};
|
||||||
|
joints[0] = 10.0;
|
||||||
|
joints[1] = -15.0;
|
||||||
|
joints[2] = 20.0;
|
||||||
|
joints[3] = 5.0;
|
||||||
|
joints[4] = -10.0;
|
||||||
|
joints[5] = 12.0;
|
||||||
|
joints[6] = 7.0;
|
||||||
|
joints[7] = 8.0;
|
||||||
|
joints[8] = 9.0;
|
||||||
|
|
||||||
|
KINEMATICS_FORWARD_FLAGS fflags = 0;
|
||||||
|
KINEMATICS_INVERSE_FLAGS iflags = 0;
|
||||||
|
EmcPose forward_pose{};
|
||||||
|
const int forward_rc = kinematicsForward(joints, &forward_pose, &fflags, &iflags);
|
||||||
|
std::cout << "genser_forward=" << forward_rc << "\n";
|
||||||
|
print_pose("genser_forward", forward_pose);
|
||||||
|
|
||||||
|
double inverse_joints[EMCMOT_MAX_JOINTS]{};
|
||||||
|
for (int index = 0; index < EMCMOT_MAX_JOINTS; ++index) {
|
||||||
|
inverse_joints[index] = joints[index];
|
||||||
|
}
|
||||||
|
const int inverse_rc = kinematicsInverse(&forward_pose, inverse_joints, &iflags, &fflags);
|
||||||
|
std::cout << "genser_inverse=" << inverse_rc << "\n";
|
||||||
|
print_joints("genser_inverse", inverse_joints);
|
||||||
|
std::cout << "genser_roundtrip_joints=" << near_joints(inverse_joints, joints) << "\n";
|
||||||
|
std::cout << "genser_roundtrip_uvw="
|
||||||
|
<< (near(inverse_joints[6], joints[6]) &&
|
||||||
|
near(inverse_joints[7], joints[7]) &&
|
||||||
|
near(inverse_joints[8], joints[8]))
|
||||||
|
<< "\n";
|
||||||
|
|
||||||
|
const int switch_rc = kinematicsSwitch(1);
|
||||||
|
std::cout << "genser_switch_identity=" << switch_rc << "\n";
|
||||||
|
EmcPose identity_pose{};
|
||||||
|
const int identity_forward_rc = kinematicsForward(joints, &identity_pose, &fflags, &iflags);
|
||||||
|
std::cout << "genser_identity_forward=" << identity_forward_rc << "\n";
|
||||||
|
print_pose("genser_identity", identity_pose);
|
||||||
|
std::cout << "genser_identity_near=" << near_identity_pose(identity_pose, joints) << "\n";
|
||||||
|
|
||||||
|
rtapi_app_exit();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "libnml/posemath/gomath.c"
|
||||||
@@ -107,6 +107,8 @@ check_exitcode linuxcnc_scara_kinematics_probe
|
|||||||
check_exitcode linuxcnc_scara_kinematics_probe.run
|
check_exitcode linuxcnc_scara_kinematics_probe.run
|
||||||
check_exitcode linuxcnc_puma_kinematics_probe
|
check_exitcode linuxcnc_puma_kinematics_probe
|
||||||
check_exitcode linuxcnc_puma_kinematics_probe.run
|
check_exitcode linuxcnc_puma_kinematics_probe.run
|
||||||
|
check_exitcode linuxcnc_genser_kinematics_probe
|
||||||
|
check_exitcode linuxcnc_genser_kinematics_probe.run
|
||||||
for name in \
|
for name in \
|
||||||
linuxcnc_tp_tp_source_probe \
|
linuxcnc_tp_tp_source_probe \
|
||||||
linuxcnc_tp_tc_source_probe \
|
linuxcnc_tp_tc_source_probe \
|
||||||
@@ -393,6 +395,18 @@ grep -Fq "puma_switch_identity=0" "$PUMA_KINEMATICS_STDOUT"
|
|||||||
grep -Fq "puma_identity_forward=0" "$PUMA_KINEMATICS_STDOUT"
|
grep -Fq "puma_identity_forward=0" "$PUMA_KINEMATICS_STDOUT"
|
||||||
grep -Fq "puma_identity_near=1" "$PUMA_KINEMATICS_STDOUT"
|
grep -Fq "puma_identity_near=1" "$PUMA_KINEMATICS_STDOUT"
|
||||||
|
|
||||||
|
GENSER_KINEMATICS_STDOUT="$BUILD_DIR/linuxcnc_genser_kinematics_probe.run.stdout.log"
|
||||||
|
grep -Fq "genser_init=0" "$GENSER_KINEMATICS_STDOUT"
|
||||||
|
grep -Fq "genser_type=4" "$GENSER_KINEMATICS_STDOUT"
|
||||||
|
grep -Fq "genser_switchable=1" "$GENSER_KINEMATICS_STDOUT"
|
||||||
|
grep -Fq "genser_forward=0" "$GENSER_KINEMATICS_STDOUT"
|
||||||
|
grep -Fq "genser_inverse=0" "$GENSER_KINEMATICS_STDOUT"
|
||||||
|
grep -Fq "genser_roundtrip_joints=1" "$GENSER_KINEMATICS_STDOUT"
|
||||||
|
grep -Fq "genser_roundtrip_uvw=1" "$GENSER_KINEMATICS_STDOUT"
|
||||||
|
grep -Fq "genser_switch_identity=0" "$GENSER_KINEMATICS_STDOUT"
|
||||||
|
grep -Fq "genser_identity_forward=0" "$GENSER_KINEMATICS_STDOUT"
|
||||||
|
grep -Fq "genser_identity_near=1" "$GENSER_KINEMATICS_STDOUT"
|
||||||
|
|
||||||
check_fixture_output() {
|
check_fixture_output() {
|
||||||
local fixture="$1"
|
local fixture="$1"
|
||||||
local expected="$2"
|
local expected="$2"
|
||||||
|
|||||||
@@ -451,6 +451,18 @@ PUMA_KINEMATICS_PROBE_SOURCES=(
|
|||||||
"$WRAP_DIR/linuxcnc_puma_kinematics_probe.cpp"
|
"$WRAP_DIR/linuxcnc_puma_kinematics_probe.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
GENSER_KINEMATICS_PROBE_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/genserfuncs.c"
|
||||||
|
"$VENDOR_DIR/src/emc/kinematics/genserkins.c"
|
||||||
|
"$WRAP_DIR/linuxcnc_gomath_cxx.cpp"
|
||||||
|
"$VENDOR_DIR/src/libnml/posemath/sincos.c"
|
||||||
|
"$WRAP_DIR/linuxcnc_hal_adapter.cpp"
|
||||||
|
"$WRAP_DIR/linuxcnc_genser_kinematics_probe.cpp"
|
||||||
|
)
|
||||||
|
|
||||||
TP_CORE_SOURCES=(
|
TP_CORE_SOURCES=(
|
||||||
"$VENDOR_DIR/src/emc/tp/tp.c"
|
"$VENDOR_DIR/src/emc/tp/tp.c"
|
||||||
"$VENDOR_DIR/src/emc/tp/tc.c"
|
"$VENDOR_DIR/src/emc/tp/tc.c"
|
||||||
@@ -722,6 +734,13 @@ build_binary_target \
|
|||||||
PUMA_KINEMATICS_PROBE_SOURCES \
|
PUMA_KINEMATICS_PROBE_SOURCES \
|
||||||
NO_LINK_FLAGS
|
NO_LINK_FLAGS
|
||||||
|
|
||||||
|
build_binary_target \
|
||||||
|
linuxcnc_genser_kinematics_probe \
|
||||||
|
"$BUILD_DIR/linuxcnc_genser_kinematics_probe" \
|
||||||
|
TP_FLAGS \
|
||||||
|
GENSER_KINEMATICS_PROBE_SOURCES \
|
||||||
|
NO_LINK_FLAGS
|
||||||
|
|
||||||
if [[ "$(tr -d '[:space:]' < "$BUILD_DIR/linuxcnc_kinematics_probe.exitcode")" == "0" ]]; then
|
if [[ "$(tr -d '[:space:]' < "$BUILD_DIR/linuxcnc_kinematics_probe.exitcode")" == "0" ]]; then
|
||||||
set +e
|
set +e
|
||||||
"$BUILD_DIR/linuxcnc_kinematics_probe" \
|
"$BUILD_DIR/linuxcnc_kinematics_probe" \
|
||||||
@@ -932,6 +951,21 @@ else
|
|||||||
"$BUILD_DIR/linuxcnc_puma_kinematics_probe.run.stderr.log"
|
"$BUILD_DIR/linuxcnc_puma_kinematics_probe.run.stderr.log"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ "$(tr -d '[:space:]' < "$BUILD_DIR/linuxcnc_genser_kinematics_probe.exitcode")" == "0" ]]; then
|
||||||
|
set +e
|
||||||
|
"$BUILD_DIR/linuxcnc_genser_kinematics_probe" \
|
||||||
|
>"$BUILD_DIR/linuxcnc_genser_kinematics_probe.run.stdout.log" \
|
||||||
|
2>"$BUILD_DIR/linuxcnc_genser_kinematics_probe.run.stderr.log"
|
||||||
|
GENSER_KINEMATICS_RUN_RC=$?
|
||||||
|
set -e
|
||||||
|
echo "$GENSER_KINEMATICS_RUN_RC" > "$BUILD_DIR/linuxcnc_genser_kinematics_probe.run.exitcode"
|
||||||
|
else
|
||||||
|
rm -f \
|
||||||
|
"$BUILD_DIR/linuxcnc_genser_kinematics_probe.run.exitcode" \
|
||||||
|
"$BUILD_DIR/linuxcnc_genser_kinematics_probe.run.stdout.log" \
|
||||||
|
"$BUILD_DIR/linuxcnc_genser_kinematics_probe.run.stderr.log"
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ "$(tr -d '[:space:]' < "$BUILD_DIR/linuxcnc_tp_api_probe.exitcode")" == "0" ]]; then
|
if [[ "$(tr -d '[:space:]' < "$BUILD_DIR/linuxcnc_tp_api_probe.exitcode")" == "0" ]]; then
|
||||||
set +e
|
set +e
|
||||||
"$BUILD_DIR/linuxcnc_tp_api_probe" \
|
"$BUILD_DIR/linuxcnc_tp_api_probe" \
|
||||||
|
|||||||
Reference in New Issue
Block a user