From 660a26832933a4c1e9d2d0f4abd37ebbe0047c8b Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Wed, 7 Feb 2024 20:06:48 +0100 Subject: [PATCH] Revamp CI and add linux-arm64 Signed-off-by: Mary Guillemard --- .github/workflows/ci.yml | 81 ++++++---------- Ryujinx.Graphics.Nvdec.Dependencies.nuspec | 1 + ci/compile.sh | 108 +++++++++++++++++++++ ci/run.sh | 39 ++++++++ 4 files changed, 175 insertions(+), 54 deletions(-) create mode 100755 ci/compile.sh create mode 100755 ci/run.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1315329..8850ddc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,10 +6,6 @@ on: description: 'FFmpeg/FFmpeg commit to build' required: true -env: - DECODERS: "h264,vp8" - MACOSX_DEPLOYMENT_TARGET: "11.0" - jobs: build: name: ${{ matrix.platform.name }} @@ -18,60 +14,37 @@ jobs: fail-fast: false matrix: platform: - - { name: win-x64, os: ubuntu-20.04, flags: "--arch=x86_64 --target-os=mingw32 --cross-prefix=x86_64-w64-mingw32- --disable-w32threads --extra-ldflags=\"-static-libgcc -static-libstdc++ -static\"" } - - { name: linux-x64, os: ubuntu-20.04, flags: "--arch=x86_64 --extra-ldflags=\"-static-libgcc -static-libstdc++\"" } - - { name: osx-x64, os: macos-latest, flags: "--arch=x86_64 --install-name-dir=\"@rpath\" --enable-cross-compile --cc=\"clang -arch x86_64\" --disable-xlib" } - - { name: osx-arm64, os: macos-latest, flags: "--arch=arm64 --install-name-dir=\"@rpath\" --enable-neon --enable-cross-compile --cc=\"clang -arch arm64\" --disable-xlib" } + - { name: win-x64, os: ubuntu-20.04, arch: x86_64, target_os: win } + - { name: linux-x64, os: ubuntu-20.04, arch: x86_64, target_os: linux } + - { name: linux-arm64, os: ubuntu-20.04, arch: arm64, target_os: linux } + - { name: osx-x64, os: macos-latest, arch: x86_64, target_os: macos } + - { name: osx-arm64, os: macos-latest, arch: arm64, target_os: macos } steps: - - name: Setup Linux common dependencies + - name: Setup qemu static + uses: docker/setup-qemu-action@v3 if: runner.os == 'Linux' - run: | - sudo apt-get install yasm \ - make \ - automake \ - autoconf \ - git \ - pkg-config \ - libtool-bin \ - nasm - - name: Setup MinGW64 dependencies - if: ${{ matrix.platform.name == 'win-x64' }} - run: | - sudo apt-get install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 - - name: Setup nasm for osx-x64 dependencies - if: ${{ matrix.platform.name == 'osx-x64' }} - run: | - brew install nasm - - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: repository: FFmpeg/FFmpeg - ref: ${{ github.event.inputs.rev }} - - name: Configure FFmpeg build - run: | - ./configure --disable-everything \ - --disable-static \ - --disable-doc \ - --disable-programs \ - --disable-swscale \ - --disable-avformat \ - --disable-swresample \ - --disable-avdevice \ - --disable-avfilter \ - --disable-debug \ - --enable-avcodec \ - --enable-shared \ - --enable-decoder=${{ env.DECODERS }} \ - --enable-lto \ - --enable-stripping \ - ${{ matrix.platform.flags }} \ - --prefix=release_output - - name: "Build FFmpeg" - run: | - make -j4 && make install - - name: Upload artifact + ref: ${{ github.event.inputs.rev }} + - uses: actions/checkout@v4 + with: + path: 'nvdec_deps' + - name: Build and prepare release + run: nvdec_deps/ci/run.sh $PWD $PWD/nvdec_deps/native/${{ matrix.platform.name }} ${{ matrix.platform.arch }} ${{ matrix.platform.target_os }} + shell: bash + - name: Upload artifacts uses: actions/upload-artifact@v3 with: name: ${{ matrix.platform.name }}-binaries - path: | - release_output/* + path: install_output + - name: Create pull request + uses: peter-evans/create-pull-request@v4 + with: + commit-message: Update ${{ matrix.platform.name }} binaries + title: Update ${{ matrix.platform.name }} binaries + body: This PR has been auto-generated to update the ${{ matrix.platform.name }} binaries. + branch: update-${{ matrix.platform.name }}-binaries + path: 'nvdec_deps' + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' diff --git a/Ryujinx.Graphics.Nvdec.Dependencies.nuspec b/Ryujinx.Graphics.Nvdec.Dependencies.nuspec index 91d6e45..b24e79b 100644 --- a/Ryujinx.Graphics.Nvdec.Dependencies.nuspec +++ b/Ryujinx.Graphics.Nvdec.Dependencies.nuspec @@ -11,6 +11,7 @@ + diff --git a/ci/compile.sh b/ci/compile.sh new file mode 100755 index 0000000..f5b4baa --- /dev/null +++ b/ci/compile.sh @@ -0,0 +1,108 @@ +#!/bin/bash + +set -e + +DECODERS="h264,vp8" +LIBAVCODEC_VERSION=59 +LIBAVUTIL_VERSION=57 + +if [ "$#" -le 3 ]; then + echo "usage: " + exit 1 +fi + +export DEBIAN_FRONTEND=noninteractive + +uname_system="$(uname -s)" + +case "${uname_system}" in + Linux*) system_name=linux;; + Darwin*) system_name=macos;; + CYGWIN*) system_name=win;; + MINGW*) system_name=win;; + *) system_name="Unknown OS: ${uname_system}" +esac + +src_dir=$1 +output_path=$2 +build_arch=$3 +target_system_name=$4 + +mkdir -p $output_path + +if command -v sudo &> /dev/null +then + SUDO=sudo +fi + +if [[ $system_name == "linux" ]]; then + $SUDO apt-get update -y + $SUDO apt-get install -y \ + yasm \ + build-essential \ + clang \ + llvm \ + make \ + automake \ + autoconf \ + pkg-config \ + libtool-bin \ + nasm +fi + +if [[ $target_system_name == "linux" ]]; then + export LDFLAGS="-static-libgcc -static-libstdc++" + extra_configure_flags="--enable-cross-compile" +elif [[ $target_system_name == "macos" ]]; then + brew install nasm + + export MACOSX_DEPLOYMENT_TARGET="11.0" + export cc="clang -arch $build_arch" + extra_configure_flags="--install-name-dir=\"@rpath\" --enable-cross-compile --disable-xlib" +elif [[ $target_system_name == "win" ]] && [[ $build_arch == "x86_64" ]]; then + $SUDO apt-get install -y gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 + + export LDFLAGS="-static-libgcc -static-libstdc++ -static" + extra_configure_flags="--target-os=mingw32 --cross-prefix=x86_64-w64-mingw32- --disable-w32threads" +fi + +if [[ $build_arch == "arm64" ]]; then + extra_configure_flags="$extra_configure_flags --enable-neon" +fi + +pushd $src_dir +./configure --arch=$build_arch \ + --disable-everything \ + --disable-static \ + --disable-doc \ + --disable-programs \ + --disable-swscale \ + --disable-avformat \ + --disable-swresample \ + --disable-avdevice \ + --disable-avfilter \ + --disable-debug \ + --enable-avcodec \ + --enable-shared \ + --enable-decoder="$DECODERS" \ + --enable-lto \ + --enable-stripping \ + $extra_configure_flags \ + --prefix="install_output" + +make -j$(nproc) && make install + +mkdir -p $output_path +rm -f $output_path/* + +if [[ $target_system_name == "linux" ]]; then + cp -L install_output/lib/libavcodec.so.$LIBAVCODEC_VERSION $output_path + cp -L install_output/lib/libavutil.so.$LIBAVUTIL_VERSION $output_path +elif [[ $target_system_name == "macos" ]]; then + cp -L install_output/lib/libavcodec.$LIBAVCODEC_VERSION.dylib $output_path + cp -L install_output/lib/libavutil.$LIBAVUTIL_VERSION.dylib $output_path +elif [[ $target_system_name == "win" ]]; then + cp -L install_output/bin/avcodec-$LIBAVCODEC_VERSION.dll $output_path + cp -L install_output/bin/avutil-$LIBAVUTIL_VERSION.dll $output_path +fi +popd \ No newline at end of file diff --git a/ci/run.sh b/ci/run.sh new file mode 100755 index 0000000..fa437de --- /dev/null +++ b/ci/run.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +set -e + +if [ "$#" -le 3 ]; then + echo "usage: " + exit 1 +fi + +uname_system="$(uname -s)" + +case "${uname_system}" in + Linux*) system_name=linux;; + Darwin*) system_name=macos;; + CYGWIN*) system_name=win;; + MINGW*) system_name=win;; + *) system_name="Unknown OS: ${uname_system}" +esac + +src_dir=$1 +output_path=$2 +build_arch=$3 +target_system_name=$4 + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +mkdir -p $output_path + +if command -v podman &> /dev/null; then + DOCKER=podman +elif command -v docker &> /dev/null; then + DOCKER=docker +fi + +if [ $target_system_name == "linux" ] && [ $build_arch == "arm64" ]; then + $DOCKER run --rm -v $SCRIPT_DIR:/scripts -v $output_path:/output -v $src_dir:/source -t arm64v8/ubuntu:focal bash /scripts/compile.sh /source /output $build_arch "$target_system_name" +else + $SCRIPT_DIR/compile.sh "$src_dir" "$output_path" "$build_arch" "$target_system_name" +fi