Skip to content

GitHub Actions

Taner Sener edited this page Aug 27, 2026 · 2 revisions

FFmpegKitNext builds every platform script on GitHub Actions. There is one workflow per project-level <platform>.sh script, stored under .github/workflows/<platform>-build-scripts.yml.

Status: These workflows currently live on the development branch and have not been merged to main yet. If you are looking at main, you will not find them under .github/workflows/ until the merge lands. Remove this note once they reach main.

The nix-<platform>.sh wrappers and apple.sh have no workflows. The Nix wrappers enter a pinned profile and then call the same direct scripts, so the direct scripts are the ones that need CI coverage: they are the build path most sensitive to host PATH, package manager, compiler and Autotools differences. apple.sh only packages already-built Apple frameworks; it does not compile anything.

How These Workflows Are Defined

The workflows are generated from the information already published in this wiki:

Workflow element Wiki source
Runner operating system for each script Host Support
Dependency install step for each job The matching Prerequisites page, "Requirements Without Nix"
Toolchain versions The matching Prerequisites page
Build options passed to the script The matching <platform>.sh page

When a build fails in CI because a host tool is missing, the fix belongs in both places: the workflow installs the tool, and the Prerequisites page is corrected so manual non-Nix builds get the same information.

Jobs

Job Runner Script Architecture Libraries
android arm64-v8a on ubuntu-24.04 ubuntu-24.04 android.sh arm64-v8a all except gnutls
android arm64-v8a on macos-26 macos-26 android.sh arm64-v8a all except gnutls
ios arm64 on macos-26 macos-26 ios.sh arm64 all except gnutls
tvos arm64 on macos-26 macos-26 tvos.sh arm64 all except gnutls
macos arm64 on macos-26 macos-26 macos.sh arm64 all except gnutls
visionos arm64 on macos-26 macos-26 visionos.sh arm64 all except gnutls
linux x86-64 on ubuntu-24.04 ubuntu-24.04 linux.sh x86-64 all except linux-gnutls
linux arm64 on ubuntu-24.04-arm ubuntu-24.04-arm linux.sh arm64 all except linux-gnutls
web wasm32 on ubuntu-24.04 ubuntu-24.04 web.sh wasm32 all except gnutls
web wasm32 on macos-26 macos-26 web.sh wasm32 all except gnutls
windows arm64 on windows-11-arm windows-11-arm windows.sh arm64 all except gnutls

The Apple jobs additionally pass --xcframework, so they also exercise the xcframework packaging path.

One Architecture Per Job

A GitHub Actions job is cancelled after six hours. Each architecture rebuilds FFmpeg and every enabled external library from source, so building all architectures of a platform in one job exceeds that limit on several platforms. Every job therefore pins a single architecture with --arch, which also makes a failure point at one architecture instead of an entire platform.

The architecture matches the runner where the build is native rather than cross-compiled. linux.sh and windows.sh compile natively, so the host architecture is the target and there is no cross-compilation path: x86-64 needs an x86-64 runner and arm64 needs an arm64 runner. android.sh and the Apple scripts cross-compile, and web.sh always targets wasm32-unknown-emscripten, so their host architecture is unconstrained.

Library Selection

Every job builds with --enable-lib-all --enable-gpl, the widest configuration each script accepts. This exercises the most build code per run, and is the other reason a single architecture per job matters. The GPL-licensed libraries this adds are x264, x265, xvidcore, libvidstab and rubberband.

gnutls is the one exclusion. FFmpeg supports several HTTPS/TLS implementations but only one at a time, and its configure rejects the combination outright:

GnuTLS and OpenSSL must not be enabled at the same time.

Since --enable-lib-all enables both, gnutls is disabled so openssl provides TLS. The option is --disable-lib-gnutls on every platform except Linux, where the system-package variant is named differently and the option is --disable-lib-linux-gnutls.

Note that --enable-lib-all means different work on different platforms. On Linux the --enable-lib-linux-* options resolve against system development packages through pkg-config, so the Linux jobs install those -dev packages in a separate step. On the other platforms the libraries are compiled from source.

Toolchain Versions

Toolchains are pinned so CI matches the versions this project targets, rather than drifting with the runner images:

Platform Pinned toolchain
Android SDK Platform 34, Build Tools 35.0.0, NDK 27.3.13750724, CMake 3.22.1, Temurin JDK 21
iOS / tvOS / macOS / visionOS Xcode 26.6, selected explicitly rather than the macos-26 image default
Linux Distribution toolchain from ubuntu-24.04
Web Emscripten 5.0.6, matching the version the Nix web profile provides
Windows MSYS2 CLANGARM64 environment, providing aarch64-w64-mingw32-clang

Host Coverage

The jobs cover every host combination listed in Host Support, with two exceptions:

  • Android on arm64 Linux has no job. The Android NDK ships darwin-x86_64, linux-x86_64 and windows-x86_64 toolchains only, so the Linux Android job runs on the x86-64 image. Android on Apple silicon is unaffected, because the NDK's darwin binaries are universal.
  • Web on Windows has no job. Host Support lists Linux and macOS as the supported non-Nix hosts for web.sh, and Emscripten has no native Windows arm64 build.

windows.sh targets arm64 only. x86-64 is implemented but not yet tested, so it has no job.

Home

Clone this wiki locally