Skip to content

CMake: support cross-compiling for Generic targets - #5316

Merged
bennylp merged 13 commits into
masterfrom
cmake-cross-compile
Oct 6, 2026
Merged

bennylp merged 13 commits into
masterfrom
cmake-cross-compile

Conversation

@bennylp

@bennylp bennylp commented Oct 5, 2026 •

Copy link
Copy Markdown
Member

CMake: support cross-compiling for Generic targets

Motivation

pjproject is being ported to an RTOS (Zephyr, on Cortex-M). Zephyr builds with CMake, and the plan is for its module to reuse the per-library CMakeLists.txt in this tree rather than maintain a fourth source list. That requires the CMake build to configure cleanly for a target CMake calls Generic: no operating system underneath, or an RTOS that brings its own build system. On master this fails: project() demands a C++ compiler, find_library(m REQUIRED) aborts in the bundled codecs, every bundled dependency is configured whether or not the consumer can use it, and pjsip-apps declares console executables unconditionally.

This PR makes the Generic configure succeed with a plain GCC cross toolchain and adds a sample toolchain file and CI jobs for it. Every existing platform is left identical: a native Linux configure after this change has the same notices, the same target list and the same object rules as master, and the full build is warning-free. A full cross build is not expected yet: pjlib still needs a socket layer and pthreads, which an RTOS supplies.

Changes

  • project() now declares LANGUAGES C. New option PJ_WITH_CXX (default ON) calls enable_language(CXX) and gates everything that needs C++: pjsua2, pjsua2-test, pjsua2_demo and the SWIG bindings; pjlib's atomic_queue.cpp and the Apple c++ runtime link; the C++ sources and backend options in pjmedia (WebRTC AEC3, libyuv, Lyra, OpenH264, Oboe, WASAPI, DirectShow, Android MediaCodec); the bundled webrtc_aec3 and yuv dependencies; and bundled WebRTC on x86, whose CPU-feature detection (cpu_features.cc) is C++. Off, the build is pure C.
  • New macro PJ_HAS_ATOMIC_QUEUE (default 1 in pj/config.h). The CMake build writes it into the generated, installed pj/compat/os_auto.h, 0 when C++ is off, and pj/atomic_queue.h declares the API only when it is set, so a C consumer of a C-only install fails to compile rather than to link. The API is used only by the Android Oboe and MediaCodec backends, which are C++ themselves. The MSVC project never compiled atomic_queue.cpp either and could use the same macro; not changed here.
  • New option PJ_BUILD_APPS (default ON) controls add_subdirectory(pjsip-apps), so a build of ALL for a target without a console does not try to link programs.
  • Every PJ_DEP_<X> option gains a third provider value, none, which leaves the dependency out; the pjmedia features that need it switch themselves off through their existing TARGET Pj::Dep::<X> checks. The provider loop now resets dep_target per iteration; without that, a left-out dependency would have been aliased to the previous one's target.
  • The six bundled libraries that used find_library(MATH_LIBRARY m REQUIRED) now use the optional form pjlib already uses, and they and pjmedia link m by name so a cross toolchain resolves it through its multilib specs rather than the default-multilib archive find_library() returns; on a Generic system m is linked even when find_library() misses it, as pjlib already did. On Linux the link lines have the same tokens as before. pjlib no longer forces PJLIB_WITH_FLOATING_POINT off on a Generic system for a missing libm.
  • The install target list appends pjsua2 and pjsua only when those targets exist, replacing the fixed list and the if(NOT IOS) for pjsua. Equivalent on every existing platform.
  • Architecture detection uses try_compile() instead of try_run(). The probe reports the architecture through a deliberate #error, so the run step never happened and its result was never read; try_run() only added cross-compiling rules to satisfy.
  • The SIMD compile check in pj_detect_arch_simd_ext() now actually runs for a Generic system. Its result variable was preset to true before the check, which makes check_c_source_compiles() skip it, so every ARM target was assumed to have NEON. On a Generic system the check no longer adds -mfpu=neon itself, which would override the target's FPU flags and compile NEON for a Cortex-M33 with FPU; it tests __ARM_NEON, so the CPU flags given to the toolchain decide. The cached result is versioned so a build directory configured by an older probe is re-probed. Hosted platforms keep the preset; see the open issue below.
  • pjmedia sets the effective value of every PJMEDIA_WITH_* option into the parent scope, and the package export goes by the Pj::Dep::<X> targets rather than the PJ_DEP_<X> cache entries, so PjConfig.cmake describes what was built after a reconfigure that turned C++ or a provider off. A forced PJMEDIA_WITH_RESAMPLE=none is reset when the option is declared again, so re-enabling the provider restores libresample.
  • New cmake/toolchains/arm-none-eabi.cmake: Generic/arm, compiler prefix and CPU flags from PJ_TOOLCHAIN_PREFIX and PJ_TARGET_CPU_FLAGS (-D or environment on the first configure, remembered in the cache from then on; defaults arm-none-eabi- and -mcpu=cortex-m33 -mthumb), compile-only try_compile, and CMAKE_FIND_ROOT_PATH restricted to the toolchain's own tree so host libraries and CMake packages are never picked up. The tree is GCC's sysroot when it reports one; otherwise it is the innermost directory named after the compiler's triplet on the path of its libc.a, which covers the Zephyr SDK and Debian's gcc-arm-none-eabi layouts, and an unrecognised layout stops with an error naming -DCMAKE_FIND_ROOT_PATH rather than searching the host.
  • tests/cmake builds its pjsua2 consumer only when the install provides Pj::pjsua2.
  • New CI jobs in ci-linux.yml. cmake-build-c-only: full native build with PJ_WITH_CXX=OFF, install, and the C consumer test. cmake-reconfigure: tests/cmake/reconfigure.sh configures a directory with one option set and reconfigures it with another, and compares every generated file against a fresh configure with the second set, for ten transitions. cmake-cross-arm-none-eabi: cross configure with the Ubuntu Arm GNU toolchain packages, asserting the toolchain's libm, no C++ compiler and no NEON flags; builds resample and checks its ELF attributes say Cortex-M33; compiles the 34 pjlib files that need only the C library's headers; configures a hard-float Cortex-M33 from a cache seeded with the old probe's NEON result and asserts no NEON; configures with every bundled dependency set to none.

