name: C/C++ CI env: FEATURES: '--enable-option-checking=fatal --with-live555=/usr/local --enable-aja --enable-blank --enable-cineform --enable-decklink --enable-file --enable-gl --enable-gl-display --enable-holepunch --enable-jack --enable-jack-transport --enable-libavcodec --enable-natpmp --enable-ndi --enable-openssl --enable-pcp --enable-portaudio --enable-qt --enable-resize --enable-rtdxt --enable-rtsp --enable-rtsp-server --enable-scale --enable-sdl2 --enable-sdp-http --enable-speexdsp --enable-swmix --enable-libswscale --enable-testcard-extras=all --enable-text --enable-video-mixer --enable-ximea --enable-zfec' CUDA_FEATURES: '--enable-cuda_dxt --enable-gpujpeg --enable-ldgm-gpu --enable-uyvy' on: pull_request: push: branches: - master tags: - v[0-9]+.* paths: - '.github/scripts/**' - '.github/workflows/ccpp.yml' - '**.c' - '**.cpp' - '**.cu' - '**.h' - '**.hpp' - '**.m' - '**.mm' - 'autogen.sh' - 'configure.ac' - 'data/scripts/**' - 'Makefile.in' jobs: prepare: runs-on: ubuntu-latest env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, we do not need to create own token. steps: - uses: actions/checkout@v2 id: checkout with: persist-credentials: true - name: Init environment variables run: . .github/scripts/environment.sh - name: Retag continuous if: github.repository == 'CESNET/UltraGrid' && github.ref == 'refs/heads/master' run: | git fetch --prune --unshallow --tags git tag -f $TAG git push -f origin refs/tags/$TAG:refs/tags/$TAG - name: Update Release if: (github.repository == 'CESNET/UltraGrid' && github.ref == 'refs/heads/master') || startsWith(github.ref, 'refs/tags/') run: .github/scripts/create_release.sh - name: Create continuous release # ensure continuous release is present for AppImage zsync if: startsWith(github.ref, 'refs/tags/') run: .github/scripts/create_continuous_release.sh Ubuntu: name: run Ubuntu needs: prepare runs-on: ubuntu-18.04 env: appimage_key: ${{ secrets.appimage_key }} SDK_URL: ${{ secrets.SDK_URL }} steps: - uses: actions/checkout@v1 - name: Fetch SDKs ETags id: etags run: | echo "::set-output name=ndi::$($GITHUB_WORKSPACE/.github/scripts/get-etags.sh https://downloads.ndi.tv/SDK/NDI_SDK_Linux/Install_NDI_SDK_v5_Linux.tar.gz)" - name: Cache NDI id: cache-ndi uses: actions/cache@v2 with: path: /var/tmp/Install_NDI_SDK_Linux.tar.gz key: cache-ndi-${{ runner.os }}-${{ steps.etags.outputs.ndi }} - name: Download NDI if: steps.cache-ndi.outputs.cache-hit != 'true' run: curl -L https://downloads.ndi.tv/SDK/NDI_SDK_Linux/Install_NDI_SDK_v5_Linux.tar.gz -o /var/tmp/Install_NDI_SDK_Linux.tar.gz - name: bootstrap run: | . .github/scripts/environment.sh .github/scripts/Linux/prepare.sh - name: Cache rav1e id: cache-rav1e uses: actions/cache@v2 with: path: rav1e key: cache-rav1e-${{ runner.os }}-${{ hashFiles('.github/scripts/Linux/rav1e.sh') }} - name: Build rav1e if: steps.cache-rav1e.outputs.cache-hit != 'true' run: .github/scripts/Linux/rav1e.sh - name: Install rav1e run: | sudo cp -r rav1e/install/* / sudo ldconfig - name: Cache FFmpeg id: cache-ffmpeg uses: actions/cache@v2 with: path: '/var/tmp/ffmpeg' key: cache-ffmpeg-${{ runner.os }}-${{ hashFiles('.github/scripts/Linux/prepare.sh', '.github/scripts/Linux/download_build_ffmpeg.sh', '.github/scripts/Linux/ffmpeg-patches/*') }} - name: Build FFmpeg if: steps.cache-ffmpeg.outputs.cache-hit != 'true' run: .github/scripts/Linux/download_build_ffmpeg.sh - name: Install Cached FFmpeg if: steps.cache-ffmpeg.outputs.cache-hit == 'true' run: .github/scripts/Linux/install_ffmpeg.sh - name: configure run: "./autogen.sh --enable-plugins ${{ env.CUDA_FEATURES }} ${{ env.FEATURES }} --enable-alsa --enable-v4l2 || { RC=$?; cat config.log; exit $RC; }" - name: make run: make -j4 - name: make check run: make check - name: make distcheck run: make distcheck - name: check libc/libstdc++ ABI run: .github/scripts/Linux/check_abi.sh 2.27 3.4.22 1.3.9 bin/* lib/ultragrid/* - name: Create AppImage run: data/scripts/Linux-AppImage/create-appimage.sh https://github.com/$GITHUB_REPOSITORY/releases/download/continuous/UltraGrid-$CHANNEL-x86_64.AppImage.zsync - name: Check AppImage run: | docker build -f .github/scripts/Linux/utils/Dockerfile.ubuntu -t aitest-ubuntu . curl -LS -O https://raw.githubusercontent.com/AppImage/pkg2appimage/master/appdir-lint.sh -O https://raw.githubusercontent.com/probonopd/AppImages/master/excludelist sudo apt install desktop-file-utils libfile-mimeinfo-perl # desktop-file-validate, mimetype ./UltraGrid-$VERSION-x86_64.AppImage --appimage-extract docker run --rm -v $PWD/squashfs-root/:/AppImage aitest-ubuntu /AppImage/AppRun -v docker run --rm -v $PWD/squashfs-root/:/AppImage aitest-ubuntu /AppImage/AppRun --tool uv-qt -h docker run --rm -v $PWD/squashfs-root/:/AppImage aitest-ubuntu /AppImage/AppRun --list-modules bash appdir-lint.sh squashfs-root - name: Upload Release Asset id: upload-release if: (github.repository == 'CESNET/UltraGrid' && github.ref == 'refs/heads/master') || startsWith(github.ref, 'refs/tags/') env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | sudo apt install jq zsync zsyncmake -C -u https://github.com/$GITHUB_REPOSITORY/releases/download/$TAG/UltraGrid-$VERSION-x86_64.AppImage -o UltraGrid-$CHANNEL-x86_64.AppImage.zsync UltraGrid-$VERSION-x86_64.AppImage .github/scripts/replace-asset.sh continuous UltraGrid-$CHANNEL-x86_64.AppImage.zsync application/x-zsync AppImage%20${CHANNEL}%20zsync .github/scripts/replace-asset.sh $TAG UltraGrid-$VERSION-x86_64.AppImage application/x-appimage Linux%20build - name: Upload Build if: steps.upload-release.conclusion == 'skipped' uses: actions/upload-artifact@v1 with: name: UltraGrid CI Linux build path: UltraGrid-${{ env.VERSION }}-x86_64.AppImage macOS: name: run macOS needs: prepare runs-on: macos-latest env: SDK_NONFREE_PATH: /private/var/tmp/sdks-nonfree altool_credentials: ${{ secrets.altool_credentials }} apple_key_p12_b64: ${{ secrets.apple_key_p12_b64 }} SDK_URL: ${{ secrets.SDK_URL }} steps: - uses: actions/checkout@v1 - name: Fetch SDKs ETags id: etags run: | echo "::set-output name=nonfree::$($GITHUB_WORKSPACE/.github/scripts/get-etags.sh $SDK_URL/ntv2sdkmac.zip $SDK_URL/VideoMaster_SDK_MacOSX.zip)" echo "::set-output name=ndi::$($GITHUB_WORKSPACE/.github/scripts/get-etags.sh https://downloads.ndi.tv/SDK/NDI_SDK_Mac/Install_NDI_SDK_v5_Apple.pkg)" echo "::set-output name=ximea::$($GITHUB_WORKSPACE/.github/scripts/get-etags.sh https://www.ximea.com/downloads/recent/XIMEA_OSX_SP.dmg)" - name: Cache Non-Free SDKs id: cache-macos-nonfree-sdks uses: actions/cache@v2 with: path: ${{ env.SDK_NONFREE_PATH }} key: cache-nonfree-sdks-${{ runner.os }}-${{ hashFiles('.github/scripts/macOS/prepare_nonfree_sdks.sh') }}-${{ steps.etags.outputs.nonfree }} - name: Download Non-Free SDKs if: steps.cache-macos-nonfree-sdks.outputs.cache-hit != 'true' && env.SDK_URL != null run: | rm -rf ${{ env.SDK_NONFREE_PATH }} mkdir -p ${{ env.SDK_NONFREE_PATH }} cd ${{ env.SDK_NONFREE_PATH }} curl -S -f -O $SDK_URL/ntv2sdkmac.zip --next -f -O $SDK_URL/VideoMaster_SDK_MacOSX.zip || true $GITHUB_WORKSPACE/.github/scripts/macOS/prepare_nonfree_sdks.sh - name: Cache XIMEA id: cache-macos-ximea uses: actions/cache@v2 with: path: /var/tmp/XIMEA_OSX_SP.dmg key: cache-ximea-${{ runner.os }}-${{ steps.etags.outputs.ximea }} - name: Download XIMEA if: steps.cache-macos-ximea.outputs.cache-hit != 'true' run: curl -S -L https://www.ximea.com/downloads/recent/XIMEA_OSX_SP.dmg -o /private/var/tmp/XIMEA_OSX_SP.dmg - name: Cache NDI id: cache-ndi uses: actions/cache@v2 with: path: /private/var/tmp/Install_NDI_SDK_Apple.pkg key: cache-ndi-${{ runner.os }}-${{ steps.etags.outputs.ndi }} - name: Download NDI if: steps.cache-ndi.outputs.cache-hit != 'true' run: curl -L https://downloads.ndi.tv/SDK/NDI_SDK_Mac/Install_NDI_SDK_v5_Apple.pkg -o /private/var/tmp/Install_NDI_SDK_Apple.pkg - name: bootstrap run: | . .github/scripts/environment.sh .github/scripts/macOS/prepare.sh - name: configure run: "export ARCH=-msse4.2; ./autogen.sh ${{ env.FEATURES }} --enable-avfoundation --enable-coreaudio --enable-syphon || { RC=$?; cat config.log; exit $RC; }" - name: make bundle run: make -j4 gui-bundle - name: make check run: make check - name: make distcheck run: | for n in lib opt; do sudo mv /usr/local/$n /usr/local/$n-; done # hide local libs sudo mv $(xcrun --show-sdk-path)/System/Library/Frameworks /tmp/FRMWK make distcheck TARGET=gui/QT/uv-qt.app/Contents/MacOS/uv REFLECTOR_TARGET=gui/QT/uv-qt.app/Contents/MacOS/uv GUI_EXE=gui/QT/uv-qt.app/Contents/MacOS/uv-qt for n in lib opt; do sudo mv /usr/local/$n- /usr/local/$n; done # return back sudo mv /tmp/FRMWK $(xcrun --show-sdk-path)/System/Library/Frameworks - name: sign+notarize run: .github/scripts/macOS/sign.sh gui/QT/uv-qt.app - name: make dmg run: | make osx-gui-dmg mv UltraGrid.dmg UltraGrid-$VERSION.dmg - name: Upload Release Asset id: upload-release if: (github.repository == 'CESNET/UltraGrid' && github.ref == 'refs/heads/master') || startsWith(github.ref, 'refs/tags/') env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | brew install jq .github/scripts/replace-asset.sh $TAG UltraGrid-$VERSION.dmg application/x-apple-diskimage macOS%20build - name: Upload Build if: steps.upload-release.conclusion == 'skipped' uses: actions/upload-artifact@v1 with: name: UltraGrid CI macOS build path: UltraGrid-${{ env.VERSION }}.dmg Windows: name: run Windows needs: prepare runs-on: windows-latest env: MSYS2_PATH_TYPE: inherit SDK_URL: ${{ secrets.SDK_URL }} steps: - uses: actions/checkout@v1 - name: Fetch SDKs ETags id: etags run: | echo "::set-output name=ndi::$($GITHUB_WORKSPACE/.github/scripts/get-etags.sh https://downloads.ndi.tv/SDK/NDI_SDK/NDI%205%20SDK.exe)" echo "::set-output name=ximea::$($GITHUB_WORKSPACE/.github/scripts/get-etags.sh https://www.ximea.com/support/attachments/download/37/XIMEA_API_Installer.exe)" shell: bash - name: Set environment run: .github/scripts/environment.sh shell: bash - name: Find MSVC run: .github/scripts/Windows/find_msvc.ps1 - name: Cache NDI id: cache-ndi uses: actions/cache@v2 with: path: 'C:\ndi.exe' key: cache-ndi-${{ runner.os }}-${{ steps.etags.outputs.ndi }} - name: Download NDI if: steps.cache-ndi.outputs.cache-hit != 'true' run: Invoke-WebRequest https://downloads.ndi.tv/SDK/NDI_SDK/NDI%205%20SDK.exe -OutFile C:\ndi.exe - name: Cache XIMEA id: cache-macos-ximea uses: actions/cache@v2 with: path: 'C:\XIMEA_API_Installer.exe' key: cache-ximea-${{ runner.os }}-${{ steps.etags.outputs.ximea }} - name: Download XIMEA if: steps.cache-macos-ximea.outputs.cache-hit != 'true' run: Invoke-WebRequest https://www.ximea.com/support/attachments/download/37/XIMEA_API_Installer.exe -OutFile C:\XIMEA_API_Installer.exe - name: bootsrap run: .github/scripts/Windows/prepare.ps1 - name: Cache JACK id: cache-jack uses: actions/cache@v2 with: path: 'C:\Program Files\JACK2' key: cache-jack-${{ runner.os }}-${{ hashFiles('.github/scripts/Windows/install_jack.ps1') }} - name: Install JACK if: steps.cache-jack.outputs.cache-hit != 'true' run: .github/scripts/Windows/install_jack.ps1 - name: bootsrap MSYS2 run: C:\msys64\usr\bin\bash -cel '$GITHUB_WORKSPACE/.github/scripts/Windows/prepare_msys.sh' - name: Cache live555 id: cache-live555 uses: actions/cache@v2 with: path: 'C:\live555' key: cache-live555-${{ runner.os }}-${{ hashFiles('.github/scripts/Windows/build_live555.sh') }} - name: Build live555 if: steps.cache-live555.outputs.cache-hit != 'true' run: C:\msys64\usr\bin\bash -cel '$GITHUB_WORKSPACE/.github/scripts/Windows/build_live555.sh' - name: Install live555 run: C:\msys64\usr\bin\bash -cel 'make -C /c/live555 install' - name: configure run: C:\msys64\usr\bin\bash -cel './autogen.sh --prefix=/ --bindir=/ --docdir=/doc ${{ env.FEATURES }} ${{ env.CUDA_FEATURES }} --enable-dshow --enable-spout --enable-wasapi || { RC=$?; cat config.log; exit $RC; }' - name: make run: C:\msys64\usr\bin\bash -cel "make -j4" - name: make check run: C:\msys64\usr\bin\bash -cel "make check" - name: add DLL depends run: | C:\msys64\usr\bin\bash -cel ' cp gui/QT/uv-qt.exe bin rm bin/run_tests.exe export DESTDIR=build/UltraGrid-$VERSION-win64 make install IFS=\"|\"; for exe in $DESTDIR/*exe; do for n in `data/scripts/get_dll_depends.sh \"$exe\" | tr \"\n\" \"|\"`; do cp \"$n\" $DESTDIR; done; done if $(command -v windeployqt-qt6 >/dev/null); then windeployqt-qt6 $DESTDIR/uv-qt.exe; else windeployqt $DESTDIR/uv-qt.exe; fi cp data/update.ps1 $DESTDIR' - name: make dist-check run: C:\msys64\usr\bin\bash -cel 'PATH= /usr/bin/make distcheck TARGET=build/UltraGrid-$VERSION-win64/uv.exe REFLECTOR_TARGET=build/UltraGrid-$VERSION-win64/hd-rum-transcode.exe GUI_EXE=build/UltraGrid-$VERSION-win64/uv-qt.exe' - name: Upload Release Asset id: upload-release if: (github.repository == 'CESNET/UltraGrid' && github.ref == 'refs/heads/master') || startsWith(github.ref, 'refs/tags/') env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | C:\msys64\usr\bin\bash -cel 'cd build; zip -9 -r UltraGrid-$VERSION-win64.zip UltraGrid-$VERSION-win64 $GITHUB_WORKSPACE/.github/scripts/replace-asset.sh $TAG UltraGrid-$VERSION-win64.zip application/zip Windows%20build' - name: Upload Build if: steps.upload-release.conclusion == 'skipped' uses: actions/upload-artifact@v1 with: name: UltraGrid CI Windows build path: build # vi: set expandtab sw=2: