From 9d97e663d902837b656693af9caec0f83857e989 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Fri, 19 Sep 2025 21:56:16 +0200
Subject: [PATCH] ci: add option to set ctest arguments
---
.github/workflows/create-test-plan.py | 21 +++++++++++++++++----
.github/workflows/generic.yml | 2 +-
docs/README-contributing.md | 1 +
3 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/create-test-plan.py b/.github/workflows/create-test-plan.py
index 4ce15489b7211..69dca4e4c59a3 100755
--- a/.github/workflows/create-test-plan.py
+++ b/.github/workflows/create-test-plan.py
@@ -7,6 +7,7 @@
import logging
import os
import re
+import shlex
from typing import Optional
logger = logging.getLogger(__name__)
@@ -234,6 +235,7 @@ class JobDetails:
pypi_packages: list[str] = dataclasses.field(default_factory=list)
setup_gage_sdk_path: str = ""
binutils_strings: str = "strings"
+ ctest_args: str = ""
def to_workflow(self, enable_artifacts: bool) -> dict[str, str|bool]:
data = {
@@ -303,6 +305,7 @@ def to_workflow(self, enable_artifacts: bool) -> dict[str, str|bool]:
"pypi-packages": my_shlex_join(self.pypi_packages),
"setup-ngage-sdk-path": self.setup_gage_sdk_path,
"binutils-strings": self.binutils_strings,
+ "ctest-args": self.ctest_args,
}
return {k: v for k, v in data.items() if v != ""}
@@ -318,7 +321,7 @@ def escape(s):
return " ".join(escape(s))
-def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDetails:
+def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool, ctest_args: list[str]) -> JobDetails:
job = JobDetails(
name=spec.name,
key=key,
@@ -828,6 +831,7 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta
"-DCMAKE_C_COMPILER_LAUNCHER=ccache",
"-DCMAKE_CXX_COMPILER_LAUNCHER=ccache",
))
+ job.ctest_args = shlex.join(ctest_args)
if not build_parallel:
job.cmake_build_arguments.append("-j1")
if job.cflags or job.cppflags:
@@ -850,9 +854,14 @@ def tf(b):
return job
-def spec_to_platform(spec: JobSpec, key: str, enable_artifacts: bool, trackmem_symbol_names: bool) -> dict[str, str|bool]:
+def spec_to_platform(spec: JobSpec, key: str, enable_artifacts: bool, trackmem_symbol_names: bool, ctest_args:list[str]) -> dict[str, str|bool]:
logger.info("spec=%r", spec)
- job = spec_to_job(spec, key=key, trackmem_symbol_names=trackmem_symbol_names)
+ job = spec_to_job(
+ spec,
+ key=key,
+ trackmem_symbol_names=trackmem_symbol_names,
+ ctest_args=ctest_args,
+ )
logger.info("job=%r", job)
platform = job.to_workflow(enable_artifacts=enable_artifacts)
logger.info("platform=%r", platform)
@@ -881,6 +890,7 @@ def main():
)
filters = []
+ ctest_args = []
if args.commit_message_file:
with open(args.commit_message_file, "r") as f:
commit_message = f.read()
@@ -893,6 +903,9 @@ def main():
if re.search(r"\[sdl-ci-(full-)?trackmem(-symbol-names)?]", commit_message, flags=re.M):
args.trackmem_symbol_names = True
+ for m in re.finditer(r"\[sdl-ci-ctest-args? (.*)]", commit_message, flags=re.M):
+ ctest_args.extend(shlex.split(m.group(1)))
+
if not filters:
filters.append("*")
@@ -900,7 +913,7 @@ def main():
all_level_platforms = {}
- all_platforms = {key: spec_to_platform(spec, key=key, enable_artifacts=args.enable_artifacts, trackmem_symbol_names=args.trackmem_symbol_names) for key, spec in JOB_SPECS.items()}
+ all_platforms = {key: spec_to_platform(spec, key=key, enable_artifacts=args.enable_artifacts, trackmem_symbol_names=args.trackmem_symbol_names, ctest_args=ctest_args) for key, spec in JOB_SPECS.items()}
for level_i, level_keys in enumerate(all_level_keys, 1):
level_key = f"level{level_i}"
diff --git a/.github/workflows/generic.yml b/.github/workflows/generic.yml
index 183146679b3fe..82fcbaf15666d 100644
--- a/.github/workflows/generic.yml
+++ b/.github/workflows/generic.yml
@@ -242,7 +242,7 @@ jobs:
${{ matrix.platform.pretest-cmd }}
set -eu
export SDL_TESTS_QUICK=1
- ctest -VV --test-dir build/ -j2
+ ctest --test-dir build/ ${{ matrix.platform.ctest-args || '-VV -j2' }}
- name: "Build test apk's (CMake)"
id: apks
if: ${{ always() && steps.build.outcome == 'success' && matrix.platform.android-apks != '' }}
diff --git a/docs/README-contributing.md b/docs/README-contributing.md
index 02a37bf756620..b926e1d0deee5 100644
--- a/docs/README-contributing.md
+++ b/docs/README-contributing.md
@@ -95,6 +95,7 @@ Its behaviour can be influenced slightly by including SDL-specific tags in your
- `[sdl-ci-filter GLOB]` limits the platforms for which to run ci.
- `[sdl-ci-artifacts]` forces SDL artifacts, which can then be downloaded from the summary page.
- `[sdl-ci-trackmem-symbol-names]` makes sure the final report generated by `--trackmem` contains symbol names.
+- `[sdl-ci-ctest-args]` allows overriding the ctest arguments. Adding `--repeat-until-fail N` and `-R NAME` is useful.
## Contributing to the documentation