Skip to content

ci(cross-compile): use aptitude to install apt packages (#395) #161

ci(cross-compile): use aptitude to install apt packages (#395)

ci(cross-compile): use aptitude to install apt packages (#395) #161

Workflow file for this run

---
name: CI
on:
pull_request:
branches: [master]
types: [opened, synchronize, reopened]
push:
branches: [master]
workflow_dispatch:
concurrency:
group: "${{ github.workflow }}-${{ github.ref }}"
cancel-in-progress: true
env:
MACOSX_DEPLOYMENT_TARGET: 13.0
jobs:
build:
name: Build (${{ matrix.name }})
# https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu
# https://trac.ffmpeg.org/wiki/CompilationGuide/macOS
# https://trac.ffmpeg.org/wiki/CompilationGuide/MinGW
strategy:
fail-fast: false # false to test all, true to fail entire job if any fail
matrix:
include:
- name: Linux-x86_64 # ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}
os: ubuntu-22.04
arch: x86_64
generator: "Unix Makefiles"
shell: bash
- name: Linux-aarch64
os: ubuntu-22.04
arch: aarch64
generator: "Unix Makefiles"
shell: bash
target: aarch64-linux-gnu
- name: Linux-ppc64le
os: ubuntu-22.04
arch: powerpc64le
generator: "Unix Makefiles"
shell: bash
target: powerpc64le-linux-gnu
- name: Darwin-x86_64
os: macos-13
arch: x86_64
generator: "Unix Makefiles"
shell: bash
target: x86_64-apple-macosx
- name: Darwin-arm64
os: macos-14
arch: aarch64
generator: "Unix Makefiles"
shell: bash
target: arm64-apple-macosx
- name: Windows-AMD64
os: windows-2022
arch: x86_64
generator: "MSYS Makefiles"
shell: msys2 {0}
runs-on: ${{ matrix.os }}
defaults:
run:
shell: ${{ matrix.shell }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup cross compiling Linux
id: cross_compile
if: contains(matrix.os, 'ubuntu')
run: |
echo "::group::distro detection"
# detect dist name like bionic, focal, etc
dist_name=$(lsb_release -cs)
ubuntu_version=$(lsb_release -rs)
ubuntu_major_version=${ubuntu_version%%.*}
echo "detected dist name: $dist_name"
echo "detected ubuntu version: $ubuntu_version"
echo "detected ubuntu major version: $ubuntu_major_version"
echo "::endgroup::"
echo "::group::install aptitude"
sudo apt-get update # must run before changing sources file
sudo apt-get install -y \
aptitude
echo "::endgroup::"
if [[ $ubuntu_major_version -le 20 ]]; then
# activate mesa backport PPA to ensure ffmpeg builds with vaSyncBuffer()
# (via libva 2.9.0 or later)
sudo add-apt-repository ppa:kisak/turtle -y
fi
echo "::group::dependencies prep"
dependencies=(
"autoconf"
"automake"
"build-essential"
"cmake"
"git-core"
"libass-dev"
"libfreetype6-dev"
"libgnutls28-dev"
"libmp3lame-dev"
"libnuma-dev"
"libopus-dev"
"libsdl2-dev"
"libtool"
"libvorbis-dev"
"libxcb1-dev"
"libxcb-shm0-dev"
"libxcb-xfixes0-dev"
"make"
"meson"
"nasm"
"ninja-build"
"pkg-config"
"texinfo"
"wget"
"zlib1g-dev"
)
package_arch="amd64"
cross_compile=false
package_arch=$(dpkg --print-architecture)
if [[ ${{ matrix.arch }} == "aarch64" ]]; then
dependencies+=("crossbuild-essential-arm64")
cross_compile=true
package_arch="arm64"
elif [[ ${{ matrix.arch }} == "powerpc64le" ]]; then
dependencies+=("crossbuild-essential-ppc64el")
cross_compile=true
package_arch="ppc64el"
fi
echo "cross compiling: $cross_compile"
echo "package architecture: $package_arch"
dependencies+=(
"libva-dev:$package_arch"
"libva-glx2:$package_arch"
"libgl1:$package_arch"
"libglx0:$package_arch"
)
echo "::group::apt sources"
mirror="https://ports.ubuntu.com/ubuntu-ports"
# source file changed in 24.04
if [[ $ubuntu_major_version -ge 24 ]]; then
source_file="/etc/apt/sources.list.d/ubuntu.sources"
extra_sources=$(cat <<- VAREOF
Types: deb
URIs: mirror+file:/etc/apt/apt-mirrors.txt
Suites: ${dist_name} ${dist_name}-updates ${dist_name}-backports ${dist_name}-security
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Architectures: $(dpkg --print-architecture)
Types: deb
URIs: ${mirror}
Suites: ${dist_name} ${dist_name}-updates ${dist_name}-backports ${dist_name}-security
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Architectures: ${package_arch}
VAREOF
)
else
source_file="/etc/apt/sources.list"
extra_sources=$(cat <<- VAREOF
deb [arch=${package_arch}] ${mirror} ${dist_name} main restricted
deb [arch=${package_arch}] ${mirror} ${dist_name}-updates main restricted
deb [arch=${package_arch}] ${mirror} ${dist_name} universe
deb [arch=${package_arch}] ${mirror} ${dist_name}-updates universe
deb [arch=${package_arch}] ${mirror} ${dist_name} multiverse
deb [arch=${package_arch}] ${mirror} ${dist_name}-updates multiverse
deb [arch=${package_arch}] ${mirror} ${dist_name}-backports main restricted universe multiverse
deb [arch=${package_arch}] ${mirror} ${dist_name}-security main restricted
deb [arch=${package_arch}] ${mirror} ${dist_name}-security universe
deb [arch=${package_arch}] ${mirror} ${dist_name}-security multiverse
VAREOF
)
fi
if [[ ${cross_compile} == true ]]; then
# print original sources
echo "original sources:"
sudo cat ${source_file}
echo "----"
sudo dpkg --add-architecture ${package_arch}
if [[ $ubuntu_major_version -ge 24 ]]; then
echo "$extra_sources" | sudo tee ${source_file} > /dev/null
else
# fix original sources
sudo sed -i -e "s#deb mirror#deb [arch=amd64] mirror#g" ${source_file}
echo "$extra_sources" | sudo tee -a ${source_file} > /dev/null
fi
echo "----"
echo "new sources:"
sudo cat ${source_file}
echo "----"
fi
echo "::endgroup::"
echo "::group::output"
echo "CROSS_COMPILE=${cross_compile}"
echo "CROSS_COMPILE=${cross_compile}" >> $GITHUB_OUTPUT
echo "DEPENDENCIES=${dependencies[@]}"
echo "DEPENDENCIES=${dependencies[@]}" >> $GITHUB_OUTPUT
echo "PKG_CONFIG_SYSROOT_DIR=${pkg_config_sysroot_dir}"
echo "PKG_CONFIG_SYSROOT_DIR=${pkg_config_sysroot_dir}" >> $GITHUB_ENV
echo "PKG_CONFIG_PATH=${pkg_config_sysroot_dir}/pkgconfig"
echo "PKG_CONFIG_PATH=${pkg_config_sysroot_dir}/pkgconfig" >> $GITHUB_ENV
echo "::endgroup::"
- name: Install system dependencies Linux
if: contains(matrix.os, 'ubuntu')
run: |
echo "::group::apt update"
sudo apt-get update
echo "::endgroup::"
echo "::group::install dependencies"
sudo aptitude install -y --without-recommends ${{ steps.cross_compile.outputs.DEPENDENCIES }}
echo "::endgroup::"
- name: Setup Dependencies MacOS
if: ${{ runner.os == 'macOS' }}
run: |
dependencies=(
"automake"
"fdk-aac"
"git"
"lame"
"libass"
"libtool"
"libvorbis"
"libvpx"
"nasm"
"ninja"
"opus"
"pkg-config"
"sdl"
"shtool"
"texi2html"
"theora"
"wget"
"xvid"
)
brew install ${dependencies[@]}
- name: Setup Dependencies Windows
# if a dependency needs to be pinned, see https://github.com/LizardByte/build-deps/pull/186
if: ${{ runner.os == 'Windows' }}
uses: msys2/setup-msys2@v2
with:
msystem: ucrt64
update: true
install: >-
diffutils
git
make
pkg-config
mingw-w64-ucrt-x86_64-binutils
mingw-w64-ucrt-x86_64-cmake
mingw-w64-ucrt-x86_64-gcc
mingw-w64-ucrt-x86_64-make
mingw-w64-ucrt-x86_64-nasm
mingw-w64-ucrt-x86_64-ninja
mingw-w64-ucrt-x86_64-onevpl
- name: Debug msys2.CMD
if: ${{ runner.os == 'Windows' }}
run: |
cat /d/a/_temp/setup-msys2/msys2.CMD
- name: Initialize Submodules
# libx265 has issues when using the recursive method of the first checkout action
# this is after `msys2/setup-msys2@v2` because `msys2` (default) shell is not available until then.
run: |
git submodule update --init --recursive
- name: Setup ENV
id: root
run: |
echo "ROOT_PATH=$PWD" >> $GITHUB_ENV
- name: Setup cross compilation
id: cross
if: ${{ matrix.target != '' }}
run: |
TOOLCHAIN=${ROOT_PATH}/cmake/toolchains/${{ matrix.target }}.cmake
# fail if file does not exist
if [ ! -f $TOOLCHAIN ]; then
echo "Toolchain file not found: $TOOLCHAIN"
exit 1
fi
echo "CMAKE_TOOLCHAIN_FILE=$TOOLCHAIN" >> $GITHUB_ENV
if [[ ${{ runner.os }} == 'Linux' ]]; then
echo "CCPREFIX=/usr/bin/${{ matrix.target }}-" >> $GITHUB_ENV
fi
- name: Get Processor Count
id: processor_count
run: |
if [[ ${{ runner.os }} == 'macOS' ]]; then
echo "PROCESSOR_COUNT=$(sysctl -n hw.ncpu)" >> $GITHUB_OUTPUT
else
echo "PROCESSOR_COUNT=$(nproc)" >> $GITHUB_OUTPUT
fi
- name: Configure
run: |
mkdir -p ./build/dist
cmake \
-B build \
-S . \
-G "${{ matrix.generator }}" \
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} \
-DCMAKE_INSTALL_PREFIX="${ROOT_PATH}/build/dist"
- name: Build
run: |
make -C build -j${{ steps.processor_count.outputs.PROCESSOR_COUNT }}
- name: Install
run: |
make -C build install
- name: Debug logs
if: always()
run: |
echo "::group::x264 config.log"
cat ./third-party/FFmpeg/x264/config.log || true
echo "::endgroup::"
echo "::group::FFmpeg config.log"
cat ./build/generated-src/FFmpeg/ffbuild/config.log || true
echo "::endgroup::"
- name: Debug build directory
if: always()
run: |
ls -R ./build
- name: Debug build/dist directory
if: always()
run: |
ls -R ./build/dist
- name: Cleanup
run: |
rm -f -r ./build/dist/share
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.name }}
path: ./build/dist
update_dist:
# only the commit is conditional, so the rest of the job can be verified on PRs
name: Update dist
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout dist
uses: actions/checkout@v4
with:
ref: dist
path: dist
persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of the personal token
fetch-depth: 0 # otherwise, will fail to push refs to dest repo
- name: Cleanup
run: |
rm -rf dist/*
mkdir -p dist/dist
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: dist/dist
- name: Debug dist directory
run: |
ls -R dist
- name: Commit dist
if: >-
startsWith(github.repository, 'LizardByte/') &&
github.ref == 'refs/heads/master' &&
(github.event_name == 'push' || github.event_name == 'workflow_dispatch')
uses: actions-js/push@v1.5
with:
github_token: ${{ secrets.GH_BOT_TOKEN }}
author_email: ${{ secrets.GH_BOT_EMAIL }}
author_name: ${{ secrets.GH_BOT_NAME }}
directory: dist
branch: dist
force: false
message: "Commit ${{ github.sha }}"