Files
wasm-simulator/test-all-native.sh
cnc aaa2573bba 参考所有分组,完成尽量多的内容。禁止顺手扩功能 smoke
结论:补齐 check-linuxcnc-inputs-cached.sh 的 cache-dir 入口拒绝守卫,锁住缺失 cache-dir 值和空白预检缓存目录,不新增 CNC 行为或 smoke 功能。
2026-06-03 20:57:15 +08:00

1752 lines
112 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
# LinuxCNC source basis: all-native guardrails lock source-backed manifests,
# probe wrappers, switchkins/remap generation, OPFS policy, and LinuxCNC
# source-link build constraints without adding CNC interpreter behavior.
manifest=${1:-linuxcnc-rs274-source-files.txt}
linuxcnc_root=${LINUXCNC_ROOT:-../linuxcnc}
guardrails_only=${CNC_SIM_ALL_NATIVE_GUARDRAILS_ONLY:-0}
if [[ "$guardrails_only" != "0" && "$guardrails_only" != "1" ]]; then
echo "CNC_SIM_ALL_NATIVE_GUARDRAILS_ONLY must be 0 or 1: $guardrails_only" >&2
exit 1
fi
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")
escaped_project_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_escaped_project_source.XXXXXX.log")
invalid_source_filter_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_invalid_source_filter.XXXXXX.log")
missing_cmake_set_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_cmake_set.XXXXXX.log")
missing_cmake_append_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_missing_cmake_append.XXXXXX.log")
invalid_cmake_set_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_invalid_cmake_set.XXXXXX.log")
escaped_cmake_prefix_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_escaped_cmake_prefix.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")
kinematics_unknown_filter_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_kinematics_manifest_unknown_filter.XXXXXX.log")
kinematics_unknown_output_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_kinematics_manifest_unknown_output.XXXXXX.log")
inputs_cached_missing_cache_dir_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_inputs_cached_missing_cache_dir.XXXXXX.log")
inputs_cached_whitespace_cache_dir_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_inputs_cached_whitespace_cache_dir.XXXXXX.log")
switchkins_checker_unknown_option_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_switchkins_checker_unknown_option.XXXXXX.log")
switchkins_checker_too_many_args_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_switchkins_checker_too_many_args.XXXXXX.log")
switchkins_cached_missing_cache_dir_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_switchkins_cached_missing_cache_dir.XXXXXX.log")
switchkins_cached_whitespace_cache_dir_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_switchkins_cached_whitespace_cache_dir.XXXXXX.log")
switchkins_generator_unknown_option_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_switchkins_generator_unknown_option.XXXXXX.log")
switchkins_generator_missing_output_dir_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_switchkins_generator_missing_output_dir.XXXXXX.log")
switchkins_generator_too_many_args_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_switchkins_generator_too_many_args.XXXXXX.log")
switchkins_generator_whitespace_output_dir_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_switchkins_generator_whitespace_output_dir.XXXXXX.log")
puma560_dh_unknown_option_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_puma560_dh_unknown_option.XXXXXX.log")
puma560_dh_too_many_args_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_puma560_dh_too_many_args.XXXXXX.log")
puma560_dh_escaped_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_puma560_dh_escaped_source.XXXXXX.log")
puma560_dh_non_hal_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_puma560_dh_non_hal_source.XXXXXX.log")
source_files_missing_message_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_source_files_missing_message.XXXXXX.log")
source_files_unknown_option_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_source_files_unknown_option.XXXXXX.log")
source_files_escaped_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_source_files_escaped_source.XXXXXX.log")
source_cxxflag_unknown_option_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_source_cxxflag_unknown_option.XXXXXX.log")
wasm_cxxflag_missing_profile_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_wasm_cxxflag_missing_profile.XXXXXX.log")
wasm_cxxflag_unknown_option_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_wasm_cxxflag_unknown_option.XXXXXX.log")
wasm_cxxflag_unknown_profile_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_wasm_cxxflag_unknown_profile.XXXXXX.log")
bad_line_manifest=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_bad_manifest_line.XXXXXX.txt")
bad_line_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_bad_manifest_line.XXXXXX.log")
absolute_source_manifest=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_absolute_manifest_source.XXXXXX.txt")
absolute_source_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_absolute_manifest_source.XXXXXX.log")
invalid_build_jobs_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_invalid_build_jobs.XXXXXX.log")
invalid_build_dir_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_invalid_build_dir.XXXXXX.log")
empty_build_dir_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_empty_build_dir.XXXXXX.log")
whitespace_build_dir_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_whitespace_build_dir.XXXXXX.log")
invalid_node_smoke_min_steps_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_invalid_node_smoke_min_steps.XXXXXX.log")
invalid_browser_smoke_min_sections_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_invalid_browser_smoke_min_sections.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" \
"$escaped_project_source_log" \
"$invalid_source_filter_log" \
"$missing_cmake_set_log" \
"$missing_cmake_append_log" \
"$invalid_cmake_set_log" \
"$escaped_cmake_prefix_log" \
"$missing_support_object_log" \
"$missing_source_manifest" \
"$missing_source_log" \
"$kinematics_unknown_filter_log" \
"$kinematics_unknown_output_log" \
"$inputs_cached_missing_cache_dir_log" \
"$inputs_cached_whitespace_cache_dir_log" \
"$switchkins_checker_unknown_option_log" \
"$switchkins_checker_too_many_args_log" \
"$switchkins_cached_missing_cache_dir_log" \
"$switchkins_cached_whitespace_cache_dir_log" \
"$switchkins_generator_unknown_option_log" \
"$switchkins_generator_missing_output_dir_log" \
"$switchkins_generator_too_many_args_log" \
"$switchkins_generator_whitespace_output_dir_log" \
"$puma560_dh_unknown_option_log" \
"$puma560_dh_too_many_args_log" \
"$puma560_dh_escaped_source_log" \
"$puma560_dh_non_hal_source_log" \
"$source_files_missing_message_log" \
"$source_files_unknown_option_log" \
"$source_files_escaped_source_log" \
"$source_cxxflag_unknown_option_log" \
"$wasm_cxxflag_missing_profile_log" \
"$wasm_cxxflag_unknown_option_log" \
"$wasm_cxxflag_unknown_profile_log" \
"$bad_line_manifest" \
"$bad_line_log" \
"$absolute_source_manifest" \
"$absolute_source_log" \
"$invalid_build_jobs_log" \
"$invalid_build_dir_log" \
"$empty_build_dir_log" \
"$whitespace_build_dir_log" \
"$invalid_node_smoke_min_steps_log" \
"$invalid_browser_smoke_min_sections_log"
}
trap cleanup_native_test_temps EXIT
grep -Fx 'trap cleanup_native_test_temps EXIT' test-all-native.sh >/dev/null
grep -F 'guardrails_only=${CNC_SIM_ALL_NATIVE_GUARDRAILS_ONLY:-0}' test-all-native.sh >/dev/null
grep -F 'CNC_SIM_ALL_NATIVE_GUARDRAILS_ONLY must be 0 or 1: $guardrails_only' test-all-native.sh >/dev/null
grep -F 'all native guardrail checks passed' test-all-native.sh >/dev/null
grep -F 'LinuxCNC source basis: the wasm build preflights and compiles the' build-wasm.sh >/dev/null
grep -F 'LinuxCNC source basis: manifest validation checks LinuxCNC-root relative' check-linuxcnc-inputs.sh >/dev/null
grep -F 'LinuxCNC source basis: the cached input checker keys check-linuxcnc-inputs.sh' check-linuxcnc-inputs-cached.sh >/dev/null
grep -F 'LinuxCNC source basis: switchkins/remap table validation derives M428/M429/M430' check-linuxcnc-switchkins-remap-table.sh >/dev/null
grep -F 'LINUXCNC_ROOT="$linuxcnc_root" ./check-linuxcnc-inputs-cached.sh "$manifest"' check-linuxcnc-switchkins-remap-table.sh >/dev/null
grep -F 'missing LinuxCNC switchkins REMAP INI in manifest:' check-linuxcnc-switchkins-remap-table.sh >/dev/null
grep -F 'missing LinuxCNC switchkins remap source in manifest:' check-linuxcnc-switchkins-remap-table.sh >/dev/null
grep -F 'LinuxCNC source basis: cached switchkins/remap validation hashes the LinuxCNC' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'LinuxCNC source basis: generated switchkins/remap tables are extracted from' generate-linuxcnc-switchkins-remap-table.sh >/dev/null
grep -F 'LINUXCNC_ROOT="$linuxcnc_root" ./check-linuxcnc-inputs-cached.sh "$manifest"' generate-linuxcnc-switchkins-remap-table.sh >/dev/null
grep -F 'LinuxCNC source basis: Puma560 DH parameter output is generated from' generate-linuxcnc-puma560-dh-parameters.sh >/dev/null
test -x generate-linuxcnc-puma560-dh-parameters.sh
grep -F 'usage: $0 [linuxcnc-root-relative-puma560-dh-hal]' generate-linuxcnc-puma560-dh-parameters.sh >/dev/null
grep -F 'unknown LinuxCNC puma560 DH generator option: $1' generate-linuxcnc-puma560-dh-parameters.sh >/dev/null
grep -F 'too many LinuxCNC puma560 DH generator arguments' generate-linuxcnc-puma560-dh-parameters.sh >/dev/null
grep -F 'LinuxCNC puma560 DH HAL source path must stay LinuxCNC-root relative: $source_path' generate-linuxcnc-puma560-dh-parameters.sh >/dev/null
grep -F 'LinuxCNC puma560 DH source must be a HAL file: $source_path' generate-linuxcnc-puma560-dh-parameters.sh >/dev/null
grep -F 'missing --missing-message value' list-linuxcnc-source-files.sh >/dev/null
grep -F 'unknown source file option: $1' list-linuxcnc-source-files.sh >/dev/null
grep -F 'LinuxCNC source path must be root-relative: $source' list-linuxcnc-source-files.sh >/dev/null
grep -F 'unknown source cxxflag option: $1' list-linuxcnc-source-common-cxxflags.sh >/dev/null
grep -F 'missing --profile value' list-linuxcnc-wasm-common-cxxflags.sh >/dev/null
grep -F 'unknown wasm cxxflag option: $1' list-linuxcnc-wasm-common-cxxflags.sh >/dev/null
grep -F 'unknown wasm cxxflag profile: $profile' list-linuxcnc-wasm-common-cxxflags.sh >/dev/null
grep -F 'LinuxCNC source basis: all-native guardrails lock source-backed manifests' test-all-native.sh >/dev/null
test -x check-linuxcnc-inputs-cached.sh
grep -F 'CNC_SIM_PREFLIGHT_CACHE_DIR' check-linuxcnc-inputs-cached.sh >/dev/null
grep -F 'sha256sum check-linuxcnc-inputs-cached.sh' check-linuxcnc-inputs-cached.sh >/dev/null
grep -F 'sha256sum check-linuxcnc-inputs.sh' check-linuxcnc-inputs-cached.sh >/dev/null
grep -F 'exec 8>"$cache_dir/check-linuxcnc-inputs.lock"' check-linuxcnc-inputs-cached.sh >/dev/null
grep -F 'flock 8' check-linuxcnc-inputs-cached.sh >/dev/null
grep -F 'stat -c '\''SOURCE=%n:%s:%y'\''' check-linuxcnc-inputs-cached.sh >/dev/null
grep -F 'next_signature=$(mktemp "$cache_file.next.XXXXXX")' check-linuxcnc-inputs-cached.sh >/dev/null
test -x check-linuxcnc-switchkins-remap-table-cached.sh
grep -F 'check-linuxcnc-switchkins-remap-table.lock' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'sha256sum check-linuxcnc-switchkins-remap-table-cached.sh' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'sha256sum check-linuxcnc-switchkins-remap-table.sh' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'sha256sum check-linuxcnc-inputs-cached.sh' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'sha256sum check-linuxcnc-inputs.sh' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'sha256sum generate-linuxcnc-switchkins-remap-table.sh' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'stat -c '\''SOURCE=%n:%s:%y'\''' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'core/src/cnc_sim_api.cpp' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'core/src/linuxcnc_switchkins_remap_table.inc' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'core/tests/linuxcnc_switchkins_remap_config_cases.inc' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'web/public/linuxcnc_switchkins_remap_config_cases.json' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'web/src/index.ts' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'web/src/wasm-core.js' check-linuxcnc-switchkins-remap-table-cached.sh >/dev/null
grep -F 'the cached wrapper script, checker script, generator script' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'generated table/case outputs, and the thin API/web bridge files that pass' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'switchkins config aliases.' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'The switchkins/remap generator must treat LinuxCNC `[EMCIO] TOOL_TABLE`' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'must not become new generated API aliases or browser cases.' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'The kinematics manifest lister must preserve every allowed manifest group' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'including `asset`, `tooldata`, and' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'check-linuxcnc-switchkins-remap-table-cached.sh --cache-dir "$preflight_cache_dir" linuxcnc-kinematics-source-files.txt' test-native.sh >/dev/null
grep -F 'check-linuxcnc-switchkins-remap-table-cached.sh --cache-dir "$preflight_cache_dir" linuxcnc-kinematics-source-files.txt' test-linuxcnc-source-link.sh >/dev/null
grep -F 'check-linuxcnc-switchkins-remap-table-cached.sh --cache-dir "$preflight_cache_dir" linuxcnc-kinematics-source-files.txt' build-wasm.sh >/dev/null
grep -F "grep -F 'rs274ngc_pre.cc ini_load() consumes INI_FILE_NAME' test-web-wasm-node-smoke.cjs >/dev/null" test-native.sh >/dev/null
grep -F "grep -F 'rs274ngc_pre.cc ini_load() consumes INI_FILE_NAME' web/test-browser-wasm-smoke-linuxcnc-sections.js >/dev/null" test-native.sh >/dev/null
grep -F 'CNC_SIM_PREFLIGHT_CACHE_DIR="$preflight_cache_dir"' build-wasm.sh >/dev/null
grep -F 'CNC_SIM_PREFLIGHT_CACHE_DIR="$preflight_cache_dir"' test-linuxcnc-source-link.sh >/dev/null
grep -F 'CNC_SIM_PREFLIGHT_CACHE_DIR="$preflight_cache_dir"' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'CNC_SIM_PREFLIGHT_CACHE_DIR="$preflight_cache_dir"' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'CNC_SIM_PREFLIGHT_CACHE_DIR="$preflight_cache_dir" ./test-linuxcnc-wasm-cmake-safe-probe.sh "$manifest"' build-wasm.sh >/dev/null
grep -F 'preflight_cache_dir=${CNC_SIM_PREFLIGHT_CACHE_DIR:-"$build_dir/preflight-cache"}' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'check-linuxcnc-inputs-cached.sh --cache-dir "$preflight_cache_dir"' test-native.sh >/dev/null
for helper_script in \
list-linuxcnc-source-files.sh \
list-linuxcnc-source-support-objects.sh \
list-linuxcnc-source-common-cxxflags.sh \
list-linuxcnc-native-linkflags.sh; do
grep -F 'preflight_cache_dir=${CNC_SIM_PREFLIGHT_CACHE_DIR:-build/linuxcnc-helper-preflight-cache}' "$helper_script" >/dev/null
grep -F 'check-linuxcnc-inputs-cached.sh --cache-dir "$preflight_cache_dir" --root-only' "$helper_script" >/dev/null
done
grep -F 'self_checks=${CNC_SIM_SOURCE_SYNTAX_SELF_CHECKS:-0}' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'CNC_SIM_SOURCE_SYNTAX_SELF_CHECKS must be 0 or 1: $self_checks' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'CNC_SIM_ALL_NATIVE_GUARDRAILS_ONLY=1 ./test-all-native.sh' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'without invoking the expensive' docs/linuxcnc-source-policy.md >/dev/null
if ! awk '
index($0, "if [[ \"$guardrails_only\" == \"1\" ]]; then") { guardrail_line = NR }
index($0, "./test-native.sh") { native_line = NR }
index($0, "./test-linuxcnc-source-link.sh \"$manifest\"") { source_link_line = NR }
END { exit !(guardrail_line && native_line && source_link_line && guardrail_line < native_line && guardrail_line < source_link_line) }
' test-all-native.sh; then
echo "native aggregate guardrails-only exit must precede expensive child tests" >&2
exit 1
fi
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 "$escaped_project_source_log"' \
'rm -f "$invalid_source_filter_log"' \
'rm -f "$missing_cmake_set_log"' \
'rm -f "$missing_cmake_append_log"' \
'rm -f "$invalid_cmake_set_log"' \
'rm -f "$escaped_cmake_prefix_log"' \
'rm -f "$missing_support_object_log"' \
'rm -f "$missing_source_manifest" "$missing_source_log"' \
'rm -f "$kinematics_unknown_filter_log"' \
'rm -f "$kinematics_unknown_output_log"' \
'rm -f "$inputs_cached_missing_cache_dir_log"' \
'rm -f "$inputs_cached_whitespace_cache_dir_log"' \
'rm -f "$switchkins_checker_unknown_option_log"' \
'rm -f "$switchkins_checker_too_many_args_log"' \
'rm -f "$switchkins_cached_missing_cache_dir_log"' \
'rm -f "$switchkins_cached_whitespace_cache_dir_log"' \
'rm -f "$switchkins_generator_unknown_option_log"' \
'rm -f "$switchkins_generator_missing_output_dir_log"' \
'rm -f "$switchkins_generator_too_many_args_log"' \
'rm -f "$switchkins_generator_whitespace_output_dir_log"' \
'rm -f "$puma560_dh_unknown_option_log"' \
'rm -f "$puma560_dh_too_many_args_log"' \
'rm -f "$puma560_dh_escaped_source_log"' \
'rm -f "$puma560_dh_non_hal_source_log"' \
'rm -f "$source_files_missing_message_log"' \
'rm -f "$source_files_unknown_option_log"' \
'rm -f "$source_files_escaped_source_log"' \
'rm -f "$source_cxxflag_unknown_option_log"' \
'rm -f "$wasm_cxxflag_missing_profile_log"' \
'rm -f "$wasm_cxxflag_unknown_option_log"' \
'rm -f "$wasm_cxxflag_unknown_profile_log"' \
'rm -f "$bad_line_manifest" "$bad_line_log"' \
'rm -f "$absolute_source_manifest" "$absolute_source_log"' \
'rm -f "$invalid_build_jobs_log"' \
'rm -f "$invalid_build_dir_log"' \
'rm -f "$empty_build_dir_log"' \
'rm -f "$whitespace_build_dir_log"' \
'rm -f "$invalid_node_smoke_min_steps_log"' \
'rm -f "$invalid_browser_smoke_min_sections_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
printf 'core:src/emc/rs274ngc/interp_arc.cc\n' >"$bad_line_manifest"
if ./check-linuxcnc-inputs.sh "$bad_line_manifest" >"$bad_line_log" 2>&1; then
echo "check-linuxcnc-inputs accepted a manifest line without a note" >&2
exit 1
fi
if ! grep -F "bad manifest line 1: core:src/emc/rs274ngc/interp_arc.cc" "$bad_line_log" >/dev/null; then
echo "check-linuxcnc-inputs did not report malformed manifest lines clearly" >&2
sed -n '1,20p' "$bad_line_log" >&2
exit 1
fi
printf 'core:/src/emc/rs274ngc/interp_arc.cc:absolute source path\n' >"$absolute_source_manifest"
if ./check-linuxcnc-inputs.sh "$absolute_source_manifest" >"$absolute_source_log" 2>&1; then
echo "check-linuxcnc-inputs accepted an absolute manifest source path" >&2
exit 1
fi
if ! grep -F "manifest source must be LinuxCNC-root relative: /src/emc/rs274ngc/interp_arc.cc" "$absolute_source_log" >/dev/null; then
echo "check-linuxcnc-inputs did not report absolute manifest paths clearly" >&2
sed -n '1,20p' "$absolute_source_log" >&2
exit 1
fi
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 'CMake source set name must be a CMake variable name: $set_name' list-cmake-set-sources.sh >/dev/null
grep -F 'CMake append source set name must be a CMake variable name: $append_name' list-cmake-set-plus-append-sources.sh >/dev/null
grep -F 'CMake source relative prefix must stay project-relative: $relative_prefix' list-cmake-set-sources.sh >/dev/null
grep -F 'missing CMake source set: " set_name' list-cmake-set-sources.sh >/dev/null
grep -F 'missing CMake append source set: " append_name' list-cmake-set-plus-append-sources.sh >/dev/null
grep -F 'echo "$missing_path_message: $path"' list-filtered-existing-paths.sh >/dev/null
grep -F 'source filter must be a basename: $filter' list-filtered-existing-paths.sh >/dev/null
grep -F 'project source path must stay project-relative: $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
if ./list-cmake-set-sources.sh does_not_exist_cmake_set >"$missing_cmake_set_log" 2>&1; then
echo "CMake source-set lister accepted a missing set" >&2
exit 1
fi
if ! grep -F "missing CMake source set: does_not_exist_cmake_set" "$missing_cmake_set_log" >/dev/null; then
echo "CMake source-set lister did not report missing sets clearly" >&2
sed -n '1,20p' "$missing_cmake_set_log" >&2
exit 1
fi
if ./list-cmake-set-plus-append-sources.sh \
cnc_sim_core_sources \
does_not_exist_append_set >"$missing_cmake_append_log" 2>&1; then
echo "combined CMake source-set lister accepted a missing append set" >&2
exit 1
fi
if ! grep -F "missing CMake append source set: does_not_exist_append_set" "$missing_cmake_append_log" >/dev/null; then
echo "combined CMake source-set lister did not report missing append sets clearly" >&2
sed -n '1,20p' "$missing_cmake_append_log" >&2
exit 1
fi
if ./list-cmake-set-sources.sh 'cnc_sim_core_sources.*' >"$invalid_cmake_set_log" 2>&1; then
echo "CMake source-set lister accepted a regex-like set name" >&2
exit 1
fi
if ! grep -F "CMake source set name must be a CMake variable name: cnc_sim_core_sources.*" "$invalid_cmake_set_log" >/dev/null; then
echo "CMake source-set lister did not report invalid set names clearly" >&2
sed -n '1,20p' "$invalid_cmake_set_log" >&2
exit 1
fi
if ./list-cmake-set-plus-append-sources.sh \
cnc_sim_core_sources \
'cnc_sim_core_sources.*' >"$invalid_cmake_set_log" 2>&1; then
echo "combined CMake source-set lister accepted a regex-like append set name" >&2
exit 1
fi
if ! grep -F "CMake append source set name must be a CMake variable name: cnc_sim_core_sources.*" "$invalid_cmake_set_log" >/dev/null; then
echo "combined CMake source-set lister did not report invalid append set names clearly" >&2
sed -n '1,20p' "$invalid_cmake_set_log" >&2
exit 1
fi
if ./list-cmake-set-sources.sh cnc_sim_core_sources ../core/ >"$escaped_cmake_prefix_log" 2>&1; then
echo "CMake source-set lister accepted an escaped relative prefix" >&2
exit 1
fi
if ! grep -F "CMake source relative prefix must stay project-relative: ../core/" "$escaped_cmake_prefix_log" >/dev/null; then
echo "CMake source-set lister did not report escaped relative prefixes clearly" >&2
sed -n '1,20p' "$escaped_cmake_prefix_log" >&2
exit 1
fi
if printf 'core/src/canon_event_sink.cpp\n' | ./list-filtered-existing-paths.sh \
core/src/canon_event_sink.cpp \
"missing project source" \
"missing project source in list" >"$invalid_source_filter_log" 2>&1; then
echo "source-list filter accepted a path-like filter" >&2
exit 1
fi
if ! grep -F "source filter must be a basename: core/src/canon_event_sink.cpp" "$invalid_source_filter_log" >/dev/null; then
echo "source-list filter did not report path-like filters clearly" >&2
sed -n '1,20p' "$invalid_source_filter_log" >&2
exit 1
fi
if printf '../core/src/canon_event_sink.cpp\n' | ./list-filtered-existing-paths.sh \
--project-relative \
"" \
"missing project source" \
"missing project source in list" >"$escaped_project_source_log" 2>&1; then
echo "project source filter accepted an escaped project source path" >&2
exit 1
fi
if ! grep -F "project source path must stay project-relative: ../core/src/canon_event_sink.cpp" "$escaped_project_source_log" >/dev/null; then
echo "project source filter did not report escaped project paths clearly" >&2
sed -n '1,20p' "$escaped_project_source_log" >&2
exit 1
fi
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
grep -F 'build_dir=${CNC_SIM_BRIDGE_NATIVE_BUILD_DIR-build/bridge-native-test}' test-linuxcnc-bridge-native.sh >/dev/null
grep -F 'CNC_SIM_BRIDGE_NATIVE_BUILD_DIR must not be empty' test-linuxcnc-bridge-native.sh >/dev/null
grep -F 'CNC_SIM_BRIDGE_NATIVE_BUILD_DIR must not contain whitespace: $build_dir' test-linuxcnc-bridge-native.sh >/dev/null
grep -F 'CNC_SIM_BRIDGE_NATIVE_BUILD_DIR must not be the filesystem root' test-linuxcnc-bridge-native.sh >/dev/null
grep -F 'build_jobs=${CNC_SIM_BUILD_JOBS:-8}' test-linuxcnc-bridge-native.sh >/dev/null
grep -F 'CNC_SIM_BUILD_JOBS must be a positive integer: $build_jobs' test-linuxcnc-bridge-native.sh >/dev/null
grep -F 'exec 9>"$build_dir/bridge-native.lock"' test-linuxcnc-bridge-native.sh >/dev/null
grep -F 'check-linuxcnc-inputs-cached.sh --cache-dir "$preflight_cache_dir" --root-only' test-linuxcnc-bridge-native.sh >/dev/null
test -x build-linuxcnc-native-bridge-objects.sh
grep -F 'CNC_SIM_NATIVE_BRIDGE_OBJECT_CACHE_DIR' build-linuxcnc-native-bridge-objects.sh >/dev/null
grep -F 'cache_dir=${CNC_SIM_NATIVE_BRIDGE_OBJECT_CACHE_DIR-build/native-bridge-object-cache}' build-linuxcnc-native-bridge-objects.sh >/dev/null
grep -F 'native-bridge-objects.signature' build-linuxcnc-native-bridge-objects.sh >/dev/null
grep -F "printf 'BUILD_RULE_VERSION=1\n'" build-linuxcnc-native-bridge-objects.sh >/dev/null
grep -F 'make --output-sync=target -j"$build_jobs" -f "$makefile" >/dev/null' build-linuxcnc-native-bridge-objects.sh >/dev/null
grep -F 'build-linuxcnc-native-bridge-objects.sh' test-linuxcnc-bridge-native.sh >/dev/null
grep -F 'BRIDGE_OBJECTS :=' test-linuxcnc-bridge-native.sh >/dev/null
if grep -F 'for source in "${project_sources[@]}"' test-linuxcnc-bridge-native.sh >/dev/null; then
echo "bridge native smoke still compiles shared project sources locally" >&2
exit 1
fi
grep -F 'bridge_signature="$build_dir/bridge-native.signature"' test-linuxcnc-bridge-native.sh >/dev/null
grep -F "printf 'BUILD_RULE_VERSION=1\n'" test-linuxcnc-bridge-native.sh >/dev/null
grep -F 'make --output-sync=target -j"$build_jobs" -f "$bridge_makefile"' test-linuxcnc-bridge-native.sh >/dev/null
grep -F -- '-MMD -MP -MF %s.d' test-linuxcnc-bridge-native.sh >/dev/null
grep -F 'build_dir=${CNC_SIM_API_NATIVE_BUILD_DIR-build/api-native-test}' test-linuxcnc-api-native.sh >/dev/null
grep -F 'CNC_SIM_API_NATIVE_BUILD_DIR must not be empty' test-linuxcnc-api-native.sh >/dev/null
grep -F 'CNC_SIM_API_NATIVE_BUILD_DIR must not contain whitespace: $build_dir' test-linuxcnc-api-native.sh >/dev/null
grep -F 'CNC_SIM_API_NATIVE_BUILD_DIR must not be the filesystem root' test-linuxcnc-api-native.sh >/dev/null
grep -F 'build_jobs=${CNC_SIM_BUILD_JOBS:-8}' test-linuxcnc-api-native.sh >/dev/null
grep -F 'CNC_SIM_BUILD_JOBS must be a positive integer: $build_jobs' test-linuxcnc-api-native.sh >/dev/null
grep -F 'exec 9>"$build_dir/api-native.lock"' test-linuxcnc-api-native.sh >/dev/null
grep -F 'check-linuxcnc-inputs-cached.sh --cache-dir "$preflight_cache_dir" --root-only' test-linuxcnc-api-native.sh >/dev/null
grep -F 'build-linuxcnc-native-bridge-objects.sh' test-linuxcnc-api-native.sh >/dev/null
grep -F 'api_extra_sources=()' test-linuxcnc-api-native.sh >/dev/null
grep -F 'is_bridge_source "$source"' test-linuxcnc-api-native.sh >/dev/null
grep -F 'BRIDGE_OBJECTS :=' test-linuxcnc-api-native.sh >/dev/null
grep -F 'api_signature="$build_dir/api-native.signature"' test-linuxcnc-api-native.sh >/dev/null
grep -F "printf 'BUILD_RULE_VERSION=1\n'" test-linuxcnc-api-native.sh >/dev/null
grep -F 'make --output-sync=target -j"$build_jobs" -f "$api_makefile"' test-linuxcnc-api-native.sh >/dev/null
grep -F 'core/src/gcode_backend.cpp)' test-linuxcnc-api-native.sh >/dev/null
grep -F 'source_flags+=(-DCNC_SIM_ENABLE_LINUXCNC_RS274_BACKEND)' test-linuxcnc-api-native.sh >/dev/null
grep -F "printf ' %s' \"\${source_flags[@]}\"" test-linuxcnc-api-native.sh >/dev/null
if ! awk '
/cleanup_wasm_cmake_probe_temps\(\)/ { in_cleanup = 1 }
in_cleanup && index($0, "\"$build_dir\"") { found_build_dir = 1 }
in_cleanup && /^}/ { in_cleanup = 0 }
END { exit found_build_dir }
' test-linuxcnc-wasm-cmake-safe-probe.sh; then
echo "wasm CMake safe probe cleanup no longer removes its persistent build dir" >&2
exit 1
fi
grep -F 'build_dir=${CNC_SIM_SOURCE_LINK_BUILD_DIR-build/source-link-test}' test-linuxcnc-source-link.sh >/dev/null
grep -F 'CNC_SIM_SOURCE_LINK_BUILD_DIR must not be empty' test-linuxcnc-source-link.sh >/dev/null
grep -F 'CNC_SIM_SOURCE_LINK_BUILD_DIR must not contain whitespace: $build_dir' test-linuxcnc-source-link.sh >/dev/null
grep -F 'CNC_SIM_SOURCE_LINK_BUILD_DIR must not be the filesystem root' test-linuxcnc-source-link.sh >/dev/null
grep -F 'CNC_SIM_BUILD_JOBS must be a positive integer: $build_jobs' test-linuxcnc-source-link.sh >/dev/null
if ! awk '
index($0, "check-linuxcnc-inputs-cached.sh --cache-dir") &&
index($0, "\"$manifest\"") &&
!index($0, "--require-rs274-complete") { check_line = NR }
index($0, "./check-linuxcnc-switchkins-remap-table-cached.sh --cache-dir \"$preflight_cache_dir\" linuxcnc-kinematics-source-files.txt") { table_line = NR }
END { exit !(check_line && table_line && check_line < table_line) }
' test-linuxcnc-source-link.sh; then
echo "source-link probe must validate its requested manifest before switchkins table checks" >&2
exit 1
fi
grep -F 'exec 9>"${TMPDIR:-/tmp}/cnc_sim_rs274_source_link.lock"' test-linuxcnc-source-link.sh >/dev/null
grep -F 'source_link_signature="$build_dir/source-link-build.signature"' test-linuxcnc-source-link.sh >/dev/null
grep -F 'if [[ ! -f "$source_link_signature" ]] || ! cmp -s "$source_link_signature" "$source_link_next_signature"; then' test-linuxcnc-source-link.sh >/dev/null
grep -F 'mv "$source_link_next_signature" "$source_link_signature"' test-linuxcnc-source-link.sh >/dev/null
grep -F 'printf '\''PWD=%s\n'\'' "$PWD"' test-linuxcnc-source-link.sh >/dev/null
grep -F 'printf '\''LINUXCNC_ROOT=%s\n'\'' "$(cd "$linuxcnc_root" && pwd)"' test-linuxcnc-source-link.sh >/dev/null
grep -F "printf 'BUILD_RULE_VERSION=1\n'" test-linuxcnc-source-link.sh >/dev/null
grep -F 'printf '\''%s: %s\n'\'' "$build_dir/linuxcnc_${linuxcnc_index}.o" "$source"' test-linuxcnc-source-link.sh >/dev/null
grep -F 'printf '\''%s: %s\n'\'' "$build_dir/project_${project_index}.o" "$source"' test-linuxcnc-source-link.sh >/dev/null
grep -F 'printf '\''\t@$(CXX) $(COMMON_FLAGS) -MMD -MP -MF %s.d -c %s -o %s\n\n'\''' test-linuxcnc-source-link.sh >/dev/null
grep -F 'source_link_makefile="$build_dir/source-link.mk"' test-linuxcnc-source-link.sh >/dev/null
grep -F 'printf '\''\n-include $(DEP_FILES)\n'\''' test-linuxcnc-source-link.sh >/dev/null
grep -F 'make --output-sync=target -j"$build_jobs" -f "$source_link_makefile"' test-linuxcnc-source-link.sh >/dev/null
grep -F 'build_dir=${CNC_SIM_NATIVE_BUILD_DIR-build/native-test}' test-native.sh >/dev/null
grep -F 'CNC_SIM_NATIVE_BUILD_DIR must not be empty' test-native.sh >/dev/null
grep -F 'CNC_SIM_NATIVE_BUILD_DIR must not contain whitespace: $build_dir' test-native.sh >/dev/null
grep -F 'CNC_SIM_NATIVE_BUILD_DIR must not be the filesystem root' test-native.sh >/dev/null
grep -F 'CNC_SIM_BUILD_JOBS must be a positive integer: $build_jobs' test-native.sh >/dev/null
grep -F 'exec 9>"$build_dir/native-test.lock"' test-native.sh >/dev/null
grep -F 'native_signature="$build_dir/native-build.signature"' test-native.sh >/dev/null
grep -F 'if [[ ! -f "$native_signature" ]] || ! cmp -s "$native_signature" "$native_next_signature"; then' test-native.sh >/dev/null
grep -F 'mv "$native_next_signature" "$native_signature"' test-native.sh >/dev/null
grep -F 'printf '\''PWD=%s\n'\'' "$PWD"' test-native.sh >/dev/null
grep -F "printf 'BUILD_RULE_VERSION=1\n'" test-native.sh >/dev/null
grep -F 'printf '\''%s: %s\n'\'' "${core_objects[$core_index]}" "$source"' test-native.sh >/dev/null
grep -F 'printf '\''\t@$(CXX) $(SMOKE_CXXFLAGS) -MMD -MP -MF %s.d -c %s -o %s\n\n'\''' test-native.sh >/dev/null
grep -F 'native_makefile="$build_dir/native.mk"' test-native.sh >/dev/null
grep -F 'printf '\''\n-include $(DEP_FILES)\n'\''' test-native.sh >/dev/null
grep -F 'make --output-sync=target -j"$build_jobs" -f "$native_makefile"' test-native.sh >/dev/null
grep -F 'build_dir=${CNC_SIM_SOURCE_SYNTAX_BUILD_DIR-build/source-syntax-test}' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'CNC_SIM_SOURCE_SYNTAX_BUILD_DIR must not be empty' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'CNC_SIM_SOURCE_SYNTAX_BUILD_DIR must not contain whitespace: $build_dir' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'CNC_SIM_SOURCE_SYNTAX_BUILD_DIR must not be the filesystem root' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'CNC_SIM_BUILD_JOBS must be a positive integer: $build_jobs' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'exec 9>"$build_dir/source-syntax.lock"' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'source_list="$build_dir/linuxcnc_source_syntax_sources.txt"' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'source_syntax_signature="$build_dir/source-syntax.signature"' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'if [[ ! -f "$source_syntax_signature" ]] || ! cmp -s "$source_syntax_signature" "$source_syntax_next_signature"; then' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'mv "$source_syntax_next_signature" "$source_syntax_signature"' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'printf '\''LINUXCNC_ROOT=%s\n'\'' "$(cd "$linuxcnc_root" && pwd)"' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'printf '\''MANIFEST=%s\n'\'' "$(cd "$(dirname "$manifest")" && pwd)/$(basename "$manifest")"' test-linuxcnc-source-syntax.sh >/dev/null
grep -F "printf 'BUILD_RULE_VERSION=1\n'" test-linuxcnc-source-syntax.sh >/dev/null
if grep -F 'printf '\''BUILD_JOBS=%s\n'\'' "$build_jobs"' test-linuxcnc-source-syntax.sh >/dev/null; then
echo "source syntax signature must not depend on CNC_SIM_BUILD_JOBS" >&2
exit 1
fi
grep -F 'printf '\''%s/source_%s.stamp: %s\n'\'' "$build_dir" "$source_index" "$source"' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'printf '\''\t@$(CXX) $(COMMON_FLAGS) -MMD -MP -MF %s/source_%s.d %s\n'\''' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'make --output-sync=target -j"$build_jobs" -f "$source_syntax_makefile"' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'build_dir=${CNC_SIM_SOURCE_OBJECTS_BUILD_DIR-build/source-objects-test}' test-linuxcnc-source-objects.sh >/dev/null
grep -F 'CNC_SIM_SOURCE_OBJECTS_BUILD_DIR must not be empty' test-linuxcnc-source-objects.sh >/dev/null
grep -F 'CNC_SIM_SOURCE_OBJECTS_BUILD_DIR must not contain whitespace: $build_dir' test-linuxcnc-source-objects.sh >/dev/null
grep -F 'CNC_SIM_SOURCE_OBJECTS_BUILD_DIR must not be the filesystem root' test-linuxcnc-source-objects.sh >/dev/null
grep -F 'CNC_SIM_BUILD_JOBS must be a positive integer: $build_jobs' test-linuxcnc-source-objects.sh >/dev/null
grep -F 'exec 9>"$build_dir/source-objects.lock"' test-linuxcnc-source-objects.sh >/dev/null
grep -F 'source_objects_signature="$build_dir/source-objects.signature"' test-linuxcnc-source-objects.sh >/dev/null
grep -F "printf 'BUILD_RULE_VERSION=1\n'" test-linuxcnc-source-objects.sh >/dev/null
grep -F 'source_objects_makefile="$build_dir/source-objects.mk"' test-linuxcnc-source-objects.sh >/dev/null
grep -F 'printf '\''\n-include $(DEP_FILES)\n'\''' test-linuxcnc-source-objects.sh >/dev/null
grep -F 'make --output-sync=target -j"$build_jobs" -f "$source_objects_makefile"' test-linuxcnc-source-objects.sh >/dev/null
grep -F 'build_dir=${CNC_SIM_RS274_NATIVE_BUILD_DIR-build/rs274-native-test}' test-linuxcnc-rs274-native.sh >/dev/null
grep -F 'CNC_SIM_RS274_NATIVE_BUILD_DIR must not be empty' test-linuxcnc-rs274-native.sh >/dev/null
grep -F 'CNC_SIM_RS274_NATIVE_BUILD_DIR must not contain whitespace: $build_dir' test-linuxcnc-rs274-native.sh >/dev/null
grep -F 'CNC_SIM_RS274_NATIVE_BUILD_DIR must not be the filesystem root' test-linuxcnc-rs274-native.sh >/dev/null
grep -F 'CNC_SIM_BUILD_JOBS must be a positive integer: $build_jobs' test-linuxcnc-rs274-native.sh >/dev/null
grep -F 'rs274_native_signature="$build_dir/rs274-native.signature"' test-linuxcnc-rs274-native.sh >/dev/null
grep -F "printf 'BUILD_RULE_VERSION=1\n'" test-linuxcnc-rs274-native.sh >/dev/null
grep -F 'rs274_native_makefile="$build_dir/rs274-native.mk"' test-linuxcnc-rs274-native.sh >/dev/null
grep -F 'printf '\''\n-include $(DEP_FILES)\n'\''' test-linuxcnc-rs274-native.sh >/dev/null
grep -F 'make --output-sync=target -j"$build_jobs" -f "$rs274_native_makefile"' test-linuxcnc-rs274-native.sh >/dev/null
for hot_signature_script in \
build-linuxcnc-wasm-link-probe.sh \
build-linuxcnc-wasm-probe-objects.sh \
build-linuxcnc-wasm-standalone-probe.sh \
build-linuxcnc-native-bridge-objects.sh \
test-linuxcnc-api-native.sh \
test-linuxcnc-bridge-native.sh \
test-linuxcnc-rs274-native.sh \
test-linuxcnc-source-link.sh \
test-linuxcnc-source-objects.sh \
test-linuxcnc-source-syntax.sh \
test-native.sh; do
if grep -F "sha256sum $hot_signature_script" "$hot_signature_script" >/dev/null; then
echo "$hot_signature_script hot object signature must use BUILD_RULE_VERSION instead of the whole script hash" >&2
exit 1
fi
done
grep -F 'build_jobs=${CNC_SIM_BUILD_JOBS:-8}' build-wasm.sh >/dev/null
grep -F 'CNC_SIM_BUILD_JOBS must be a positive integer: $build_jobs' build-wasm.sh >/dev/null
grep -F 'cmake_compiler_launcher_mode=none' build-wasm.sh >/dev/null
grep -F 'cmake_compiler_launcher_args=()' build-wasm.sh >/dev/null
grep -F 'cmake_compiler_launcher_mode=ccache' build-wasm.sh >/dev/null
grep -F '"${cmake_compiler_launcher_args[@]}"' build-wasm.sh >/dev/null
grep -F 'command -v ccache >/dev/null 2>&1' build-wasm.sh >/dev/null
grep -F 'CMAKE_C_COMPILER_LAUNCHER=ccache' build-wasm.sh >/dev/null
grep -F 'CMAKE_CXX_COMPILER_LAUNCHER=ccache' build-wasm.sh >/dev/null
grep -F 'wasm_build_signature=build/wasm/wasm-build.signature' build-wasm.sh >/dev/null
grep -F 'wasm_build_next_signature=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_wasm_build.signature.XXXXXX")' build-wasm.sh >/dev/null
grep -F 'sha256sum "$manifest"' build-wasm.sh >/dev/null
grep -F 'sha256sum core/CMakeLists.txt' build-wasm.sh >/dev/null
grep -F "printf 'CONFIGURE_RULE_VERSION=1\n'" build-wasm.sh >/dev/null
grep -F 'run_parallel_wasm_probe() {' build-wasm.sh >/dev/null
grep -F 'wait_parallel_wasm_probes() {' build-wasm.sh >/dev/null
grep -F 'parallel_probe_pids+=("$!")' build-wasm.sh >/dev/null
grep -F 'CNC_SIM_PREFLIGHT_CACHE_DIR="$preflight_cache_dir" "$@"' build-wasm.sh >/dev/null
grep -F 'run_parallel_wasm_probe "LinuxCNC wasm tooldata shim link probe" ./test-linuxcnc-wasm-tooldata-link.sh' build-wasm.sh >/dev/null
grep -F 'run_parallel_wasm_probe "LinuxCNC wasm rs274ngc_pre object probe" ./test-linuxcnc-wasm-rs274ngc-pre-object.sh' build-wasm.sh >/dev/null
grep -F 'wait_parallel_wasm_probes' build-wasm.sh >/dev/null
grep -F 'configure_wasm=1' build-wasm.sh >/dev/null
grep -F 'elif [[ -f build/wasm/CMakeCache.txt ]]; then' build-wasm.sh >/dev/null
grep -F 'configure_wasm=0' build-wasm.sh >/dev/null
if grep -F 'rm -rf build/wasm' build-wasm.sh >/dev/null; then
echo "build-wasm configure signature changes must reconfigure build/wasm in place" >&2
exit 1
fi
if grep -F 'printf '\''BUILD_JOBS=%s\n'\'' "$build_jobs"' build-wasm.sh >/dev/null; then
echo "build-wasm configure signature must not depend on CNC_SIM_BUILD_JOBS" >&2
exit 1
fi
grep -F -- 'for required_tool in cmake emcmake emcc node; do' build-wasm.sh >/dev/null
grep -F -- 'missing_tools+=("$required_tool")' build-wasm.sh >/dev/null
grep -F 'WASM build tools are required. Missing:' build-wasm.sh >/dev/null
grep -F -- 'emcmake cmake -S core -B build/wasm \' build-wasm.sh >/dev/null
grep -F 'cmake --build build/wasm --target cnc_sim_wasm_runtime_probe cnc_sim_wasm --parallel "$build_jobs"' build-wasm.sh >/dev/null
if ! awk '
index($0, "run_parallel_wasm_probe \"LinuxCNC wasm tooldata shim link probe\"") { parallel_start_line = NR }
index($0, "wait_parallel_wasm_probes") && parallel_start_line { wait_line = NR }
index($0, "LinuxCNC wasm rs274ngc_pre link blocker scan") { pre_link_line = NR }
END { exit !(parallel_start_line && wait_line && pre_link_line && parallel_start_line < wait_line && wait_line < pre_link_line) }
' build-wasm.sh; then
echo "build-wasm must wait for independent wasm probes before rs274ngc_pre link checks" >&2
exit 1
fi
if ! awk '
index($0, "cmake --build build/wasm --target cnc_sim_wasm_runtime_probe cnc_sim_wasm --parallel \"$build_jobs\"") {
runtime_pos = index($0, "cnc_sim_wasm_runtime_probe")
wasm_pos = index($0, " cnc_sim_wasm ")
}
END { exit !(runtime_pos && wasm_pos && runtime_pos < wasm_pos) }
' build-wasm.sh; then
echo "build-wasm combined CMake build must list runtime probe before browser WASM target" >&2
exit 1
fi
grep -F 'mkdir -p web/public' build-wasm.sh >/dev/null
grep -F 'cp build/wasm/cnc_sim.js web/public/cnc_sim.js' build-wasm.sh >/dev/null
grep -F 'cp build/wasm/cnc_sim.wasm web/public/cnc_sim.wasm' build-wasm.sh >/dev/null
grep -F 'cmp -s build/wasm/cnc_sim.js web/public/cnc_sim.js' build-wasm.sh >/dev/null
grep -F 'cmp -s build/wasm/cnc_sim.wasm web/public/cnc_sim.wasm' build-wasm.sh >/dev/null
if [[ "$(grep -Fc 'cp build/wasm/cnc_sim.js' build-wasm.sh)" -ne 1 ]]; then
echo "build-wasm should copy cnc_sim.js exactly once" >&2
exit 1
fi
if [[ "$(grep -Fc 'cp build/wasm/cnc_sim.wasm' build-wasm.sh)" -ne 1 ]]; then
echo "build-wasm should copy cnc_sim.wasm exactly once" >&2
exit 1
fi
if ! awk '
index($0, "mkdir -p web/public") { mkdir_line = NR }
index($0, "cp build/wasm/cnc_sim.js web/public/cnc_sim.js") { cp_line = NR }
END { exit !(mkdir_line && cp_line && mkdir_line < cp_line) }
' build-wasm.sh; then
echo "build-wasm must create web/public before copying wasm artifacts" >&2
exit 1
fi
if ! awk '
index($0, "for required_tool in cmake emcmake emcc node; do") { tools_line = NR }
index($0, "emcmake cmake -S core -B build/wasm") { emcmake_line = NR }
END { exit !(tools_line && emcmake_line && tools_line < emcmake_line) }
' build-wasm.sh; then
echo "build-wasm must check required WASM tools before configuring with emcmake" >&2
exit 1
fi
if ! awk '
index($0, "cp build/wasm/cnc_sim.js web/public/cnc_sim.js") { cp_js_line = NR }
index($0, "cp build/wasm/cnc_sim.wasm web/public/cnc_sim.wasm") { cp_wasm_line = NR }
index($0, "cmp -s build/wasm/cnc_sim.js web/public/cnc_sim.js") { cmp_js_line = NR }
index($0, "cmp -s build/wasm/cnc_sim.wasm web/public/cnc_sim.wasm") { cmp_wasm_line = NR }
index($0, "./test-web-wasm-node-smoke.sh") { node_line = NR }
index($0, "./test-web-wasm-browser-smoke.sh") { browser_line = NR }
END {
exit !(cp_js_line && cp_wasm_line && cmp_js_line && cmp_wasm_line && node_line && browser_line &&
cp_js_line < cmp_js_line && cp_wasm_line < cmp_wasm_line &&
cmp_js_line < node_line && cmp_wasm_line < node_line &&
node_line < browser_line)
}
' build-wasm.sh; then
echo "build-wasm must verify copied wasm artifacts before running the Node and browser smokes" >&2
exit 1
fi
grep -F 'command -v ccache >/dev/null 2>&1' test-native.sh >/dev/null
grep -F 'command -v ccache >/dev/null 2>&1' test-linuxcnc-source-link.sh >/dev/null
grep -F 'command -v ccache >/dev/null 2>&1' test-linuxcnc-source-syntax.sh >/dev/null
grep -F 'build_jobs=${CNC_SIM_BUILD_JOBS:-8}' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'CNC_SIM_BUILD_JOBS must be a positive integer: $build_jobs' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'cmake_compiler_launcher_args=()' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F '"${cmake_compiler_launcher_args[@]}"' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'CMAKE_C_COMPILER_LAUNCHER=ccache' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'CMAKE_CXX_COMPILER_LAUNCHER=ccache' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'self_checks=${CNC_SIM_WASM_CMAKE_SAFE_PROBE_SELF_CHECKS:-0}' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'CNC_SIM_WASM_CMAKE_SAFE_PROBE_SELF_CHECKS must be 0 or 1: $self_checks' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'CNC_SIM_WASM_BLOCKERS_SELF_CHECKS must be 0 or 1: $self_checks' test-linuxcnc-wasm-blockers.sh >/dev/null
grep -F 'cmake_compiler_launcher_mode=none' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'cmake_compiler_launcher_mode=ccache' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'COMPILER_LAUNCHER=%s\n' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'build_dir=${CNC_SIM_WASM_CMAKE_SAFE_PROBE_BUILD_DIR-build/wasm-cmake-safe-probe}' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'CNC_SIM_WASM_CMAKE_SAFE_PROBE_BUILD_DIR must not be empty' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'CNC_SIM_WASM_CMAKE_SAFE_PROBE_BUILD_DIR must not contain whitespace: $build_dir' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'CNC_SIM_WASM_CMAKE_SAFE_PROBE_BUILD_DIR must not be the filesystem root' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'build_signature="$build_dir/wasm-cmake-safe-probe.signature"' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'build_next_signature=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_wasm_cmake_safe_probe.signature.XXXXXX")' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'if [[ ! -f "$build_signature" ]] || ! cmp -s "$build_signature" "$build_next_signature"; then' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'mv "$build_next_signature" "$build_signature"' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'printf '\''LINUXCNC_ROOT=%s\n'\'' "$linuxcnc_root"' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'printf '\''MANIFEST=%s\n'\'' "$manifest"' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'sha256sum "$manifest"' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F "printf 'CONFIGURE_RULE_VERSION=1\n'" test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
if grep -F 'printf '\''BUILD_JOBS=%s\n'\'' "$build_jobs"' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null; then
echo "wasm CMake probe signature must not depend on CNC_SIM_BUILD_JOBS" >&2
exit 1
fi
if awk '
BEGIN { forbidden = "rm -rf " "\"$build_dir\"" }
$0 ~ "^[[:space:]]*" forbidden { found = 1 }
END { exit !found }
' test-linuxcnc-wasm-cmake-safe-probe.sh; then
echo "wasm CMake probe signature changes must reconfigure build_dir in place" >&2
exit 1
fi
grep -F 'cmake --build "$build_dir" --target linuxcnc_rs274_wasm_safe_probe cnc_sim_wasm_runtime_probe --parallel "$build_jobs"' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'CNC_SIM_NATIVE_BUILD_DIR' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'CNC_SIM_SOURCE_LINK_BUILD_DIR' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'CNC_SIM_SOURCE_SYNTAX_BUILD_DIR' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'CNC_SIM_SOURCE_OBJECTS_BUILD_DIR' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'CNC_SIM_RS274_NATIVE_BUILD_DIR' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'CNC_SIM_WASM_CMAKE_SAFE_PROBE_BUILD_DIR' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'Build directory overrides must' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'source-syntax, and wasm build paths should enable compiler caching' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'manual wrapper, including the' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'Persistent object/stamp signatures must not include `CNC_SIM_BUILD_JOBS`.' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'signatures must include an explicit' docs/linuxcnc-source-policy.md >/dev/null
grep -F '`BUILD_RULE_VERSION` instead of hashing the whole probe script' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'keyed by manifest, `core/CMakeLists.txt`, an explicit' docs/linuxcnc-source-policy.md >/dev/null
grep -F '`CONFIGURE_RULE_VERSION`, LinuxCNC root, and compiler launcher' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'Reuse standalone wasm probe objects and binaries for the tooldata link,' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'Reuse wasm final link probes for `rs274ngc_pre` and runtime link checks' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'cached `nm --defined-only` symbol export signatures' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'Cache wasm blocker analyzer output' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'signature must include the blocker wrapper script, analyzer script' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'sha256sum test-linuxcnc-wasm-blockers.sh' test-linuxcnc-wasm-blockers.sh >/dev/null
grep -F 'browser app/wasm code must not add filesystem persistence outside OPFS' test-native.sh >/dev/null
grep -F 'browser app/wasm code must not add filesystem persistence outside OPFS' test-linuxcnc-wasm-cmake-safe-probe.sh >/dev/null
grep -F 'reject browser app/wasm storage APIs that could bypass it' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'Persistent native, source-link, source-syntax, and wasm-safe CMake probe' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'copies and byte-compares `cnc_sim.js` and `cnc_sim.wasm` under' docs/linuxcnc-source-policy.md >/dev/null
grep -F '`CNC_SIM_BUILD_JOBS` must be a positive integer and defaults to `8`.' docs/linuxcnc-source-policy.md >/dev/null
grep -F '`test-native.sh` uses persistent `build/native-test` objects' docs/linuxcnc-source-policy.md >/dev/null
grep -F '`test-linuxcnc-source-link.sh` uses persistent `build/source-link-test`' docs/linuxcnc-source-policy.md >/dev/null
grep -F '`test-linuxcnc-source-syntax.sh` uses persistent' docs/linuxcnc-source-policy.md >/dev/null
grep -F '`test-linuxcnc-wasm-cmake-safe-probe.sh` uses persistent' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'must reject empty, whitespace-containing, or filesystem-root build' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'entry points must serialize' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'shared non-concurrency-safe paths with lock files' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'Native, source-object, source-link, RS274 native, and syntax probes must build' docs/linuxcnc-source-policy.md >/dev/null
grep -F '`-MMD -MP` dependency tracking and' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'must run blocker, syntax, object, CMake, tooldata,' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'must check `cmake`, `emcmake`, `emcc`, and `node`' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'must build `cnc_sim_wasm_runtime_probe` before' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'must copy `build/wasm/cnc_sim.js` and' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'must compare copied artifacts with `cmp -s` before running' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'must run `test-web-wasm-node-smoke.sh` before the browser' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'test-web-wasm-node-smoke.sh' docs/linuxcnc-porting.md >/dev/null
if WASM_NODE_SMOKE_MIN_STEPS=0 ./test-web-wasm-node-smoke.sh >"$invalid_node_smoke_min_steps_log" 2>&1; then
echo "WASM Node smoke wrapper accepted invalid minimum step count" >&2
exit 1
fi
if ! grep -F "WASM_NODE_SMOKE_MIN_STEPS must be a positive integer: 0" "$invalid_node_smoke_min_steps_log" >/dev/null; then
echo "WASM Node smoke wrapper did not report invalid minimum step count clearly" >&2
sed -n '1,20p' "$invalid_node_smoke_min_steps_log" >&2
exit 1
fi
if BROWSER_SMOKE_MIN_SECTIONS=0 ./test-web-wasm-browser-smoke.sh >"$invalid_browser_smoke_min_sections_log" 2>&1; then
echo "WASM browser smoke wrapper accepted invalid minimum section count" >&2
exit 1
fi
if ! grep -F "BROWSER_SMOKE_MIN_SECTIONS must be a positive integer: 0" "$invalid_browser_smoke_min_sections_log" >/dev/null; then
echo "WASM browser smoke wrapper did not report invalid minimum section count clearly" >&2
sed -n '1,20p' "$invalid_browser_smoke_min_sections_log" >&2
exit 1
fi
grep -F 'explicitly checked for 26' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'wasm-safe core sources and 9 blocked sources' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'must reject malformed lines, absolute source paths,' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'unknown groups, unknown filters, unknown output modes, and duplicate source' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'must include the built LinuxCNC `lib` path and rpath' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'must surface helper failures instead of hiding them' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'Temporary probe reports must be cleaned on failure' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'Documentation-only build policy edits should still update the guardrail' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'CNC_SIM_WASM_CMAKE_SAFE_PROBE_SELF_CHECKS=1' docs/linuxcnc-source-policy.md >/dev/null
grep -F 'default actual CMake, syntax, and blocker probe paths remain fast' docs/linuxcnc-source-policy.md >/dev/null
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
grep -F 'convert_lathe_diameter_mode() scales G7/G8 X words and G76 I/J/K words' test-native.sh >/dev/null
grep -F 'tests/gcode/linuxcnc_lathe_diameter_mode.ngc' test-native.sh >/dev/null
grep -F 'tests/gcode/linuxcnc_lathe_diameter_g76.ngc' test-native.sh >/dev/null
grep -F 'tests/gcode/linuxcnc_readonly_named_parameters.ngc' test-native.sh >/dev/null
grep -F 'read_n_number()' test-linuxcnc-source-link.sh >/dev/null
grep -F 'tests/gcode/linuxcnc_fractional_linenumbers.ngc' test-linuxcnc-source-link.sh >/dev/null
grep -F 'tests/gcode/linuxcnc_extended_linenumbers.ngc' test-linuxcnc-source-link.sh >/dev/null
grep -F 'tests/gcode/linuxcnc_close_and_downcase_words.ngc' test-linuxcnc-source-link.sh >/dev/null
grep -F 'tests/gcode/linuxcnc_percent_file_ignores_trailing.ngc' test-linuxcnc-source-link.sh >/dev/null
grep -F 'linuxcnc_unclosed_comment_error|Unclosed comment found' test-linuxcnc-source-link.sh >/dev/null
grep -F 'linuxcnc_nested_comment_error|Nested comment found' test-linuxcnc-source-link.sh >/dev/null
grep -F 'linuxcnc_commented_percent_error|Bad character '\''%'\'' used' test-linuxcnc-source-link.sh >/dev/null
grep -F 'linuxcnc_mid_program_percent_error|Bad character '\''%'\'' used' test-linuxcnc-source-link.sh >/dev/null
for script in \
test-native.sh \
test-linuxcnc-source-syntax.sh \
test-linuxcnc-source-objects.sh \
test-linuxcnc-source-link.sh \
test-linuxcnc-rs274-native.sh \
test-linuxcnc-bridge-native.sh \
test-linuxcnc-api-native.sh \
build-wasm.sh; do
if CNC_SIM_BUILD_JOBS=0 "./$script" >"$invalid_build_jobs_log" 2>&1; then
echo "$script accepted invalid CNC_SIM_BUILD_JOBS" >&2
exit 1
fi
if ! grep -F "CNC_SIM_BUILD_JOBS must be a positive integer: 0" "$invalid_build_jobs_log" >/dev/null; then
echo "$script did not report invalid CNC_SIM_BUILD_JOBS clearly" >&2
sed -n '1,20p' "$invalid_build_jobs_log" >&2
exit 1
fi
done
if CNC_SIM_BUILD_JOBS=0 ./test-linuxcnc-wasm-cmake-safe-probe.sh >"$invalid_build_jobs_log" 2>&1; then
echo "test-linuxcnc-wasm-cmake-safe-probe.sh accepted invalid CNC_SIM_BUILD_JOBS" >&2
exit 1
fi
if ! grep -F "CNC_SIM_BUILD_JOBS must be a positive integer: 0" "$invalid_build_jobs_log" >/dev/null; then
echo "test-linuxcnc-wasm-cmake-safe-probe.sh did not report invalid CNC_SIM_BUILD_JOBS clearly" >&2
sed -n '1,20p' "$invalid_build_jobs_log" >&2
exit 1
fi
if CNC_SIM_WASM_CMAKE_SAFE_PROBE_BUILD_DIR=/ ./test-linuxcnc-wasm-cmake-safe-probe.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-wasm-cmake-safe-probe.sh accepted filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_WASM_CMAKE_SAFE_PROBE_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-wasm-cmake-safe-probe.sh did not report filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_WASM_CMAKE_SAFE_PROBE_BUILD_DIR= ./test-linuxcnc-wasm-cmake-safe-probe.sh >"$empty_build_dir_log" 2>&1; then
echo "test-linuxcnc-wasm-cmake-safe-probe.sh accepted empty build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_WASM_CMAKE_SAFE_PROBE_BUILD_DIR must not be empty" "$empty_build_dir_log" >/dev/null; then
echo "test-linuxcnc-wasm-cmake-safe-probe.sh did not report empty build dir clearly" >&2
sed -n '1,20p' "$empty_build_dir_log" >&2
exit 1
fi
if CNC_SIM_WASM_CMAKE_SAFE_PROBE_BUILD_DIR="build/wasm safe probe" ./test-linuxcnc-wasm-cmake-safe-probe.sh >"$whitespace_build_dir_log" 2>&1; then
echo "test-linuxcnc-wasm-cmake-safe-probe.sh accepted whitespace in build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_WASM_CMAKE_SAFE_PROBE_BUILD_DIR must not contain whitespace: build/wasm safe probe" "$whitespace_build_dir_log" >/dev/null; then
echo "test-linuxcnc-wasm-cmake-safe-probe.sh did not report whitespace build dir clearly" >&2
sed -n '1,20p' "$whitespace_build_dir_log" >&2
exit 1
fi
if CNC_SIM_NATIVE_BUILD_DIR=/ ./test-native.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-native.sh accepted filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_NATIVE_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-native.sh did not report filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_NATIVE_BUILD_DIR=/tmp/.. ./test-native.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-native.sh accepted canonical filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_NATIVE_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-native.sh did not report canonical filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_NATIVE_BUILD_DIR= ./test-native.sh >"$empty_build_dir_log" 2>&1; then
echo "test-native.sh accepted empty build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_NATIVE_BUILD_DIR must not be empty" "$empty_build_dir_log" >/dev/null; then
echo "test-native.sh did not report empty build dir clearly" >&2
sed -n '1,20p' "$empty_build_dir_log" >&2
exit 1
fi
if CNC_SIM_NATIVE_BUILD_DIR="build/native test" ./test-native.sh >"$whitespace_build_dir_log" 2>&1; then
echo "test-native.sh accepted whitespace in build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_NATIVE_BUILD_DIR must not contain whitespace: build/native test" "$whitespace_build_dir_log" >/dev/null; then
echo "test-native.sh did not report whitespace build dir clearly" >&2
sed -n '1,20p' "$whitespace_build_dir_log" >&2
exit 1
fi
if CNC_SIM_BRIDGE_NATIVE_BUILD_DIR=/ ./test-linuxcnc-bridge-native.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-bridge-native.sh accepted filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_BRIDGE_NATIVE_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-bridge-native.sh did not report filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_BRIDGE_NATIVE_BUILD_DIR=/tmp/.. ./test-linuxcnc-bridge-native.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-bridge-native.sh accepted canonical filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_BRIDGE_NATIVE_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-bridge-native.sh did not report canonical filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_BRIDGE_NATIVE_BUILD_DIR= ./test-linuxcnc-bridge-native.sh >"$empty_build_dir_log" 2>&1; then
echo "test-linuxcnc-bridge-native.sh accepted empty build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_BRIDGE_NATIVE_BUILD_DIR must not be empty" "$empty_build_dir_log" >/dev/null; then
echo "test-linuxcnc-bridge-native.sh did not report empty build dir clearly" >&2
sed -n '1,20p' "$empty_build_dir_log" >&2
exit 1
fi
if CNC_SIM_BRIDGE_NATIVE_BUILD_DIR="build/bridge native test" ./test-linuxcnc-bridge-native.sh >"$whitespace_build_dir_log" 2>&1; then
echo "test-linuxcnc-bridge-native.sh accepted whitespace in build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_BRIDGE_NATIVE_BUILD_DIR must not contain whitespace: build/bridge native test" "$whitespace_build_dir_log" >/dev/null; then
echo "test-linuxcnc-bridge-native.sh did not report whitespace build dir clearly" >&2
sed -n '1,20p' "$whitespace_build_dir_log" >&2
exit 1
fi
if CNC_SIM_API_NATIVE_BUILD_DIR=/ ./test-linuxcnc-api-native.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-api-native.sh accepted filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_API_NATIVE_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-api-native.sh did not report filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_API_NATIVE_BUILD_DIR=/tmp/.. ./test-linuxcnc-api-native.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-api-native.sh accepted canonical filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_API_NATIVE_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-api-native.sh did not report canonical filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_API_NATIVE_BUILD_DIR= ./test-linuxcnc-api-native.sh >"$empty_build_dir_log" 2>&1; then
echo "test-linuxcnc-api-native.sh accepted empty build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_API_NATIVE_BUILD_DIR must not be empty" "$empty_build_dir_log" >/dev/null; then
echo "test-linuxcnc-api-native.sh did not report empty build dir clearly" >&2
sed -n '1,20p' "$empty_build_dir_log" >&2
exit 1
fi
if CNC_SIM_API_NATIVE_BUILD_DIR="build/api native test" ./test-linuxcnc-api-native.sh >"$whitespace_build_dir_log" 2>&1; then
echo "test-linuxcnc-api-native.sh accepted whitespace in build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_API_NATIVE_BUILD_DIR must not contain whitespace: build/api native test" "$whitespace_build_dir_log" >/dev/null; then
echo "test-linuxcnc-api-native.sh did not report whitespace build dir clearly" >&2
sed -n '1,20p' "$whitespace_build_dir_log" >&2
exit 1
fi
if CNC_SIM_SOURCE_SYNTAX_BUILD_DIR=/ ./test-linuxcnc-source-syntax.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-source-syntax.sh accepted filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_SOURCE_SYNTAX_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-source-syntax.sh did not report filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_SOURCE_SYNTAX_BUILD_DIR=/tmp/.. ./test-linuxcnc-source-syntax.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-source-syntax.sh accepted canonical filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_SOURCE_SYNTAX_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-source-syntax.sh did not report canonical filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_SOURCE_SYNTAX_BUILD_DIR= ./test-linuxcnc-source-syntax.sh >"$empty_build_dir_log" 2>&1; then
echo "test-linuxcnc-source-syntax.sh accepted empty build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_SOURCE_SYNTAX_BUILD_DIR must not be empty" "$empty_build_dir_log" >/dev/null; then
echo "test-linuxcnc-source-syntax.sh did not report empty build dir clearly" >&2
sed -n '1,20p' "$empty_build_dir_log" >&2
exit 1
fi
if CNC_SIM_SOURCE_SYNTAX_BUILD_DIR="build/source syntax test" ./test-linuxcnc-source-syntax.sh >"$whitespace_build_dir_log" 2>&1; then
echo "test-linuxcnc-source-syntax.sh accepted whitespace in build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_SOURCE_SYNTAX_BUILD_DIR must not contain whitespace: build/source syntax test" "$whitespace_build_dir_log" >/dev/null; then
echo "test-linuxcnc-source-syntax.sh did not report whitespace build dir clearly" >&2
sed -n '1,20p' "$whitespace_build_dir_log" >&2
exit 1
fi
if CNC_SIM_SOURCE_OBJECTS_BUILD_DIR=/ ./test-linuxcnc-source-objects.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-source-objects.sh accepted filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_SOURCE_OBJECTS_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-source-objects.sh did not report filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_SOURCE_OBJECTS_BUILD_DIR=/tmp/.. ./test-linuxcnc-source-objects.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-source-objects.sh accepted normalized filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_SOURCE_OBJECTS_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-source-objects.sh did not report normalized filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_SOURCE_OBJECTS_BUILD_DIR= ./test-linuxcnc-source-objects.sh >"$empty_build_dir_log" 2>&1; then
echo "test-linuxcnc-source-objects.sh accepted empty build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_SOURCE_OBJECTS_BUILD_DIR must not be empty" "$empty_build_dir_log" >/dev/null; then
echo "test-linuxcnc-source-objects.sh did not report empty build dir clearly" >&2
sed -n '1,20p' "$empty_build_dir_log" >&2
exit 1
fi
if CNC_SIM_SOURCE_OBJECTS_BUILD_DIR="build/source objects test" ./test-linuxcnc-source-objects.sh >"$whitespace_build_dir_log" 2>&1; then
echo "test-linuxcnc-source-objects.sh accepted whitespace in build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_SOURCE_OBJECTS_BUILD_DIR must not contain whitespace: build/source objects test" "$whitespace_build_dir_log" >/dev/null; then
echo "test-linuxcnc-source-objects.sh did not report whitespace build dir clearly" >&2
sed -n '1,20p' "$whitespace_build_dir_log" >&2
exit 1
fi
if CNC_SIM_RS274_NATIVE_BUILD_DIR=/ ./test-linuxcnc-rs274-native.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-rs274-native.sh accepted filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_RS274_NATIVE_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-rs274-native.sh did not report filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_RS274_NATIVE_BUILD_DIR=/tmp/.. ./test-linuxcnc-rs274-native.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-rs274-native.sh accepted normalized filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_RS274_NATIVE_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-rs274-native.sh did not report normalized filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_RS274_NATIVE_BUILD_DIR= ./test-linuxcnc-rs274-native.sh >"$empty_build_dir_log" 2>&1; then
echo "test-linuxcnc-rs274-native.sh accepted empty build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_RS274_NATIVE_BUILD_DIR must not be empty" "$empty_build_dir_log" >/dev/null; then
echo "test-linuxcnc-rs274-native.sh did not report empty build dir clearly" >&2
sed -n '1,20p' "$empty_build_dir_log" >&2
exit 1
fi
if CNC_SIM_RS274_NATIVE_BUILD_DIR="build/rs274 native test" ./test-linuxcnc-rs274-native.sh >"$whitespace_build_dir_log" 2>&1; then
echo "test-linuxcnc-rs274-native.sh accepted whitespace in build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_RS274_NATIVE_BUILD_DIR must not contain whitespace: build/rs274 native test" "$whitespace_build_dir_log" >/dev/null; then
echo "test-linuxcnc-rs274-native.sh did not report whitespace build dir clearly" >&2
sed -n '1,20p' "$whitespace_build_dir_log" >&2
exit 1
fi
if CNC_SIM_SOURCE_LINK_BUILD_DIR=/ ./test-linuxcnc-source-link.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-source-link.sh accepted filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_SOURCE_LINK_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-source-link.sh did not report filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_SOURCE_LINK_BUILD_DIR=/tmp/.. ./test-linuxcnc-source-link.sh >"$invalid_build_dir_log" 2>&1; then
echo "test-linuxcnc-source-link.sh accepted canonical filesystem root as build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_SOURCE_LINK_BUILD_DIR must not be the filesystem root" "$invalid_build_dir_log" >/dev/null; then
echo "test-linuxcnc-source-link.sh did not report canonical filesystem-root build dir clearly" >&2
sed -n '1,20p' "$invalid_build_dir_log" >&2
exit 1
fi
if CNC_SIM_SOURCE_LINK_BUILD_DIR= ./test-linuxcnc-source-link.sh >"$empty_build_dir_log" 2>&1; then
echo "test-linuxcnc-source-link.sh accepted empty build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_SOURCE_LINK_BUILD_DIR must not be empty" "$empty_build_dir_log" >/dev/null; then
echo "test-linuxcnc-source-link.sh did not report empty build dir clearly" >&2
sed -n '1,20p' "$empty_build_dir_log" >&2
exit 1
fi
if CNC_SIM_SOURCE_LINK_BUILD_DIR="build/source link test" ./test-linuxcnc-source-link.sh >"$whitespace_build_dir_log" 2>&1; then
echo "test-linuxcnc-source-link.sh accepted whitespace in build dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_SOURCE_LINK_BUILD_DIR must not contain whitespace: build/source link test" "$whitespace_build_dir_log" >/dev/null; then
echo "test-linuxcnc-source-link.sh did not report whitespace build dir clearly" >&2
sed -n '1,20p' "$whitespace_build_dir_log" >&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
grep -Fx -- "-fpermissive" <<<"$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
grep -F "target_compile_definitions(cnc_sim_objects" core/CMakeLists.txt >/dev/null
grep -F "CNC_SIM_ENABLE_LINUXCNC_RS274_BACKEND" core/CMakeLists.txt >/dev/null
grep -F 'target_link_directories(cnc_sim_core' core/CMakeLists.txt >/dev/null
grep -F "add_executable(cnc_sim_api_linuxcnc_rs274_smoke" core/CMakeLists.txt >/dev/null
grep -F "target_link_libraries(cnc_sim_core" core/CMakeLists.txt >/dev/null
grep -F "rs274" core/CMakeLists.txt >/dev/null
grep -F "tooldata" core/CMakeLists.txt >/dev/null
grep -F "Python3::Python" core/CMakeLists.txt >/dev/null
grep -F '"-Wl,-rpath,${CNC_SIM_LINUXCNC_ROOT}/lib"' core/CMakeLists.txt >/dev/null
grep -F "add_library(cnc_sim_linuxcnc_canon_bridge STATIC" core/CMakeLists.txt >/dev/null
grep -F "target_link_libraries(cnc_sim_linuxcnc_canon_bridge PRIVATE cnc_sim_core tooldata)" core/CMakeLists.txt >/dev/null
grep -F './list-linuxcnc-rs274-dump-project-sources.sh > "$project_source_list"' test-linuxcnc-source-link.sh >/dev/null
grep -F './list-linuxcnc-rs274-dump-project-sources.sh > "$project_source_list"' test-linuxcnc-rs274-native.sh >/dev/null
grep -F './list-linuxcnc-rs274-api-project-sources.sh > "$project_source_list"' test-linuxcnc-api-native.sh >/dev/null
grep -F './list-cnc-sim-core-sources.sh --with-smoke > "$core_source_list"' test-native.sh >/dev/null
grep -F -- '-DCNC_SIM_ENABLE_SMOKE_BACKEND' test-native.sh >/dev/null
grep -F 'option(CNC_SIM_ENABLE_SMOKE_BACKEND "Build the legacy explicit smoke G-code backend test harness" OFF)' core/CMakeLists.txt >/dev/null
grep -F 'CNC_SIM_ENABLE_SMOKE_BACKEND cannot be combined with CNC_SIM_ENABLE_LINUXCNC_RS274_BACKEND' core/CMakeLists.txt >/dev/null
grep -F 'smoke backend is not compiled into this build' core/src/gcode_backend.cpp >/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 -Fx 'trap cleanup_source_syntax_temps EXIT' test-linuxcnc-source-syntax.sh >/dev/null
if grep -Fx "trap 'rm -f \"\$source_list\" \"\$missing_source_manifest\" \"\$missing_source_log\"' EXIT" 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 \
test-linuxcnc-source-link.sh \
test-linuxcnc-bridge-native.sh \
test-linuxcnc-rs274-native.sh \
test-linuxcnc-api-native.sh; do
if LINUXCNC_ROOT="$missing_root" "./$script" >"$missing_root_log" 2>&1; then
echo "$script accepted missing LinuxCNC root: $missing_root" >&2
exit 1
fi
if ! grep -F "missing LinuxCNC root: $missing_root" "$missing_root_log" >/dev/null; then
echo "$script did not report missing LinuxCNC root clearly" >&2
sed -n '1,20p' "$missing_root_log" >&2
exit 1
fi
done
rm -f "$missing_manifest"
for script in \
list-linuxcnc-source-manifest-sources.sh \
test-linuxcnc-source-syntax.sh \
test-linuxcnc-source-objects.sh \
test-linuxcnc-source-link.sh; do
if "./$script" "$missing_manifest" >"$missing_manifest_log" 2>&1; then
echo "$script accepted missing manifest: $missing_manifest" >&2
exit 1
fi
if ! grep -F "missing manifest: $missing_manifest" "$missing_manifest_log" >/dev/null; then
echo "$script did not report missing manifest clearly" >&2
sed -n '1,20p' "$missing_manifest_log" >&2
exit 1
fi
done
printf 'bogus:src/emc/rs274ngc/interp_arc.cc:test unknown group\n' >"$unknown_group_manifest"
for script in \
list-linuxcnc-source-manifest-sources.sh \
test-linuxcnc-source-syntax.sh \
test-linuxcnc-source-objects.sh \
test-linuxcnc-source-link.sh; do
if "./$script" "$unknown_group_manifest" >"$unknown_group_log" 2>&1; then
echo "$script accepted unknown manifest group" >&2
exit 1
fi
if ! grep -F "unknown manifest group: bogus" "$unknown_group_log" >/dev/null; then
echo "$script did not report unknown manifest group clearly" >&2
sed -n '1,20p' "$unknown_group_log" >&2
exit 1
fi
done
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 \
test-linuxcnc-source-syntax.sh \
test-linuxcnc-source-objects.sh \
test-linuxcnc-source-link.sh; do
if "./$script" "$duplicate_manifest" >"$duplicate_log" 2>&1; then
echo "$script accepted duplicate manifest source" >&2
exit 1
fi
if ! grep -F "duplicate manifest source: src/emc/rs274ngc/interp_arc.cc" "$duplicate_log" >/dev/null; then
echo "$script did not report duplicate manifest source clearly" >&2
sed -n '1,20p' "$duplicate_log" >&2
exit 1
fi
done
printf 'core:src/emc/rs274ngc/interp_arc.cc\n' >"$bad_line_manifest"
if ./list-linuxcnc-manifest-sources.sh \
"$bad_line_manifest" \
core \
relative \
core \
core \
"missing manifest source" >"$bad_line_log" 2>&1; then
echo "common manifest source lister accepted bad manifest line" >&2
exit 1
fi
if ! grep -F "bad manifest line 1: core:src/emc/rs274ngc/interp_arc.cc" "$bad_line_log" >/dev/null; then
echo "common manifest source lister did not report bad manifest line clearly" >&2
sed -n '1,20p' "$bad_line_log" >&2
exit 1
fi
for script in \
list-linuxcnc-source-manifest-sources.sh \
test-linuxcnc-source-syntax.sh \
test-linuxcnc-source-objects.sh \
test-linuxcnc-source-link.sh; do
if "./$script" "$bad_line_manifest" >"$bad_line_log" 2>&1; then
echo "$script accepted bad manifest line" >&2
exit 1
fi
if ! grep -F "bad manifest line 1: core:src/emc/rs274ngc/interp_arc.cc" "$bad_line_log" >/dev/null; then
echo "$script did not report bad manifest line clearly" >&2
sed -n '1,20p' "$bad_line_log" >&2
exit 1
fi
done
./list-linuxcnc-source-manifest-sources.sh "$manifest" core >/dev/null
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
native_manifest_metadata=$(./list-linuxcnc-source-manifest-sources.sh "$manifest" metadata)
grep -Fx "src/emc/rs274ngc/Submakefile" <<<"$native_manifest_metadata" >/dev/null
grep -Fx "src/emc/rs274ngc/meson.build" <<<"$native_manifest_metadata" >/dev/null
rs274ngc_manifest_entries=$(./list-linuxcnc-source-manifest-sources.sh "$manifest" all | grep '^src/emc/rs274ngc/' | sort)
rs274ngc_source_entries=$(find "$linuxcnc_root/src/emc/rs274ngc" -maxdepth 1 -type f -printf 'src/emc/rs274ngc/%f\n' | sort)
if ! diff -u <(printf '%s\n' "$rs274ngc_source_entries") <(printf '%s\n' "$rs274ngc_manifest_entries") >/dev/null; then
echo "native rs274ngc manifest no longer covers the full LinuxCNC source directory" >&2
diff -u <(printf '%s\n' "$rs274ngc_source_entries") <(printf '%s\n' "$rs274ngc_manifest_entries") >&2 || true
exit 1
fi
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" core,header >"$unknown_filter_log" 2>&1; then
echo "native manifest source lister accepted a compound filter" >&2
exit 1
fi
if ! grep -F "manifest source filter must be a manifest group name: core,header" "$unknown_filter_log" >/dev/null; then
echo "native manifest source lister did not report compound filters clearly" >&2
sed -n '1,20p' "$unknown_filter_log" >&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
fi
if ! grep -F "unknown manifest source filter: bogus" "$unknown_filter_log" >/dev/null; then
echo "native manifest source lister did not report unknown filter clearly" >&2
sed -n '1,20p' "$unknown_filter_log" >&2
exit 1
fi
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
fi
if ! grep -F "unknown manifest source output mode: bogus" "$unknown_output_log" >/dev/null; then
echo "native manifest source lister did not report unknown output mode clearly" >&2
sed -n '1,20p' "$unknown_output_log" >&2
exit 1
fi
native_manifest_core_full=$(LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-manifest-sources.sh "$manifest" core full)
linuxcnc_root_full=$(cd "$linuxcnc_root" && pwd)
grep -Fx "$linuxcnc_root_full/src/emc/rs274ngc/interp_arc.cc" <<<"$native_manifest_core_full" >/dev/null
kinematics_manifest_config=$(./list-linuxcnc-kinematics-manifest-sources.sh linuxcnc-kinematics-source-files.txt config)
grep -Fx "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini" <<<"$kinematics_manifest_config" >/dev/null
grep -Fx "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini" <<<"$kinematics_manifest_config" >/dev/null
grep -Fx "configs/sim/axis/vismach/puma/puma560_dh.hal" <<<"$kinematics_manifest_config" >/dev/null
kinematics_manifest_asset=$(./list-linuxcnc-kinematics-manifest-sources.sh linuxcnc-kinematics-source-files.txt asset)
grep -Fx "configs/sim/axis/vismach/5axis/bridgemill/README" <<<"$kinematics_manifest_asset" >/dev/null
grep -Fx "src/hal/user_comps/vismach/5axisgui.py" <<<"$kinematics_manifest_asset" >/dev/null
grep -Fx "share/qtvcp/panels/vismach_scara/vismach_scara.ui" <<<"$kinematics_manifest_asset" >/dev/null
kinematics_manifest_tooldata=$(./list-linuxcnc-kinematics-manifest-sources.sh linuxcnc-kinematics-source-files.txt tooldata)
grep -Fx "configs/sim/axis/vismach/5axis/bridgemill/5axis.tbl" <<<"$kinematics_manifest_tooldata" >/dev/null
grep -Fx "configs/sim/axis/vismach/millturn/millturn.tbl" <<<"$kinematics_manifest_tooldata" >/dev/null
grep -Fx "configs/sim/qtaxis/non-trivial/scara/scara.tbl" <<<"$kinematics_manifest_tooldata" >/dev/null
if [[ "$(grep -Ec '\.tbl$' <<<"$kinematics_manifest_tooldata")" -ne 10 ]]; then
echo "all-native guardrail expected all LinuxCNC switchkins TOOL_TABLE tooldata sources" >&2
exit 1
fi
kinematics_manifest_generated=$(./list-linuxcnc-kinematics-manifest-sources.sh linuxcnc-kinematics-source-files.txt generated)
grep -Fx "src/objects/hal/components/xyzab_tdr_kins.c" <<<"$kinematics_manifest_generated" >/dev/null
grep -Fx "src/objects/hal/components/xyzacb_trsrn.c" <<<"$kinematics_manifest_generated" >/dev/null
grep -Fx "src/objects/hal/components/xyzbca_trsrn.c" <<<"$kinematics_manifest_generated" >/dev/null
kinematics_manifest_config_full=$(LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-kinematics-manifest-sources.sh linuxcnc-kinematics-source-files.txt config full)
grep -Fx "$linuxcnc_root_full/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini" <<<"$kinematics_manifest_config_full" >/dev/null
if ./list-linuxcnc-kinematics-manifest-sources.sh linuxcnc-kinematics-source-files.txt core,header >"$kinematics_unknown_filter_log" 2>&1; then
echo "kinematics manifest source lister accepted a compound filter" >&2
exit 1
fi
if ! grep -F "manifest source filter must be a manifest group name: core,header" "$kinematics_unknown_filter_log" >/dev/null; then
echo "kinematics manifest source lister did not report compound filters clearly" >&2
sed -n '1,20p' "$kinematics_unknown_filter_log" >&2
exit 1
fi
if ./list-linuxcnc-kinematics-manifest-sources.sh linuxcnc-kinematics-source-files.txt bogus >"$kinematics_unknown_filter_log" 2>&1; then
echo "kinematics manifest source lister accepted unknown filter" >&2
exit 1
fi
if ! grep -F "unknown manifest source filter: bogus" "$kinematics_unknown_filter_log" >/dev/null; then
echo "kinematics manifest source lister did not report unknown filter clearly" >&2
sed -n '1,20p' "$kinematics_unknown_filter_log" >&2
exit 1
fi
if ./list-linuxcnc-kinematics-manifest-sources.sh linuxcnc-kinematics-source-files.txt config bogus >"$kinematics_unknown_output_log" 2>&1; then
echo "kinematics manifest source lister accepted unknown output mode" >&2
exit 1
fi
if ! grep -F "unknown manifest source output mode: bogus" "$kinematics_unknown_output_log" >/dev/null; then
echo "kinematics manifest source lister did not report unknown output mode clearly" >&2
sed -n '1,20p' "$kinematics_unknown_output_log" >&2
exit 1
fi
kinematics_manifest_metadata=$(./list-linuxcnc-kinematics-manifest-sources.sh linuxcnc-kinematics-source-files.txt metadata)
grep -Fx "src/objects/man/man9/corexy_by_hal.9.adoc" <<<"$kinematics_manifest_metadata" >/dev/null
grep -Fx "src/objects/man/man9/gantry.9.adoc" <<<"$kinematics_manifest_metadata" >/dev/null
grep -Fx "src/objects/man/man9/matrixkins.9.adoc" <<<"$kinematics_manifest_metadata" >/dev/null
grep -Fx "src/objects/man/man9/millturn.9.adoc" <<<"$kinematics_manifest_metadata" >/dev/null
grep -Fx "src/objects/man/man9/userkins.9.adoc" <<<"$kinematics_manifest_metadata" >/dev/null
grep -Fx "src/objects/man/man9/xyzab_tdr_kins.9.adoc" <<<"$kinematics_manifest_metadata" >/dev/null
grep -Fx "src/objects/man/man9/xyzacb_trsrn.9.adoc" <<<"$kinematics_manifest_metadata" >/dev/null
grep -Fx "src/objects/man/man9/xyzbca_trsrn.9.adoc" <<<"$kinematics_manifest_metadata" >/dev/null
if [[ "$(grep -Ec '^src/objects/man/man9/(corexy_by_hal|gantry|matrixkins|millturn|userkins|xyzab_tdr_kins|xyzacb_trsrn|xyzbca_trsrn)\.9\.adoc$' <<<"$kinematics_manifest_metadata")" -ne 8 ]]; then
echo "all-native guardrail expected all LinuxCNC generated component manpage metadata sources" >&2
exit 1
fi
grep -F 'manifest does not cover all LinuxCNC generated component manpage sources adjacent to generated kinematics sources' check-linuxcnc-inputs.sh >/dev/null
grep -F 'configs/sim/axis/vismach/hexapod-sim/hexapod.ini TOOL_TABLE=hexapod.tbl' check-linuxcnc-inputs.sh >/dev/null
grep -F 'configs/sim/axis/vismach/scara/scara.ini TOOL_TABLE=scara.tbl' check-linuxcnc-inputs.sh >/dev/null
grep -F 'configs/sim/qtvcp_screens/non-trivial/scara/scara.ini TOOL_TABLE=scara.tbl' check-linuxcnc-inputs.sh >/dev/null
grep -F 'LinuxCNC M428/M429/M430 INI TOOL_TABLE files have new unresolved sources' check-linuxcnc-inputs.sh >/dev/null
grep -F 'LinuxCNC M428/M429/M430 INI TOOL_TABLE unresolved source set changed' check-linuxcnc-inputs.sh >/dev/null
if ./check-linuxcnc-switchkins-remap-table.sh --unknown >"$switchkins_checker_unknown_option_log" 2>&1; then
echo "switchkins remap table checker accepted an unknown option" >&2
exit 1
fi
if ! grep -F "unknown switchkins remap table checker option: --unknown" "$switchkins_checker_unknown_option_log" >/dev/null; then
echo "switchkins remap table checker did not report unknown options clearly" >&2
sed -n '1,20p' "$switchkins_checker_unknown_option_log" >&2
exit 1
fi
if ./check-linuxcnc-switchkins-remap-table.sh linuxcnc-kinematics-source-files.txt extra >"$switchkins_checker_too_many_args_log" 2>&1; then
echo "switchkins remap table checker accepted too many arguments" >&2
exit 1
fi
if ! grep -F "too many switchkins remap table checker arguments" "$switchkins_checker_too_many_args_log" >/dev/null; then
echo "switchkins remap table checker did not report too many arguments clearly" >&2
sed -n '1,20p' "$switchkins_checker_too_many_args_log" >&2
exit 1
fi
if ./check-linuxcnc-inputs-cached.sh --cache-dir >"$inputs_cached_missing_cache_dir_log" 2>&1; then
echo "cached LinuxCNC input checker accepted --cache-dir without a value" >&2
exit 1
fi
if ! grep -F "missing --cache-dir value" "$inputs_cached_missing_cache_dir_log" >/dev/null; then
echo "cached LinuxCNC input checker did not report missing cache-dir values clearly" >&2
sed -n '1,20p' "$inputs_cached_missing_cache_dir_log" >&2
exit 1
fi
if ./check-linuxcnc-inputs-cached.sh --cache-dir "build/input cache" \
linuxcnc-rs274-source-files.txt >"$inputs_cached_whitespace_cache_dir_log" 2>&1; then
echo "cached LinuxCNC input checker accepted whitespace in cache dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_PREFLIGHT_CACHE_DIR must not contain whitespace: build/input cache" \
"$inputs_cached_whitespace_cache_dir_log" >/dev/null; then
echo "cached LinuxCNC input checker did not report whitespace cache dirs clearly" >&2
sed -n '1,20p' "$inputs_cached_whitespace_cache_dir_log" >&2
exit 1
fi
if ./check-linuxcnc-switchkins-remap-table-cached.sh --cache-dir >"$switchkins_cached_missing_cache_dir_log" 2>&1; then
echo "cached switchkins remap table checker accepted --cache-dir without a value" >&2
exit 1
fi
if ! grep -F "missing --cache-dir value" "$switchkins_cached_missing_cache_dir_log" >/dev/null; then
echo "cached switchkins remap table checker did not report missing cache-dir values clearly" >&2
sed -n '1,20p' "$switchkins_cached_missing_cache_dir_log" >&2
exit 1
fi
if ./check-linuxcnc-switchkins-remap-table-cached.sh --cache-dir "build/switchkins cache" \
linuxcnc-kinematics-source-files.txt >"$switchkins_cached_whitespace_cache_dir_log" 2>&1; then
echo "cached switchkins remap table checker accepted whitespace in cache dir" >&2
exit 1
fi
if ! grep -F "CNC_SIM_PREFLIGHT_CACHE_DIR must not contain whitespace: build/switchkins cache" \
"$switchkins_cached_whitespace_cache_dir_log" >/dev/null; then
echo "cached switchkins remap table checker did not report whitespace cache dirs clearly" >&2
sed -n '1,20p' "$switchkins_cached_whitespace_cache_dir_log" >&2
exit 1
fi
if ./generate-linuxcnc-switchkins-remap-table.sh --unknown >"$switchkins_generator_unknown_option_log" 2>&1; then
echo "switchkins remap table generator accepted an unknown option" >&2
exit 1
fi
if ! grep -F "unknown switchkins remap table generator option: --unknown" \
"$switchkins_generator_unknown_option_log" >/dev/null; then
echo "switchkins remap table generator did not report unknown options clearly" >&2
sed -n '1,20p' "$switchkins_generator_unknown_option_log" >&2
exit 1
fi
if ./generate-linuxcnc-switchkins-remap-table.sh --all-output-dir \
>"$switchkins_generator_missing_output_dir_log" 2>&1; then
echo "switchkins remap table generator accepted --all-output-dir without a directory" >&2
exit 1
fi
if ! grep -F "missing output directory for --all-output-dir" \
"$switchkins_generator_missing_output_dir_log" >/dev/null; then
echo "switchkins remap table generator did not report missing output directories clearly" >&2
sed -n '1,20p' "$switchkins_generator_missing_output_dir_log" >&2
exit 1
fi
if ./generate-linuxcnc-switchkins-remap-table.sh linuxcnc-kinematics-source-files.txt extra \
>"$switchkins_generator_too_many_args_log" 2>&1; then
echo "switchkins remap table generator accepted too many arguments" >&2
exit 1
fi
if ! grep -F "too many switchkins remap table generator arguments" \
"$switchkins_generator_too_many_args_log" >/dev/null; then
echo "switchkins remap table generator did not report too many arguments clearly" >&2
sed -n '1,20p' "$switchkins_generator_too_many_args_log" >&2
exit 1
fi
if ./generate-linuxcnc-switchkins-remap-table.sh --all-output-dir "build/switchkins output" \
linuxcnc-kinematics-source-files.txt >"$switchkins_generator_whitespace_output_dir_log" 2>&1; then
echo "switchkins remap table generator accepted whitespace in output dir" >&2
exit 1
fi
if ! grep -F "switchkins remap output directory must not contain whitespace: build/switchkins output" \
"$switchkins_generator_whitespace_output_dir_log" >/dev/null; then
echo "switchkins remap table generator did not report whitespace output dirs clearly" >&2
sed -n '1,20p' "$switchkins_generator_whitespace_output_dir_log" >&2
exit 1
fi
grep -Fx "HALCMD = sets :x-offset -20" "$linuxcnc_root/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini" >/dev/null
grep -Fx "HALCMD = sets :z-offset -15" "$linuxcnc_root/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini" >/dev/null
grep -Fx "HALCMD = setp xyzbc-trt-kins.x-rot-point 0" "$linuxcnc_root/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini" >/dev/null
grep -Fx "HALCMD = setp xyzbc-trt-kins.conventional-directions 0" "$linuxcnc_root/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini" >/dev/null
grep -Fx "HALCMD = sets :z-offset 10" "$linuxcnc_root/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini" >/dev/null
grep -Fx "HALCMD = setp xyzac-trt-kins.conventional-directions 0" "$linuxcnc_root/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini" >/dev/null
grep -Fx "setp genserkins.A-2 17" "$linuxcnc_root/configs/sim/axis/vismach/puma/puma560_dh.hal" >/dev/null
grep -Fx "setp genserkins.ALPHA-4 -1.570796326" "$linuxcnc_root/configs/sim/axis/vismach/puma/puma560_dh.hal" >/dev/null
grep -Fx "setp genserkins.D-0 26.45" "$linuxcnc_root/configs/sim/axis/vismach/puma/puma560_dh.hal" >/dev/null
puma560_dh_output=$(LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-puma560-dh-parameters.sh)
grep -Fx " parameters.a[2] = 17;" <<<"$puma560_dh_output" >/dev/null
grep -Fx " parameters.alpha[4] = -1.570796326;" <<<"$puma560_dh_output" >/dev/null
grep -Fx " parameters.d[0] = 26.45;" <<<"$puma560_dh_output" >/dev/null
if ./generate-linuxcnc-puma560-dh-parameters.sh --unknown >"$puma560_dh_unknown_option_log" 2>&1; then
echo "Puma560 DH generator accepted an unknown option" >&2
exit 1
fi
if ! grep -F "unknown LinuxCNC puma560 DH generator option: --unknown" "$puma560_dh_unknown_option_log" >/dev/null; then
echo "Puma560 DH generator did not report unknown options clearly" >&2
sed -n '1,20p' "$puma560_dh_unknown_option_log" >&2
exit 1
fi
if ./generate-linuxcnc-puma560-dh-parameters.sh \
configs/sim/axis/vismach/puma/puma560_dh.hal extra >"$puma560_dh_too_many_args_log" 2>&1; then
echo "Puma560 DH generator accepted too many arguments" >&2
exit 1
fi
if ! grep -F "too many LinuxCNC puma560 DH generator arguments" "$puma560_dh_too_many_args_log" >/dev/null; then
echo "Puma560 DH generator did not report too many arguments clearly" >&2
sed -n '1,20p' "$puma560_dh_too_many_args_log" >&2
exit 1
fi
if ./generate-linuxcnc-puma560-dh-parameters.sh \
../configs/sim/axis/vismach/puma/puma560_dh.hal >"$puma560_dh_escaped_source_log" 2>&1; then
echo "Puma560 DH generator accepted an escaped LinuxCNC source path" >&2
exit 1
fi
if ! grep -F "LinuxCNC puma560 DH HAL source path must stay LinuxCNC-root relative: ../configs/sim/axis/vismach/puma/puma560_dh.hal" \
"$puma560_dh_escaped_source_log" >/dev/null; then
echo "Puma560 DH generator did not report escaped source paths clearly" >&2
sed -n '1,20p' "$puma560_dh_escaped_source_log" >&2
exit 1
fi
if ./generate-linuxcnc-puma560-dh-parameters.sh \
configs/sim/axis/vismach/puma/puma560.ini >"$puma560_dh_non_hal_source_log" 2>&1; then
echo "Puma560 DH generator accepted a non-HAL source path" >&2
exit 1
fi
if ! grep -F "LinuxCNC puma560 DH source must be a HAL file: configs/sim/axis/vismach/puma/puma560.ini" \
"$puma560_dh_non_hal_source_log" >/dev/null; then
echo "Puma560 DH generator did not report non-HAL source paths clearly" >&2
sed -n '1,20p' "$puma560_dh_non_hal_source_log" >&2
exit 1
fi
if ./list-linuxcnc-source-files.sh --missing-message >"$source_files_missing_message_log" 2>&1; then
echo "LinuxCNC source file lister accepted --missing-message without a value" >&2
exit 1
fi
if ! grep -F "missing --missing-message value" "$source_files_missing_message_log" >/dev/null; then
echo "LinuxCNC source file lister did not report missing --missing-message values clearly" >&2
sed -n '1,20p' "$source_files_missing_message_log" >&2
exit 1
fi
if ./list-linuxcnc-source-files.sh --unknown src/emc/rs274ngc/interp_arc.cc \
>"$source_files_unknown_option_log" 2>&1; then
echo "LinuxCNC source file lister accepted an unknown option" >&2
exit 1
fi
if ! grep -F "unknown source file option: --unknown" "$source_files_unknown_option_log" >/dev/null; then
echo "LinuxCNC source file lister did not report unknown options clearly" >&2
sed -n '1,20p' "$source_files_unknown_option_log" >&2
exit 1
fi
if ./list-linuxcnc-source-files.sh ../src/emc/rs274ngc/interp_arc.cc \
>"$source_files_escaped_source_log" 2>&1; then
echo "LinuxCNC source file lister accepted an escaped source path" >&2
exit 1
fi
if ! grep -F "LinuxCNC source path must be root-relative: ../src/emc/rs274ngc/interp_arc.cc" \
"$source_files_escaped_source_log" >/dev/null; then
echo "LinuxCNC source file lister did not report escaped source paths clearly" >&2
sed -n '1,20p' "$source_files_escaped_source_log" >&2
exit 1
fi
if ./list-linuxcnc-source-common-cxxflags.sh --unknown >"$source_cxxflag_unknown_option_log" 2>&1; then
echo "LinuxCNC source CXX flag lister accepted an unknown option" >&2
exit 1
fi
if ! grep -F "unknown source cxxflag option: --unknown" "$source_cxxflag_unknown_option_log" >/dev/null; then
echo "LinuxCNC source CXX flag lister did not report unknown options clearly" >&2
sed -n '1,20p' "$source_cxxflag_unknown_option_log" >&2
exit 1
fi
if ./list-linuxcnc-wasm-common-cxxflags.sh --profile >"$wasm_cxxflag_missing_profile_log" 2>&1; then
echo "LinuxCNC wasm CXX flag lister accepted --profile without a value" >&2
exit 1
fi
if ! grep -F "missing --profile value" "$wasm_cxxflag_missing_profile_log" >/dev/null; then
echo "LinuxCNC wasm CXX flag lister did not report missing profile values clearly" >&2
sed -n '1,20p' "$wasm_cxxflag_missing_profile_log" >&2
exit 1
fi
if ./list-linuxcnc-wasm-common-cxxflags.sh --unknown >"$wasm_cxxflag_unknown_option_log" 2>&1; then
echo "LinuxCNC wasm CXX flag lister accepted an unknown option" >&2
exit 1
fi
if ! grep -F "unknown wasm cxxflag option: --unknown" "$wasm_cxxflag_unknown_option_log" >/dev/null; then
echo "LinuxCNC wasm CXX flag lister did not report unknown options clearly" >&2
sed -n '1,20p' "$wasm_cxxflag_unknown_option_log" >&2
exit 1
fi
if ./list-linuxcnc-wasm-common-cxxflags.sh --profile bogus >"$wasm_cxxflag_unknown_profile_log" 2>&1; then
echo "LinuxCNC wasm CXX flag lister accepted an unknown profile" >&2
exit 1
fi
if ! grep -F "unknown wasm cxxflag profile: bogus" "$wasm_cxxflag_unknown_profile_log" >/dev/null; then
echo "LinuxCNC wasm CXX flag lister did not report unknown profiles clearly" >&2
sed -n '1,20p' "$wasm_cxxflag_unknown_profile_log" >&2
exit 1
fi
./list-linuxcnc-rs274-dump-project-sources.sh >/dev/null
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
rs274_dump_corexy_source=$(./list-linuxcnc-rs274-dump-project-sources.sh linuxcnc_corexykins_adapter.cpp)
grep -Fx "core/src/linuxcnc_corexykins_adapter.cpp" <<<"$rs274_dump_corexy_source" >/dev/null
rs274_dump_cubic_source=$(./list-linuxcnc-rs274-dump-project-sources.sh linuxcnc_cubic_adapter.cpp)
grep -Fx "core/src/linuxcnc_cubic_adapter.cpp" <<<"$rs274_dump_cubic_source" >/dev/null
rs274_dump_genhex_source=$(./list-linuxcnc-rs274-dump-project-sources.sh linuxcnc_genhexkins_adapter.cpp)
grep -Fx "core/src/linuxcnc_genhexkins_adapter.cpp" <<<"$rs274_dump_genhex_source" >/dev/null
rs274_dump_lineardelta_source=$(./list-linuxcnc-rs274-dump-project-sources.sh linuxcnc_lineardeltakins_adapter.cpp)
grep -Fx "core/src/linuxcnc_lineardeltakins_adapter.cpp" <<<"$rs274_dump_lineardelta_source" >/dev/null
rs274_dump_rotarydelta_source=$(./list-linuxcnc-rs274-dump-project-sources.sh linuxcnc_rotarydeltakins_adapter.cpp)
grep -Fx "core/src/linuxcnc_rotarydeltakins_adapter.cpp" <<<"$rs274_dump_rotarydelta_source" >/dev/null
rs274_dump_maxkins_source=$(./list-linuxcnc-rs274-dump-project-sources.sh linuxcnc_maxkins_adapter.cpp)
grep -Fx "core/src/linuxcnc_maxkins_adapter.cpp" <<<"$rs274_dump_maxkins_source" >/dev/null
rs274_dump_pentakins_source=$(./list-linuxcnc-rs274-dump-project-sources.sh linuxcnc_pentakins_adapter.cpp)
grep -Fx "core/src/linuxcnc_pentakins_adapter.cpp" <<<"$rs274_dump_pentakins_source" >/dev/null
rs274_dump_rosekins_source=$(./list-linuxcnc-rs274-dump-project-sources.sh linuxcnc_rosekins_adapter.cpp)
grep -Fx "core/src/linuxcnc_rosekins_adapter.cpp" <<<"$rs274_dump_rosekins_source" >/dev/null
rs274_dump_scorbot_source=$(./list-linuxcnc-rs274-dump-project-sources.sh linuxcnc_scorbot_kins_adapter.cpp)
grep -Fx "core/src/linuxcnc_scorbot_kins_adapter.cpp" <<<"$rs274_dump_scorbot_source" >/dev/null
rs274_dump_tripodkins_source=$(./list-linuxcnc-rs274-dump-project-sources.sh linuxcnc_tripodkins_adapter.cpp)
grep -Fx "core/src/linuxcnc_tripodkins_adapter.cpp" <<<"$rs274_dump_tripodkins_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
fi
if ! grep -F "missing LinuxCNC rs274 dump project source in list: does_not_exist.cc" "$missing_dump_source_log" >/dev/null; then
echo "rs274 dump project source lister did not report missing source filter clearly" >&2
sed -n '1,20p' "$missing_dump_source_log" >&2
exit 1
fi
./list-linuxcnc-rs274-api-project-sources.sh >/dev/null
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 smoke_gcode_parser.cpp >"$missing_api_source_log" 2>&1; then
echo "rs274 API project source lister included smoke backend source" >&2
exit 1
fi
if ! grep -F "missing LinuxCNC rs274 API project source in CMake list: smoke_gcode_parser.cpp" "$missing_api_source_log" >/dev/null; then
echo "rs274 API project source lister did not exclude smoke backend clearly" >&2
sed -n '1,20p' "$missing_api_source_log" >&2
exit 1
fi
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
fi
if ! grep -F "missing LinuxCNC rs274 API project source in CMake list: does_not_exist.cc" "$missing_api_source_log" >/dev/null; then
echo "rs274 API project source lister did not report missing source filter clearly" >&2
sed -n '1,20p' "$missing_api_source_log" >&2
exit 1
fi
./list-cnc-sim-core-sources.sh >/dev/null
if ./list-cnc-sim-core-sources.sh smoke_gcode_parser.cpp >"$missing_core_source_log" 2>&1; then
echo "default cnc sim core source lister included smoke backend source" >&2
exit 1
fi
if ! grep -F "missing cnc sim core source in CMake list: smoke_gcode_parser.cpp" "$missing_core_source_log" >/dev/null; then
echo "default cnc sim core source lister did not exclude smoke backend clearly" >&2
sed -n '1,20p' "$missing_core_source_log" >&2
exit 1
fi
cnc_sim_core_source=$(./list-cnc-sim-core-sources.sh --with-smoke 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
fi
if ! grep -F "missing cnc sim core source in CMake list: does_not_exist.cc" "$missing_core_source_log" >/dev/null; then
echo "cnc sim core source lister did not report missing source filter clearly" >&2
sed -n '1,20p' "$missing_core_source_log" >&2
exit 1
fi
./list-linuxcnc-bridge-smoke-project-sources.sh >/dev/null
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
bridge_smoke_corexy_source=$(./list-linuxcnc-bridge-smoke-project-sources.sh linuxcnc_corexykins_adapter.cpp)
grep -Fx "core/src/linuxcnc_corexykins_adapter.cpp" <<<"$bridge_smoke_corexy_source" >/dev/null
bridge_smoke_cubic_source=$(./list-linuxcnc-bridge-smoke-project-sources.sh linuxcnc_cubic_adapter.cpp)
grep -Fx "core/src/linuxcnc_cubic_adapter.cpp" <<<"$bridge_smoke_cubic_source" >/dev/null
bridge_smoke_genhex_source=$(./list-linuxcnc-bridge-smoke-project-sources.sh linuxcnc_genhexkins_adapter.cpp)
grep -Fx "core/src/linuxcnc_genhexkins_adapter.cpp" <<<"$bridge_smoke_genhex_source" >/dev/null
bridge_smoke_lineardelta_source=$(./list-linuxcnc-bridge-smoke-project-sources.sh linuxcnc_lineardeltakins_adapter.cpp)
grep -Fx "core/src/linuxcnc_lineardeltakins_adapter.cpp" <<<"$bridge_smoke_lineardelta_source" >/dev/null
bridge_smoke_rotarydelta_source=$(./list-linuxcnc-bridge-smoke-project-sources.sh linuxcnc_rotarydeltakins_adapter.cpp)
grep -Fx "core/src/linuxcnc_rotarydeltakins_adapter.cpp" <<<"$bridge_smoke_rotarydelta_source" >/dev/null
bridge_smoke_maxkins_source=$(./list-linuxcnc-bridge-smoke-project-sources.sh linuxcnc_maxkins_adapter.cpp)
grep -Fx "core/src/linuxcnc_maxkins_adapter.cpp" <<<"$bridge_smoke_maxkins_source" >/dev/null
bridge_smoke_pentakins_source=$(./list-linuxcnc-bridge-smoke-project-sources.sh linuxcnc_pentakins_adapter.cpp)
grep -Fx "core/src/linuxcnc_pentakins_adapter.cpp" <<<"$bridge_smoke_pentakins_source" >/dev/null
bridge_smoke_rosekins_source=$(./list-linuxcnc-bridge-smoke-project-sources.sh linuxcnc_rosekins_adapter.cpp)
grep -Fx "core/src/linuxcnc_rosekins_adapter.cpp" <<<"$bridge_smoke_rosekins_source" >/dev/null
bridge_smoke_scorbot_source=$(./list-linuxcnc-bridge-smoke-project-sources.sh linuxcnc_scorbot_kins_adapter.cpp)
grep -Fx "core/src/linuxcnc_scorbot_kins_adapter.cpp" <<<"$bridge_smoke_scorbot_source" >/dev/null
bridge_smoke_tripodkins_source=$(./list-linuxcnc-bridge-smoke-project-sources.sh linuxcnc_tripodkins_adapter.cpp)
grep -Fx "core/src/linuxcnc_tripodkins_adapter.cpp" <<<"$bridge_smoke_tripodkins_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
fi
if ! grep -F "missing LinuxCNC bridge smoke project source in list: does_not_exist.cc" "$missing_bridge_source_log" >/dev/null; then
echo "LinuxCNC bridge smoke project source lister did not report missing source filter clearly" >&2
sed -n '1,20p' "$missing_bridge_source_log" >&2
exit 1
fi
LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-support-objects.sh >/dev/null
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
fi
if ! grep -F "missing LinuxCNC root: $missing_root" "$missing_support_object_log" >/dev/null; then
echo "LinuxCNC support object lister did not report missing LinuxCNC root clearly" >&2
sed -n '1,20p' "$missing_support_object_log" >&2
exit 1
fi
if LINUXCNC_ROOT="$linuxcnc_root" ./list-linuxcnc-source-support-objects.sh does_not_exist.o >"$missing_support_object_log" 2>&1; then
echo "LinuxCNC support object lister accepted missing object filter" >&2
exit 1
fi
if ! grep -F "missing LinuxCNC support object in list: does_not_exist.o" "$missing_support_object_log" >/dev/null; then
echo "LinuxCNC support object lister did not report missing object filter clearly" >&2
sed -n '1,20p' "$missing_support_object_log" >&2
exit 1
fi
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 source" >&2
exit 1
fi
if ! grep -F "missing manifest source: src/emc/rs274ngc/does_not_exist.cc" "$missing_source_log" >/dev/null; then
echo "test-linuxcnc-source-syntax.sh did not report missing manifest source clearly" >&2
sed -n '1,20p' "$missing_source_log" >&2
exit 1
fi
if [[ "$guardrails_only" == "1" ]]; then
echo "all native guardrail checks passed"
exit 0
fi
./test-native.sh
./test-linuxcnc-source-syntax.sh "$manifest"
./test-linuxcnc-source-objects.sh "$manifest"
./test-linuxcnc-source-link.sh "$manifest"
./test-linuxcnc-bridge-native.sh
./test-linuxcnc-rs274-native.sh
./test-linuxcnc-api-native.sh
echo "all native tests passed"