Skip to content

[Superseded by #41] Add portable static IEC 61850 server adapter #335

[Superseded by #41] Add portable static IEC 61850 server adapter

[Superseded by #41] Add portable static IEC 61850 server adapter #335

Workflow file for this run

name: Embedded Profile CI
on:
push:
branches:
- main
pull_request:
permissions:
contents: read
jobs:
embedded-host-sim:
name: Embedded host-sim / ${{ matrix.compiler }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
compiler: [gcc, clang]
steps:
- uses: actions/checkout@v4
- name: Select compiler
shell: bash
run: |
if [ "${{ matrix.compiler }}" = "clang" ]; then
echo "CC=clang" >> "$GITHUB_ENV"
echo "CXX=clang++" >> "$GITHUB_ENV"
else
echo "CC=gcc" >> "$GITHUB_ENV"
echo "CXX=g++" >> "$GITHUB_ENV"
fi
- name: Audit embedded source boundary
shell: bash
run: |
python3 - <<'PY'
from pathlib import Path
import re
import sys
cmake = Path('embedded/CMakeLists.txt').read_text(encoding='utf-8')
match = re.search(r'set\(ARIEC61850_EMBEDDED_SOURCES\s*(.*?)\)', cmake, re.S)
if not match:
raise SystemExit('embedded source list not found')
paths = []
for raw in match.group(1).splitlines():
raw = raw.strip()
if not raw or raw.startswith('#'):
continue
raw = raw.replace('${ARIEC61850_ROOT}/', '')
paths.append(Path(raw))
forbidden = {
'#include <filesystem>': 'filesystem',
'#include <iostream>': 'iostream',
'winsock2.h': 'WinSock',
'windows.h': 'Windows API',
'sys/socket.h': 'POSIX socket API',
'netinet/': 'POSIX network API',
'ariec61850/capture/': 'PCAP/capture layer',
'ariec61850/comtrade/': 'COMTRADE layer',
'ariec61850/evidence/': 'host evidence layer',
'ariec61850/scl/parser': 'SCL parser',
'ariec61850/mms/tcp_transport': 'host TCP transport',
'ariec61850/mms/live_discovery': 'host live discovery',
}
failures = []
throw_count = 0
for path in paths:
if not path.is_file():
failures.append(f'{path}: embedded source does not exist')
continue
text = path.read_text(encoding='utf-8')
throw_count += len(re.findall(r'\bthrow\b', text))
for needle, label in forbidden.items():
if needle in text:
failures.append(f'{path}: forbidden {label} dependency ({needle})')
print(f'embedded sources={len(paths)}')
print(f'legacy throw tokens={throw_count} (migration debt; no-exceptions gate not enabled yet)')
if failures:
print('\n'.join(failures), file=sys.stderr)
raise SystemExit(1)
PY
- name: Configure embedded profile
run: >-
cmake -S embedded -B build-embedded
-DARIEC61850_EMBEDDED_NO_RTTI=ON
-DARIEC61850_EMBEDDED_NO_EXCEPTIONS=OFF
-DARIEC61850_EMBEDDED_WARNINGS_AS_ERRORS=ON
- name: Build embedded profile
run: cmake --build build-embedded --parallel
- name: Test embedded host simulation
run: >-
ctest --test-dir build-embedded
--output-on-failure
--output-junit embedded-ctest.xml
- name: Independently verify exact SV PCAP wire image
shell: bash
run: |
set -euo pipefail
python3 tools/verify_sv_pcap.py \
build-embedded/sv_trial_2s.pcap \
--expected-frames 8000 \
--report build-embedded/sv-pcap-qa.json
sha256sum build-embedded/sv_trial_2s.pcap
- name: Report host-sim footprint
shell: bash
run: |
if command -v size >/dev/null 2>&1; then
size build-embedded/ariec61850_embedded_link_smoke || true
size build-embedded/ariec61850_embedded_sv_publisher_smoke || true
size build-embedded/ariec61850_embedded_sv_stream_pcap || true
fi
- name: Upload host-simulation QA evidence
uses: actions/upload-artifact@v4
with:
name: embedded-host-sim-${{ matrix.compiler }}-${{ github.event.pull_request.head.sha || github.sha }}
if-no-files-found: error
retention-days: 14
path: |
build-embedded/embedded-ctest.xml
build-embedded/sv_trial_2s.pcap
build-embedded/sv-pcap-qa.json