Cross configure

cmake -S . -B build-cross --toolchain cmake/toolchains/arm-none-eabi.cmake \
  -DPJ_WITH_CXX=OFF -DPJ_BUILD_APPS=OFF -DBUILD_TESTING=OFF -DPJLIB_WITH_SSL=

Add -DPJ_TOOLCHAIN_PREFIX=/path/to/arm-zephyr-eabi- for a toolchain that is not on PATH, and -DPJ_TARGET_CPU_FLAGS=... for another core or FPU. For a footprint configuration add -DPJ_DEP_G7221=none -DPJ_DEP_GSM=none -DPJ_DEP_ILBC=none -DPJ_DEP_SPEEX=none -DPJ_DEP_WEBRTC=none -DPJMEDIA_WITH_VIDEO=OFF; SRTP and Resample can be set to none too.

Validation

  • Native Linux, defaults, fresh build directories against a master baseline: configure notices identical, --target help identical, the object rules in every generated build.make identical, all 34 link commands have the same token set. Full build exit 0, zero compiler warnings, pjsua2, pjsua2_demo and pjsua2-test built.
  • Native Linux with -DPJ_WITH_CXX=OFF: full build exit 0, zero warnings, pjsua and all test programs built, no C++ compiler in the cache, no pjsua2/yuv/webrtc_aec3/webrtc targets; install and C consumer test pass.
  • Reconfigure guard: all ten transitions match a fresh configure on this branch; run against master it reports the stale ALSA and video dependencies in PjConfig.cmake.
  • Cross, Zephyr SDK 1.0.1 (GCC 14.3, picolibc) and Ubuntu gcc-arm-none-eabi 13.2 (newlib): configure and generate exit 0 with both, libm found inside each toolchain's tree, no host OpenSSL config picked up, PJ_HAS_FLOATING_POINT 1, little endian, PJ_IOQUEUE_IMP_SELECT, PJ_HAS_SSL_SOCK 0. Also with -DPJ_WITH_CXX=ON (g++ detected) and with every PJ_DEP_*=none including SRTP and Resample.
  • Cross build: resample and gsm build for Cortex-M33. Of the 53 pjlib sources configured for the target, 34 compile and 19 do not: every file that includes pj/sock.h, whose address types need netinet/in.h, plus os_core_unix.c for pthread.h; an RTOS provides both. webrtc compiles with the plain C sources down to one error, once() in spl_init.c, which needs WEBRTC_POSIX or _WIN32 defined.
  • Cross, Cortex-M33 with -mfpu=fpv5-sp-d16 -mfloat-abi=hard: no NEON selected, also when the cache holds the old probe's NEON result. A Generic Cortex-A7 with -mfpu=neon-vfpv4 -mfloat-abi=hard selects NEON without an added flag and its NEON objects compile.
  • Windows, Android and iOS were not run here. All three keep PJ_WITH_CXX at its default ON, so enable_language(CXX) runs right after project() and every C++ target, source and option is exactly as before; the cmake_dependent_option conditions only gained a true term. The Android CI asserts Oboe, JNI, OpenGL, Android video and MediaCodec stay on, and atomic_queue.cpp, which Oboe and MediaCodec need, is still compiled. On iOS, pjsip-apps was already skipped and pjsua was already left out of the install list; the sample-libs block already tolerates absent targets.

