[CI] (P13 W2): retire the pull control library, the transport control runs the push library without MG_Remote

This commit is contained in:
2026-10-06 04:04:41 -04:00
parent 68b56165da
commit 9f05e66591
6 changed files with 74 additions and 100 deletions
+44 -76
View File
@@ -122,7 +122,6 @@ jobs:
-DMOBILEGL_BUILD_TRACE_REPLAY=OFF \
-DMOBILEGL_BUILD_DISAGGREGATED="${MOBILEGL_CI_DISAGGREGATED}" \
-DMOBILEGL_BUILD_DISAGGREGATED_INPROC="${MOBILEGL_CI_DISAGGREGATED}" \
-DMOBILEGL_PIPE_PUSH="${MOBILEGL_CI_DISAGGREGATED}" \
-DMOBILEGL_PIPE_VERIFY=OFF \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON \
@@ -198,10 +197,10 @@ jobs:
# The pull-library negative control must not consume the primary artifact:
# on disaggregation branches that artifact now contains the real transport.
build-linux-monolith-control:
name: build monolith controls (pull; push without MG_Remote)
name: build push monolith control (no MG_Remote)
runs-on: ubuntu-latest
env:
BUILD_DIR: build-monolith-control
BUILD_DIR: build-push-control
CCACHE_BASEDIR: ${{ github.workspace }}
CCACHE_DIR: ${{ github.workspace }}/.ccache
CCACHE_COMPRESS: "true"
@@ -223,7 +222,7 @@ jobs:
uses: lukka/get-cmake@v4.3.3
with:
cmakeVersion: 3.31.10
- name: Restore pull compiler cache
- name: Restore compiler cache
uses: actions/cache/restore@v5
with:
path: .ccache
@@ -243,33 +242,14 @@ jobs:
run: |
sudo apt-get update
sudo apt-get install -y ccache clang-20 clang++-20 lld-20 libc++-20-dev libc++abi-20-dev libvulkan-dev libegl1-mesa-dev libgles2-mesa-dev libgl1-mesa-dri mesa-vulkan-drivers ninja-build
- name: Configure explicit pull control
run: |
cmake -S . -B "${BUILD_DIR}" -G Ninja \
-DCMAKE_C_COMPILER="${MOBILEGL_CI_CC}" -DCMAKE_CXX_COMPILER="${MOBILEGL_CI_CXX}" \
-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DCMAKE_BUILD_TYPE=Release -DMOBILEGL_LOG_ACTIVE_LEVEL=MOBILEGL_LOG_LEVEL_INFO \
-DMOBILEGL_BUILD_TEST=OFF -DMOBILEGL_BUILD_BENCHMARK=OFF \
-DMOBILEGL_BUILD_INTEGRATION_TEST=OFF -DMOBILEGL_BUILD_TRACE_REPLAY=OFF \
-DMOBILEGL_BUILD_DISAGGREGATED=OFF -DMOBILEGL_BUILD_DISAGGREGATED_INPROC=OFF \
-DMOBILEGL_PIPE_PUSH=OFF -DMOBILEGL_PIPE_VERIFY=OFF \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_POLICY_VERSION_MINIMUM=3.5
- name: Build and identify pull control
run: |
cmake --build "${BUILD_DIR}" --target MobileGL --parallel "$(nproc)"
python3 scripts/ci/runtime_mode_proof.py build --build-dir "${BUILD_DIR}" \
--mode monolith --output "${BUILD_DIR}/runtime-mode.json"
- name: Prepare packaged test metadata
run: python3 scripts/ci/prepare_test_runtime.py "${BUILD_DIR}"
# P13 W1: THE PUSH MONOLITH WITHOUT MG_Remote - the shape FCL embeds once the pull build is
# gone (PLAN-P13 §4.1, §4.3; ID-P13-1). Two jobs in one: it is the transport-negative control
# that replaces the pull library in retrace-split (run side by side with it until W2 drops the
# pull build), and its runtime_mode_proof is the zero-MG_Remote-symbol check, one of G1's
# successors (ID-P13-4): a push library that links any MG_Remote symbol is red here.
# THE PUSH MONOLITH WITHOUT MG_Remote - the shape FCL embeds (PLAN-P13 §4.1, §4.3; ID-P13-1).
# Two jobs in one: it is the transport-negative control retrace-split swaps in (P13 W2 retired
# the pull library that used to play that part), and its runtime_mode_proof is the
# zero-MG_Remote-symbol check, one of G1's successors (ID-P13-4): a push library that links
# any MG_Remote symbol is red here.
- name: Configure push control without MG_Remote
run: |
cmake -S . -B build-push-control -G Ninja \
cmake -S . -B "${BUILD_DIR}" -G Ninja \
-DCMAKE_C_COMPILER="${MOBILEGL_CI_CC}" -DCMAKE_CXX_COMPILER="${MOBILEGL_CI_CXX}" \
-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DCMAKE_BUILD_TYPE=Release -DMOBILEGL_LOG_ACTIVE_LEVEL=MOBILEGL_LOG_LEVEL_INFO \
@@ -280,23 +260,24 @@ jobs:
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_POLICY_VERSION_MINIMUM=3.5
- name: Build push control and prove it has zero MG_Remote symbols
run: |
cmake --build build-push-control --target MobileGL --parallel "$(nproc)"
python3 scripts/ci/runtime_mode_proof.py build --build-dir build-push-control \
--mode monolith --output build-push-control/runtime-mode.json
python3 - build-push-control/runtime-mode.json <<'PY'
cmake --build "${BUILD_DIR}" --target MobileGL --parallel "$(nproc)"
python3 scripts/ci/runtime_mode_proof.py build --build-dir "${BUILD_DIR}" \
--mode monolith --output "${BUILD_DIR}/runtime-mode.json"
python3 - "${BUILD_DIR}/runtime-mode.json" <<'PY'
import json, sys
rows = json.load(open(sys.argv[1]))['production_compilation']
if not rows or any(row['definitions'].get('MOBILEGL_PIPE_PUSH') != '1' for row in rows):
sys.exit('::error::the push control was not compiled with MOBILEGL_PIPE_PUSH=1 everywhere')
print(f'push control: {len(rows)} production sources compiled with MOBILEGL_PIPE_PUSH=1, zero MG_Remote symbols')
PY
- name: Prepare packaged test metadata
run: python3 scripts/ci/prepare_test_runtime.py "${BUILD_DIR}"
- name: Package monolith controls
- name: Package push control
run: |
tar -czf mobilegl-linux-monolith-control.tgz \
"${BUILD_DIR}/.ci-source-root" "${BUILD_DIR}/libMobileGL.so" "${BUILD_DIR}/runtime-mode.json" \
build-push-control/libMobileGL.so build-push-control/runtime-mode.json
- name: Upload pull control
"${BUILD_DIR}/.ci-source-root" "${BUILD_DIR}/libMobileGL.so" "${BUILD_DIR}/runtime-mode.json"
- name: Upload push control
uses: actions/upload-artifact@v7
with:
name: mobilegl-linux-monolith-control
@@ -336,7 +317,7 @@ jobs:
- name: Prepare downloaded test metadata
run: |
for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do
for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do
if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi
done
@@ -417,7 +398,7 @@ jobs:
- name: Prepare downloaded test metadata
run: |
for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do
for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do
if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi
done
@@ -729,7 +710,7 @@ jobs:
- name: Prepare downloaded test metadata
run: |
for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do
for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do
if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi
done
@@ -1004,7 +985,7 @@ jobs:
# otherwise also match this label and the monolith one would match both.
- name: Prepare downloaded test metadata
run: |
for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do
for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do
if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi
done
@@ -1479,7 +1460,7 @@ jobs:
- name: Prepare downloaded test metadata
run: |
for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do
for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do
if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi
done
@@ -1751,7 +1732,7 @@ jobs:
- name: Prepare downloaded test metadata
run: |
for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do
for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do
if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi
done
@@ -2437,7 +2418,7 @@ jobs:
- name: Prepare downloaded test metadata
run: |
for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do
for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do
if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi
done
@@ -2538,7 +2519,7 @@ jobs:
- name: Prepare downloaded test metadata
run: |
for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do
for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do
if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi
done
@@ -2813,7 +2794,7 @@ jobs:
- name: Prepare downloaded test metadata
run: |
for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do
for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do
if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi
done
@@ -3032,7 +3013,7 @@ jobs:
- name: Prepare downloaded test metadata
run: |
for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do
for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do
if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi
done
@@ -3207,22 +3188,22 @@ jobs:
name: mobilegl-trace-replay
path: .
# The PULL runtime, for the negative control at the end of this job and for nothing else.
- name: Download pull runtime (negative control)
# The push monolith without MG_Remote, for the negative control at the end of this job and for
# nothing else.
- name: Download control runtime (negative control)
uses: actions/download-artifact@v8
with:
name: mobilegl-linux-monolith-control
path: pull-runtime
path: control-runtime
- name: Unpack the pull runtime (negative control)
- name: Unpack the control runtime (negative control)
run: |
tar -xzf pull-runtime/mobilegl-linux-monolith-control.tgz -C pull-runtime
test -f pull-runtime/build-monolith-control/libMobileGL.so
test -f pull-runtime/build-push-control/libMobileGL.so
tar -xzf control-runtime/mobilegl-linux-monolith-control.tgz -C control-runtime
test -f control-runtime/build-push-control/libMobileGL.so
- name: Prepare downloaded test metadata
run: |
for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do
for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do
if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi
done
@@ -3251,7 +3232,7 @@ jobs:
# a NAMED failure here rather than a LaunchServer refusal 78 jobs deep.
- name: Prepare downloaded test metadata
run: |
for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do
for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do
if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi
done
@@ -3341,7 +3322,7 @@ jobs:
# The rerun replays into the same case directory, so the good run's images are put aside and
# restored whichever way the control goes; "Upload actual image" below runs `if: always()`
# and would otherwise ship the deliberately-wrong run's output under the good run's name.
# THE BODY OF THIS STEP IS scripts/ci/retrace_pull_library_control.sh, for the reason the
# THE BODY OF THIS STEP IS scripts/ci/retrace_transport_control.sh, for the reason the
# split lane's control gives: a `run:` block cannot be executed off a runner, so these lines
# could not be tested until they ran in CI. scripts/ci/control_smoke_test.sh drives that file.
#
@@ -3351,34 +3332,21 @@ jobs:
# `--no-tests=error` and was read as "the pull library turned it red"; and only "non-zero
# ctest" was checked after the nm identity check, so a loader failure, a missing fixture or a
# timeout passed it. The red must now carry run_trace_case.cmake's own sentence.
- name: Negative control (pull library)
# P13 W2: THE LIBRARY IS THE PUSH MONOLITH WITHOUT MG_Remote (the shape FCL embeds); until W2 it
# was the pull build, run side by side with this one for a wave (W1) to show both red here for
# the same sentence. What makes the library red is that it has no transport, not that it pulls.
- name: Negative control (library without a transport)
working-directory: build-retrace/tools/trace_replay
env:
CONTROL_TMPDIR: ${{ runner.temp }}
PULL_LIBRARY: ${{ github.workspace }}/pull-runtime/build-monolith-control/libMobileGL.so
CONTROL_LIBRARY: ${{ github.workspace }}/control-runtime/build-push-control/libMobileGL.so
FROZEN_LIBRARY: ${{ github.workspace }}/build-linux/libMobileGL.so
# The control has to run the arm it is a control FOR. Hard-coded inproc, it would go on
# proving something about the other arm while spawn ran unguarded.
SPLIT_TRANSPORT: ${{ matrix.transport }}
MOBILEGL_IPC_SERVER_PATH: ${{ github.workspace }}/build-linux/libMobileGLServer.so
run: >-
bash "${GITHUB_WORKSPACE}/scripts/ci/retrace_pull_library_control.sh"
'${{ matrix.case }}' '${{ matrix.backend }}'
# P13 W1: THE SAME CONTROL WITH THE PUSH MONOLITH WITHOUT MG_Remote - the library FCL embeds
# after W2, and the successor of the pull library above once W2 drops the pull build. Same
# script and the same evidence sentence: what makes either library red here is that it has no
# transport, not that it pulls.
- name: Negative control (push library without MG_Remote)
working-directory: build-retrace/tools/trace_replay
env:
CONTROL_TMPDIR: ${{ runner.temp }}
PULL_LIBRARY: ${{ github.workspace }}/pull-runtime/build-push-control/libMobileGL.so
FROZEN_LIBRARY: ${{ github.workspace }}/build-linux/libMobileGL.so
SPLIT_TRANSPORT: ${{ matrix.transport }}
MOBILEGL_IPC_SERVER_PATH: ${{ github.workspace }}/build-linux/libMobileGLServer.so
run: >-
bash "${GITHUB_WORKSPACE}/scripts/ci/retrace_pull_library_control.sh"
bash "${GITHUB_WORKSPACE}/scripts/ci/retrace_transport_control.sh"
'${{ matrix.case }}' '${{ matrix.backend }}'
# EXIT GATE E2's OTHER HALF, and the one BRIEF-P5 §7 E2 actually names: "drop an emission
+2 -1
View File
@@ -11,7 +11,8 @@ them wrong.
| Date | Check | Workflow / job | Reason | Successor |
|---|---|---|---|---|
| — | (none yet) | | | |
| 2026-10-06 | `build explicit pull runtime control` (the pull `libMobileGL.so`, `-DMOBILEGL_PIPE_PUSH=OFF`) | Test / `build-linux-monolith-control` | P13 W2 retires the pull build: CMake defaults to push and nothing ships pull (ID-P13-1) | the same job builds the push monolith without MG_Remote (the FCL shape); its `runtime_mode_proof --mode monolith` is the zero-MG_Remote-symbol check |
| 2026-10-06 | `Negative control (pull library)` | Test / `retrace-split` (every leg) | its library was the pull build above | `Negative control (library without a transport)`: same script (renamed `retrace_transport_control.sh`) and evidence sentence, with the push library without MG_Remote; W1 ran both side by side on every leg |
## Kept after investigation
+3 -3
View File
@@ -59,8 +59,8 @@ run_retrace() { # $1 = STUB_MODE
local rc=0
env -i PATH="${STUB_DIR}:/usr/bin:/bin" STUB_MODE="$1" \
CTEST=ctest CONTROL_TMPDIR="${WORK}/tmp-$1" \
PULL_LIBRARY="${WORK}/pull.so" FROZEN_LIBRARY="${WORK}/frozen.so" \
bash "${HERE}/retrace_pull_library_control.sh" OpenRA DirectGLES || rc=$?
CONTROL_LIBRARY="${WORK}/pull.so" FROZEN_LIBRARY="${WORK}/frozen.so" \
bash "${HERE}/retrace_transport_control.sh" OpenRA DirectGLES || rc=$?
cmp -s "${WORK}/frozen.so" "${WORK}/split.so" || {
echo 'F6 FAILED: pull control did not restore the split library'; return 1;
}
@@ -95,7 +95,7 @@ expect FAILED "E1 observed no real emission" -- run_split e1-no-
expect FAILED "E1 incorrectly waits every record" -- run_split e1-waitall
echo
echo "=== the retrace lane's pull-library control (scripts/ci/retrace_pull_library_control.sh)"
echo "=== the retrace lane's pull-library control (scripts/ci/retrace_transport_control.sh)"
# A pull-shaped library the nm identity check accepts: a real ELF .so defining no MG_Remote symbol.
if command -v cc > /dev/null 2>&1; then
printf '%s\n' 'int mobilegl_pull_only(void) { return 1; }' > "${WORK}/pull.c"
+4 -4
View File
@@ -14,10 +14,10 @@ HERE="$(cd "$(dirname "$0")" && pwd)"
WORK="$(mktemp -d)" || exit 1
HELPER="${HERE}/../../MobileGL/MG_IntegrationTest/Harness/split_log_paths.py"
WAIT_HELPER="${HERE}/wait_boundary_negative_control.py"
trap 'cp "${WORK}/split.orig" "${HERE}/split_negative_controls.sh"; cp "${WORK}/retrace.orig" "${HERE}/retrace_pull_library_control.sh"; cp "${WORK}/dropdraw.orig" "${HERE}/retrace_drop_draw_control.sh"; cp "${WORK}/helper.orig" "${HELPER}"; cp "${WORK}/wait.orig" "${WAIT_HELPER}"; rm -rf "${WORK}"' EXIT
trap 'cp "${WORK}/split.orig" "${HERE}/split_negative_controls.sh"; cp "${WORK}/retrace.orig" "${HERE}/retrace_transport_control.sh"; cp "${WORK}/dropdraw.orig" "${HERE}/retrace_drop_draw_control.sh"; cp "${WORK}/helper.orig" "${HELPER}"; cp "${WORK}/wait.orig" "${WAIT_HELPER}"; rm -rf "${WORK}"' EXIT
cp "${HERE}/split_negative_controls.sh" "${WORK}/split.orig"
cp "${HERE}/retrace_pull_library_control.sh" "${WORK}/retrace.orig"
cp "${HERE}/retrace_transport_control.sh" "${WORK}/retrace.orig"
cp "${HERE}/retrace_drop_draw_control.sh" "${WORK}/dropdraw.orig"
cp "${HELPER}" "${WORK}/helper.orig"
cp "${WAIT_HELPER}" "${WORK}/wait.orig"
@@ -32,7 +32,7 @@ tail -1 "${WORK}/before.log"
echo
echo "=== perturbation: remove the evidence check from both controls"
python3 - "${HERE}/split_negative_controls.sh" "${HERE}/retrace_pull_library_control.sh" \
python3 - "${HERE}/split_negative_controls.sh" "${HERE}/retrace_transport_control.sh" \
"${HERE}/retrace_drop_draw_control.sh" "${WAIT_HELPER}" <<'PY' || exit 1
import sys
split, retrace, dropdraw, wait = sys.argv[1:]
@@ -135,7 +135,7 @@ fi
echo
cp "${WORK}/split.orig" "${HERE}/split_negative_controls.sh"
cp "${WORK}/retrace.orig" "${HERE}/retrace_pull_library_control.sh"
cp "${WORK}/retrace.orig" "${HERE}/retrace_transport_control.sh"
cp "${WORK}/dropdraw.orig" "${HERE}/retrace_drop_draw_control.sh"
cp "${WORK}/wait.orig" "${WAIT_HELPER}"
echo "=== ID-62 perturbation: remove only the skip check"
+1 -1
View File
@@ -4,7 +4,7 @@
#
# WHY THERE IS A SECOND CONTROL ON THIS LANE, and why it is the draws and not the clears.
#
# The retrace-split job already carries scripts/ci/retrace_pull_library_control.sh, which swaps a
# The retrace-split job already carries scripts/ci/retrace_transport_control.sh, which swaps a
# PULL library in and requires run_trace_case.cmake's transport-resolution assertion to catch it.
# That control proves the lane is running a SPLIT library. It does not prove that the PICTURE came
# through the wire, and it cannot: OpenRA scores ssim 1.000000 against a monolith library too, so
@@ -1,7 +1,12 @@
#!/bin/bash
# THE RETRACE-SPLIT LANE'S NEGATIVE CONTROL: a PULL library must red this split retrace.
# THE RETRACE-SPLIT LANE'S NEGATIVE CONTROL: a library WITHOUT A TRANSPORT must red this split retrace.
#
# This file is the body of .github/workflows/test.yml's "Negative control (pull library)" step in
# P13 W2: the library is the push monolith without MG_Remote (the shape FCL embeds). Until W2 it was
# the pull build, and this file was retrace_pull_library_control.sh; both libraries were run side by
# side for one wave and both went red here for the same sentence. "pull" below is history: what the
# control needs is a library with no MG_Remote, and the push monolith is one.
#
# This file is the body of .github/workflows/test.yml's "Negative control (library without a transport)" step in
# the retrace-split job, extracted for the reason given at the top of
# scripts/ci/split_negative_controls.sh: a `run:` block is unreviewable and untestable off a
# runner, and scripts/ci/control_smoke_test.sh now runs THIS file rather than a hand-made copy.
@@ -33,19 +38,19 @@
# Both are closed below: the selection is counted before the run, and the red must carry
# run_trace_case.cmake's own words.
#
# Usage: retrace_pull_library_control.sh <case> <backend>
# Usage: retrace_transport_control.sh <case> <backend>
# CTEST ctest binary (default: ctest)
# CONTROL_TMPDIR scratch dir (default: ${RUNNER_TEMP:-/tmp})
# PULL_LIBRARY the pull libMobileGL.so to swap in
# FROZEN_LIBRARY the path every case has baked in, which PULL_LIBRARY is copied over
# CONTROL_LIBRARY the libMobileGL.so without MG_Remote to swap in
# FROZEN_LIBRARY the path every case has baked in, which CONTROL_LIBRARY is copied over
set -u
CASE="${1:?usage: retrace_pull_library_control.sh <case> <backend>}"
BACKEND="${2:?usage: retrace_pull_library_control.sh <case> <backend>}"
CASE="${1:?usage: retrace_transport_control.sh <case> <backend>}"
BACKEND="${2:?usage: retrace_transport_control.sh <case> <backend>}"
CTEST="${CTEST:-ctest}"
CONTROL_TMPDIR="${CONTROL_TMPDIR:-${RUNNER_TEMP:-/tmp}}"
PULL_LIBRARY="${PULL_LIBRARY:?PULL_LIBRARY must name the pull build libMobileGL.so}"
CONTROL_LIBRARY="${CONTROL_LIBRARY:?CONTROL_LIBRARY must name a libMobileGL.so built without MG_Remote}"
FROZEN_LIBRARY="${FROZEN_LIBRARY:?FROZEN_LIBRARY must name the path the cases have baked in}"
mkdir -p "${CONTROL_TMPDIR}"
@@ -112,7 +117,7 @@ trap 'exit 130' INT TERM
matched=$("${CTEST}" -N -R "${selector}" | grep -cE '^ *Test *#[0-9]+:')
if [ "${matched}" -lt 1 ]; then
restore_good_output
echo "::error::the control selected ${matched} tests with -R '${selector}', so there is nothing for the pull library to red. --no-tests=error would have exited non-zero on the empty selection and this control used to read that as success (ID-46 finding 8b, measured: ctest exit 8, step green)."
echo "::error::the control selected ${matched} tests with -R '${selector}', so there is nothing for the transport-less library to red. --no-tests=error would have exited non-zero on the empty selection and this control used to read that as success (ID-46 finding 8b, measured: ctest exit 8, step green)."
exit 1
fi
@@ -120,13 +125,13 @@ fi
# in. It defines no MG_Remote symbol, so ConfigLoader has no transport parser and
# MOBILEGL_TRANSPORT=inproc is accepted and ignored - the exact shape of "the split lane ran
# monolith".
cp "${PULL_LIBRARY}" "${FROZEN_LIBRARY}" || exit 1
cp "${CONTROL_LIBRARY}" "${FROZEN_LIBRARY}" || exit 1
symbols=$(nm --defined-only "${FROZEN_LIBRARY}") || exit 1
remote_count=$(printf '%s\n' "${symbols}" | grep -ic MG_Remote || true)
echo "pull control library: ${FROZEN_LIBRARY}: MG_Remote=${remote_count}"
echo "transport control library: ${FROZEN_LIBRARY}: MG_Remote=${remote_count}"
if [ "${remote_count}" -ne 0 ]; then
restore_good_output
echo "::error::the control's own library defines MG_Remote symbols, so it is not a pull build and this control would prove nothing"
echo "::error::the control's own library defines MG_Remote symbols, so it has a transport and this control would prove nothing"
exit 1
fi
@@ -144,7 +149,7 @@ cat "${out}"
restore_good_output
if [ "${control_rc}" -eq 0 ]; then
echo "::error::a PULL library passed the split retrace. OpenRA scores ssim 1.000000 under a monolith library too (measured), so the picture is not and cannot be this lane's gate - run_trace_case.cmake's transport-resolution assertion is, and it has stopped working. Every green in this job is then a monolith run under a name that says split."
echo "::error::a library WITHOUT A TRANSPORT passed the split retrace. OpenRA scores ssim 1.000000 under a monolith library too (measured), so the picture is not and cannot be this lane's gate - run_trace_case.cmake's transport-resolution assertion is, and it has stopped working. Every green in this job is then a monolith run under a name that says split."
exit 1
fi
@@ -159,8 +164,8 @@ fi
# so without stripping it first the folded text reads "never 1: reported resolving it" and the
# control reds on the very sentence it is looking for (the *-prefixed stub modes).
if ! sed -E 's/^[0-9]+: //' "${out}" | tr -s '[:space:]' ' ' | grep -qF "${EVIDENCE}"; then
echo "::error::the split retrace went red (ctest exit ${control_rc}) with the pull library in place, but the failure never says the library did not resolve the transport - neither of run_trace_case.cmake's sentences (\"${EVIDENCE//$'\n'/\" / \"}\") is in the output. A loader failure, a missing fixture, a timeout or an SSIM drop all land here, and none of them establishes that the transport-identity assertion is what caught the pull library. Only 'non-zero ctest' used to be checked (ID-46 finding 8b)."
echo "::error::the split retrace went red (ctest exit ${control_rc}) with the transport-less library in place, but the failure never says the library did not resolve the transport - neither of run_trace_case.cmake's sentences (\"${EVIDENCE//$'\n'/\" / \"}\") is in the output. A loader failure, a missing fixture, a timeout or an SSIM drop all land here, and none of them establishes that the transport-identity assertion is what caught the pull library. Only 'non-zero ctest' used to be checked (ID-46 finding 8b)."
exit 1
fi
echo "the pull library turned the split retrace red for its own reason (ctest exit ${control_rc}): ${matched} selected case(s) named the transport, not the picture"
echo "the transport-less library turned the split retrace red for its own reason (ctest exit ${control_rc}): ${matched} selected case(s) named the transport, not the picture"