Files
threadx/.github/workflows/gcc_check.yml
T
Frédéric Desbiens d56f96f37f
cortex_m / Cortex M0 build (push) Canceled after 0s
cortex_m / Cortex M3 build (push) Canceled after 0s
cortex_m / Cortex M4 build (push) Canceled after 0s
cortex_m / Cortex M7 build (push) Canceled after 0s
gcc_check / gnu (push) Canceled after 0s
r52_fvp / r52 (push) Canceled after 0s
regression_test / tx (push) Canceled after 0s
regression_test / smp (push) Canceled after 0s
regression_test / freertos (push) Canceled after 0s
regression_test / riscv (push) Canceled after 0s
regression_test / deploy (push) Canceled after 0s
regression_template / run_tests (push) Canceled after 0s
regression_template / deploy_code_coverage (push) Canceled after 0s
Refreshed the reason gcc_check leaves RISC-V out (#722)
The header explained the exclusion by saying RISC-V "is not regressing" and
that adding it would widen the toolchain download. The second half is still
true; the first read as though nothing in CI exercised the family at all,
which stopped being the case with #717.

RISC-V is now the best-covered of the four excluded families rather than the
least: regression_test.yml builds both ports and runs 955 tests on them under
QEMU -- 475 on RV32 and 480 on RV64, across five build configurations each --
which is more than a compile-and-link check could establish. That is a
stronger argument for leaving it out of this workflow than the original, so
the sentence now makes it.

The download figure is kept and quantified: the two bare-metal toolchains this
workflow would have to fetch are about 500 MB apiece.

Comment only; no behaviour change. scripts/check_gcc.sh names the same four
families but states the exclusion without giving a reason for it, so it needs
no matching edit.

Assisted-by: Claude Code (Opus 5) <noreply@anthropic.com>
2026-09-10 09:31:58 -04:00

193 lines
9.1 KiB
YAML

name: gcc_check
# Builds the Arm ports with the Arm GNU toolchain, in six stages: assemble
# every assembly source of every Arm gnu port, assemble again the parts guarded
# by feature macros, compile the common C sources for one core per architecture
# profile, compile the module manager C sources once per Arm module port, then
# link the example builds, both the script-driven ones and those driven by
# CMake.
#
# Why this exists: GCC 14 on Linux is the project's default compiler, it is
# what the gnu ports exist for, and until this workflow landed, nothing in CI
# compiled a line of any port with it. The only cross-compilation check that
# ran was clang_check, so the LLVM path was better guarded than the GNU one,
# on ports whose directory is literally named gnu.
#
# What it covers: 840 assembly sources across 40 port families, 469 of them
# again behind feature macros, common/src for nine cores, 302 module manager C
# files across the nine Arm module ports, 42 script-driven example links and
# the five Cortex-R52 CMake images. Every skip is printed by name with a reason
# -- run scripts/check_gcc.sh --help, or read its header.
#
# What it does not cover: it compiles and links and **executes nothing**. The
# Cortex-R52 FVP ctest suite is not part of it. RISC-V, MIPS, RX and ARC are
# outside it entirely -- RISC-V deliberately, and now for a stronger reason
# than when this was written: regression_test.yml builds both its ports and
# runs 955 tests on them under QEMU, which is more than a compile check could
# say. Adding them here would widen this workflow's toolchain download by about
# a gigabyte to re-prove a subset of that.
#
# It does not supersede cortex_m. That workflow builds four ports *through
# CMake*, which is the only thing exercising cmake/cortex_m*.cmake and the
# top-level CMakeLists for the M profile; this script's CMake stage covers
# cortex_r52 only. The overlap is the assembly and the C sources, not the build
# system.
on:
# push as well as pull_request, so dev's own history has a baseline and a bad
# squash-merge is caught rather than waiting for the next PR to notice. dev is
# named because it is the integration branch: a workflow that triggers only on
# master does not gate any pull request anybody opens, which is the defect
# ports_arch_check.yml carries a comment about and which cost cortex_m three
# months of failing in seven seconds unnoticed.
push:
branches: [ master, dev ]
paths:
- ".github/workflows/gcc_check.yml"
- "scripts/check_gcc.sh"
- "CMakeLists.txt"
- "cmake/**"
- "common/**"
# common_modules/ holds the portable module manager that the module
# manager stage compiles once per Arm module port -- the larger half of
# what that stage builds. Without it a change there leaves the stage
# unrun, which is the same "absent from the count reads as covered" the
# stage exists to close.
- "common_modules/**"
- "common_smp/**"
- "ports/**"
- "ports_arch/**"
- "ports_module/**"
- "ports_smp/**"
pull_request:
branches: [ master, dev ]
# The two lists are duplicated rather than shared through a YAML anchor.
# GitHub Actions' workflow parser does not dependably honour anchors, and
# the failure mode is the whole workflow refusing to parse -- which is the
# cortex_m failure again, a job that dies before it does anything. Ten
# duplicated lines are cheaper than that. **Edit both.**
#
# common_smp, CMakeLists.txt and cmake/ are here and are absent from
# clang_check.yml's otherwise identical list, which is a gap in that file
# and is fixed alongside this one: the ports_smp example builds compile
# common_smp/src, and the CMake stage reads the toolchain file and the
# top-level project. utility/ is deliberately absent -- the FreeRTOS and
# POSIX layers under it are not enabled by any target this workflow builds.
paths:
- ".github/workflows/gcc_check.yml"
- "scripts/check_gcc.sh"
- "CMakeLists.txt"
- "cmake/**"
- "common/**"
# common_modules/ holds the portable module manager that the module
# manager stage compiles once per Arm module port -- the larger half of
# what that stage builds. Without it a change there leaves the stage
# unrun, which is the same "absent from the count reads as covered" the
# stage exists to close.
- "common_modules/**"
- "common_smp/**"
- "ports/**"
- "ports_arch/**"
- "ports_module/**"
- "ports_smp/**"
jobs:
gnu:
runs-on: ubuntu-24.04
env:
# Pinned deliberately, as the runner image is: a toolchain upgrade should
# be a reviewable commit rather than something that changes underneath the
# ports. 14.3.rel1 is the GCC 14 the project builds against, and the
# version cortex_m already pins.
# Releases: https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
GCC_VERSION: 14.3.rel1
steps:
# Actions are pinned to a commit SHA, with the version in the trailing
# comment. A tag can be moved; a SHA cannot, so this is what makes "which
# code ran in CI" answerable from the repository. Dependabot moves these
# pins and rewrites the comment with them -- see .github/dependabot.yml.
- name: Check out the repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
# Two toolchains, because Arm ships AArch32 and AArch64 as separate
# downloads and scripts/check_gcc.sh needs both -- every port maps to one of
# exactly those two triples. One job with two cache steps rather than two
# jobs, so the checks list stays short and a single script invocation sees
# both compilers.
#
# The AArch32 path and key match cortex_m's exactly, so the two workflows
# share one cache entry rather than each holding its own copy of the same
# 500MB archive. Change them together or the sharing silently stops and the
# only symptom is a slower run.
- name: Cache the AArch32 Arm GNU toolchain
id: cache-arm32
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: toolchain
key: arm-gnu-toolchain-${{ env.GCC_VERSION }}-x86_64-arm-none-eabi
- name: Cache the AArch64 Arm GNU toolchain
id: cache-arm64
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: toolchain64
key: arm-gnu-toolchain-${{ env.GCC_VERSION }}-x86_64-aarch64-none-elf
# The checksum suffix is .sha256asc and not .sha256, and that is not a
# stylistic choice. Arm publishes both for this release, and for
# arm-none-eabi the .sha256 file contains a 32-character MD5 rather than a
# SHA-256 -- verified 26 Aug 2026 -- so sha256sum -c on it fails with "no
# properly formatted checksum lines found". .sha256asc is a plain
# sha256sum-format line for both triples. Do not "simplify" the suffix.
- name: Install the AArch32 Arm GNU toolchain
if: steps.cache-arm32.outputs.cache-hit != 'true'
run: |
set -eu
base="https://developer.arm.com/-/media/Files/downloads/gnu/${GCC_VERSION}/binrel"
archive="arm-gnu-toolchain-${GCC_VERSION}-x86_64-arm-none-eabi.tar.xz"
mkdir -p toolchain && cd toolchain
curl -fsSLO "$base/$archive"
curl -fsSLO "$base/$archive.sha256asc"
sha256sum -c "$archive.sha256asc"
tar xf "$archive"
rm -f "$archive"
- name: Install the AArch64 Arm GNU toolchain
if: steps.cache-arm64.outputs.cache-hit != 'true'
run: |
set -eu
base="https://developer.arm.com/-/media/Files/downloads/gnu/${GCC_VERSION}/binrel"
archive="arm-gnu-toolchain-${GCC_VERSION}-x86_64-aarch64-none-elf.tar.xz"
mkdir -p toolchain64 && cd toolchain64
curl -fsSLO "$base/$archive"
curl -fsSLO "$base/$archive.sha256asc"
sha256sum -c "$archive.sha256asc"
tar xf "$archive"
rm -f "$archive"
# Only reaches apt if the runner image has stopped shipping ninja, which
# the CMake stage needs. This repository has already paid for unguarded apt
# calls: scripts/install.sh carries a long comment about apt-get update
# stalling for over two hours and taking whole regression runs with it. Do
# not turn this into an unconditional install.
- name: Ensure ninja is available
run: |
set -eu
if command -v ninja >/dev/null 2>&1; then
ninja --version
else
sudo apt-get update
sudo apt-get install -y --no-install-recommends ninja-build
fi
# The script is told where both toolchains are rather than being left to
# find them on PATH, so nothing about the runner image can decide which
# compiler is used. The script prints both versions it resolved, which is
# what makes "was this really 14.3.rel1?" answerable from the log.
- name: Build the Arm ports with GCC
run: |
scripts/check_gcc.sh \
--arm-none-eabi "$GITHUB_WORKSPACE/toolchain/arm-gnu-toolchain-${GCC_VERSION}-x86_64-arm-none-eabi/bin" \
--aarch64-none-elf "$GITHUB_WORKSPACE/toolchain64/arm-gnu-toolchain-${GCC_VERSION}-x86_64-aarch64-none-elf/bin"