Open issues

  • The SIMD compile check still does not run on hosted platforms, where the preset result is kept deliberately. The arm architecture name covers both cores with NEON and cores without it, so a 32-bit Linux build on an armv6 board would still get NEON sources. Letting the check run everywhere is a one-line change (move the preset into an else() branch), held back until a CI run confirms the check passes on Mac arm64 (-march=armv8-a+simd) and Android.
  • Options that depend on another option or on a found package keep stale values across reconfigures of the same build directory, on master as well. cmake_dependent_option() leaves the previous choice in the cache and sets the effective value in its own directory only, while pj_force_set() writes the cache and the forced value outlives its cause; the root reads option variables from both when it writes PjConfig.cmake. This PR fixes the cases it made reachable (PJ_WITH_CXX, the none providers, the resampling option) and adds a CI job that compares a reconfigure against a fresh configure for ten option transitions. The fundamental fix is separate work: derive the package config from the exported targets rather than from option variables, and let the helpers in cmake/Pj/Option.cmake own forcing and resetting.
  • The libpjproject.pc the CMake build installs has an empty Cflags line, so a pkg-config consumer of a CMake install gets neither the include path nor PJ_AUTOCONF. Pre-existing and separate.
  • For an RTOS port, separately: no PJ_M_* macro is emitted for the arm canonical name, so pj/config.h falls back to its own __arm__ block; libsrtp's static srtp_config.h hard-codes its platform header guards and stops every srtp object with "Platform not recognized"; WebRTC's spl_init.c needs WEBRTC_POSIX defined; and FindThreads reports pthreads found under compile-only probing, harmless for static libraries.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Generic libm fallback remains incomplete, and toolchain root discovery can hang or expose host packages.

Review effort: Balanced
Findings: 1 High severity · 7 Medium severity

Open (8)
What changed in this PR

Adds CMake support for pure-C, cross-compiled Generic/RTOS targets.

Changes:

  • Makes C++ components and applications optional.
  • Adds optional dependency providers and cross-compilation handling.
  • Adds an Arm GCC toolchain and CI coverage.
File Description
CMakeLists.txt Adds C++ and application build options.
pjlib/​CMakeLists.txt Gates C++ sources and handles Generic libm.
pjmedia/​CMakeLists.txt Gates C++ media backends and codecs.
pjsip/​CMakeLists.txt Makes pjsua2 targets conditional.
pjsip-apps/​CMakeLists.txt Gates C++ samples and SWIG bindings.
third_party/​CMakeLists.txt Adds none providers and C++ dependency gating.
third_party/​g7221/​CMakeLists.txt Revises libm discovery and linkage.
third_party/​ilbc/​CMakeLists.txt Revises libm discovery and linkage.
third_party/​speex/​CMakeLists.txt Revises libm discovery and linkage.
third_party/​webrtc/​CMakeLists.txt Revises libm discovery and linkage.
third_party/​webrtc_aec3/​CMakeLists.txt Revises libm discovery and linkage.
third_party/​yuv/​CMakeLists.txt Revises libm discovery and linkage.
cmake/​Pj/​DetectArch.cmake Makes architecture probing cross-compatible.
cmake/​toolchains/​arm-none-eabi.cmake Adds an Arm Generic GCC toolchain.
.github/​workflows/​ci-linux.yml Adds Arm cross-configuration CI coverage.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread cmake/toolchains/arm-none-eabi.cmake Outdated
Comment thread .github/workflows/ci-linux.yml Outdated
Comment thread third_party/g7221/CMakeLists.txt Outdated
Comment thread third_party/ilbc/CMakeLists.txt Outdated
Comment thread third_party/speex/CMakeLists.txt Outdated
Comment thread third_party/webrtc/CMakeLists.txt Outdated
Comment thread third_party/webrtc_aec3/CMakeLists.txt Outdated
Comment thread third_party/yuv/CMakeLists.txt Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Custom toolchain settings are not propagated to probes, and the pure-C configuration exposes an unimplemented public API.

Review effort: Balanced
Findings: 1 High severity

Open (1)
Resolved since last review (8)
Previously missed (2)

In code that hasn't changed since last review

Medium severity Propagate custom toolchain variables into nested try_compile projects

cmake/​toolchains/​arm-none-eabi.cmake:26

PJ_TOOLCHAIN_PREFIX and PJ_TARGET_CPU_FLAGS are custom toolchain variables, but they are not propagated into nested try_compile() projects. When the documented -DPJ_TOOLCHAIN_PREFIX=... form is used, a nested configure can reload this file without that value and overwrite CMAKE_C_COMPILER with the default arm-none-eabi-gcc, breaking compiler checks or architecture/SIMD probes. Register both variables with CMAKE_TRY_COMPILE_PLATFORM_VARIABLES.

Medium severity Stale provider cache entries corrupt export metadata when C++ is disabled

third_party/​CMakeLists.txt:64

When C++ is disabled, this provider option is no longer instantiated, but an existing or explicitly supplied PJ_DEP_YUV cache entry remains defined. The package-export code later treats any defined PJ_DEP_YUV=system|bundled as selected, so a pure-C install can incorrectly require YUV (or warn about a bundled target that was never created). The same stale-cache path affects the newly gated WebRTC/WebRTC_AEC3 providers; collect export metadata only for providers whose Pj::Dep::* target exists, or clear unavailable provider cache entries.

Comment thread pjlib/CMakeLists.txt

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The toolchain can derive /usr as its root and unintentionally search host dependencies.

Review effort: Balanced
Findings: 1 High severity

Open (1)
Resolved since last review (1)

Comment thread cmake/toolchains/arm-none-eabi.cmake Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

It changes cross-platform build and dependency behavior across numerous targets while Windows, Android, and iOS remain unvalidated.

Review effort: Balanced
Findings: None

Resolved since last review (1)

@bennylp

bennylp commented Oct 5, 2026

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 019c15bb9f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread pjlib/CMakeLists.txt Outdated
@bennylp

bennylp commented Oct 5, 2026

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1424f7801d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread third_party/CMakeLists.txt
@bennylp

bennylp commented Oct 5, 2026

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. You're on a roll.

Reviewed commit: 426e526ac6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

CI does not yet compile the full C-only configuration or verify the corrected Generic SIMD selection.

Review effort: Balanced
Findings: 1 Low severity

Open (1)
Previously missed (1)

In code that hasn't changed since last review

Medium severity CI does not verify the Generic SIMD probe or exclude NEON

.github/​workflows/​ci-linux.yml:871

This check only validates the CPU flags on resample; it does not verify the new Generic SIMD probe. If that probe regresses and selects NEON for Cortex-M33 again, this job still passes because WebRTC is never built or inspected. Assert that the generated WebRTC rules omit the NEON sources (or assert the probe's cached result) so the regression this PR fixes is covered.

Comment thread .github/workflows/ci-linux.yml

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

Reconfiguration can export stale C++ dependencies, and pjmedia may still link the wrong multilib libm archive.

Review effort: Balanced
Findings: None

Resolved since last review (1)
Previously missed (2)

In code that hasn't changed since last review

Medium severity Absolute libm path bypasses Cortex-M multilib selection

cmake/​toolchains/​arm-none-eabi.cmake:78

This root path lets find_library(MATH_LIBRARY m) resolve a concrete default-multilib archive. Although pjlib and the bundled codecs now link m by name, pjmedia/CMakeLists.txt:671-676 still records the absolute MATH_LIBRARY; for a static Cortex-M33 build, the final link can therefore pull the toolchain's base ARM libm instead of the multilib selected by -mcpu/-mthumb. Update pjmedia's math dependency to use m by name with the same Generic fallback.

Medium severity Stale PJ_WITH_CXX value leaks into generated package config

pjmedia/​CMakeLists.txt:205

When an existing build is reconfigured from PJ_WITH_CXX=ON to OFF, cmake_dependent_option() preserves the prior ON cache choice and exposes OFF only in this directory. The root directory therefore expands the stale ON value into PjConfig.cmake (cmake/Pj/PjConfig.cmake.in:113-115), so a C-only installed package still requires Lyra. Propagate the effective post-import value to the parent scope.

This issue also appears in the following locations of the same file:

  • line 208
  • line 229
  • line 255
  • line 292

@bennylp
bennylp marked this pull request as ready for review October 5, 2026 16:47
@bennylp
bennylp requested a balanced review from Copilot October 5, 2026 16:48

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Non-Generic builds discard resolved libm paths, potentially selecting the wrong library or failing to link.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)
Previously missed (7)

In code that hasn't changed since last review

Medium severity Link the resolved MATH_LIBRARY path instead of literal m

pjlib/​CMakeLists.txt:299

Using the literal m discards the path returned by find_library(). On a non-Generic build where m is supplied through CMAKE_LIBRARY_PATH or a non-default SDK path, configuration succeeds but the linker searches its defaults and can select the wrong library or fail. Keep m only for the Generic multilib fallback; otherwise link the resolved MATH_LIBRARY as before.

Medium severity Link the resolved MATH_LIBRARY path instead of literal m

third_party/​g7221/​CMakeLists.txt:85

Using the literal m discards the path returned by find_library(). On a non-Generic build where m is supplied through CMAKE_LIBRARY_PATH or a non-default SDK path, configuration succeeds but the linker searches its defaults and can select the wrong library or fail. Keep m only for the Generic multilib fallback; otherwise link the resolved MATH_LIBRARY as before.

Medium severity Link the resolved MATH_LIBRARY path instead of literal m

third_party/​ilbc/​CMakeLists.txt:73

Using the literal m discards the path returned by find_library(). On a non-Generic build where m is supplied through CMAKE_LIBRARY_PATH or a non-default SDK path, configuration succeeds but the linker searches its defaults and can select the wrong library or fail. Keep m only for the Generic multilib fallback; otherwise link the resolved MATH_LIBRARY as before.

Medium severity Link the resolved MATH_LIBRARY path instead of literal m

third_party/​speex/​CMakeLists.txt:86

Using the literal m discards the path returned by find_library(). On a non-Generic build where m is supplied through CMAKE_LIBRARY_PATH or a non-default SDK path, configuration succeeds but the linker searches its defaults and can select the wrong library or fail. Keep m only for the Generic multilib fallback; otherwise link the resolved MATH_LIBRARY as before.

Medium severity Link the resolved MATH_LIBRARY path instead of literal m

third_party/​webrtc/​CMakeLists.txt:145

Using the literal m discards the path returned by find_library(). On a non-Generic build where m is supplied through CMAKE_LIBRARY_PATH or a non-default SDK path, configuration succeeds but the linker searches its defaults and can select the wrong library or fail. Keep m only for the Generic multilib fallback; otherwise link the resolved MATH_LIBRARY as before.

Medium severity Link the resolved MATH_LIBRARY path instead of literal m

third_party/​webrtc_aec3/​CMakeLists.txt:228

Using the literal m discards the path returned by find_library(). On a non-Generic build where m is supplied through CMAKE_LIBRARY_PATH or a non-default SDK path, configuration succeeds but the linker searches its defaults and can select the wrong library or fail. Keep m only for the Generic multilib fallback; otherwise link the resolved MATH_LIBRARY as before.

Medium severity Link the resolved MATH_LIBRARY path instead of literal m

third_party/​yuv/​CMakeLists.txt:105

Using the literal m discards the path returned by find_library(). On a non-Generic build where m is supplied through CMAKE_LIBRARY_PATH or a non-default SDK path, configuration succeeds but the linker searches its defaults and can select the wrong library or fail. Keep m only for the Generic multilib fallback; otherwise link the resolved MATH_LIBRARY as before.

Comment thread pjmedia/CMakeLists.txt

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

It changes cross-platform build and packaging behavior across many targets, while Windows, Android, and iOS were not validated.

Review effort: Balanced
Findings: None

Resolved since last review (1)

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

The broad cross-platform build-system changes warrant final human validation, particularly on the untested Windows, Android, and iOS configurations.

Review effort: Balanced
Findings: None

@bennylp
bennylp requested review from nanangizz and sauwming October 6, 2026 03:28

@nanangizz nanangizz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The "no C++ compiler" assertions in two of the new CI jobs can never fail; details inline.

Comment thread .github/workflows/ci-linux.yml Outdated
Comment thread .github/workflows/ci-linux.yml Outdated
@bennylp
bennylp merged commit 9192b71 into master Oct 6, 2026
63 of 68 checks passed
@bennylp
bennylp deleted the cmake-cross-compile branch October 6, 2026 08:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants