diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 18d7e89cc13..a76d2aa832c 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -52,6 +52,88 @@ jobs: echo Within 'CMakeLists.txt' change "project(Sunshine [VERSION $cmakelists_version]" to "project(Sunshine [VERSION ${{ needs.check_changelog.outputs.next_version_bare }}]" exit 1 + build_linux_flatpak: + name: Linux Flatpak + runs-on: ubuntu-18.04 + needs: check_changelog + + steps: + - name: Test + run: | + ls -al . + groups + cat /etc/passwd + + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 2048 + swap-size-mb: 8192 + remove-dotnet: 'true' + remove-android: 'true' + remove-haskell: 'true' + + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Dependencies Linux Flatpak + run: | + sudo add-apt-repository ppa:flatpak/stable -y + sudo apt-get update -y + sudo apt-get install -y \ + cmake \ + flatpak \ + flatpak-builder + sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo + sudo flatpak install flathub org.freedesktop.Platform//21.08 org.freedesktop.Sdk//21.08 -y + + - name: Configure Flatpak Manifest + run: | + # variables for manifest + owner=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]' ) + repo=$(echo ${GITHUB_REPOSITORY#*/} | tr '[:upper:]' '[:lower:]' ) + branch=${GITHUB_HEAD_REF} + + # check the branch variable + if [ -z "$branch" ] + then + echo "This is a PUSH event" + branch=${GITHUB_BASE_REF} + else + echo "This is a PR event" + fi + echo "Owner: ${owner}" + echo "Repo: ${repo}" + echo "Branch: ${branch}" + + mkdir -p build + mkdir -p artifacts + + cd build + cmake -DGITHUB_OWNER=${owner} -DGITHUB_REPO=${repo} -DGITHUB_BRANCH=${branch} -DSUNSHINE_CONFIGURE_FLATPAK=ON -DSUNSHINE_CONFIGURE_ONLY=ON .. + + - name: Build Linux Flatpak + working-directory: build + run: | + sudo flatpak-builder build-dir com.github.sunshinestream.sunshine.yml + sudo flatpak-builder --repo=repo --force-clean build-dir com.github.sunshinestream.sunshine.yml + sudo flatpak build-bundle ~/repo ./artifacts/sunshine.flatpak com.github.sunshinestream.sunshine + + - name: Upload Artifacts + uses: actions/upload-artifact@v3 + with: + name: sunshine-linux-${{ matrix.type }} + path: artifacts/ + + - name: Create Release + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + uses: SunshineStream/actions/create_release@master + with: + token: ${{ secrets.GITHUB_TOKEN }} + next_version: ${{ needs.check_changelog.outputs.next_version }} + last_version: ${{ needs.check_changelog.outputs.last_version }} + release_body: ${{ needs.check_changelog.outputs.release_body }} + build_linux: name: Linux runs-on: ubuntu-20.04 @@ -64,16 +146,19 @@ jobs: CMAKE_INSTALL_PREFIX: '' SUNSHINE_ASSETS_DIR: '/usr/local/sunshine/assets' SUNSHINE_CONFIG_DIR: '/usr/local/sunshine/config' + EXTRA_ARGS: '' - type: appimage CMAKE_INSTALL_PREFIX: '/usr' SUNSHINE_ASSETS_DIR: 'sunshine.AppImage.config' SUNSHINE_CONFIG_DIR: 'sunshine.AppImage.home' + EXTRA_ARGS: '-DSUNSHINE_CONFIGURE_APPIMAGE=ON' steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive + - name: Setup Dependencies Linux run: | sudo add-apt-repository ppa:savoury1/ffmpeg4 -y @@ -144,7 +229,7 @@ jobs: mkdir -p artifacts cd build - cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${{ matrix.CMAKE_INSTALL_PREFIX }} -DSUNSHINE_ASSETS_DIR=${{ matrix.SUNSHINE_ASSETS_DIR }} -DSUNSHINE_CONFIG_DIR=${{ matrix.SUNSHINE_CONFIG_DIR }} -DSUNSHINE_EXECUTABLE_PATH=/usr/bin/sunshine -DSUNSHINE_ENABLE_WAYLAND=ON -DSUNSHINE_ENABLE_X11=ON -DSUNSHINE_ENABLE_DRM=ON -DSUNSHINE_ENABLE_CUDA=ON .. + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${{ matrix.CMAKE_INSTALL_PREFIX }} -DSUNSHINE_ASSETS_DIR=${{ matrix.SUNSHINE_ASSETS_DIR }} -DSUNSHINE_CONFIG_DIR=${{ matrix.SUNSHINE_CONFIG_DIR }} -DSUNSHINE_EXECUTABLE_PATH=/usr/bin/sunshine -DSUNSHINE_ENABLE_WAYLAND=ON -DSUNSHINE_ENABLE_X11=ON -DSUNSHINE_ENABLE_DRM=ON -DSUNSHINE_ENABLE_CUDA=ON ${{ matrix.EXTRA_ARGS }} .. make -j ${nproc} - name: Package Linux - CPACK @@ -291,7 +376,7 @@ jobs: mkdir build cd build - cmake -DCMAKE_BUILD_TYPE=Release -DSUNSHINE_ASSETS_DIR=/usr/local/sunshine/assets -DSUNSHINE_CONFIG_DIR=/usr/local/sunshine/config -DGITHUB_OWNER=${owner} -DGITHUB_REPO=${repo} -DGITHUB_BRANCH=${branch} .. + cmake -DCMAKE_BUILD_TYPE=Release -DSUNSHINE_ASSETS_DIR=/usr/local/sunshine/assets -DSUNSHINE_CONFIG_DIR=/usr/local/sunshine/config -DGITHUB_OWNER=${owner} -DGITHUB_REPO=${repo} -DGITHUB_BRANCH=${branch} -DSUNSHINE_CONFIGURE_PORTFILE=ON .. make -j ${nproc} - name: Package MacOS diff --git a/CMakeLists.txt b/CMakeLists.txt index 44f24e7d6b2..72386de6f16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,19 @@ project(Sunshine VERSION 0.14.0 HOMEPAGE_URL "https://sunshinestream.github.io" ) +if(${SUNSHINE_CONFIGURE_APPIMAGE}) + configure_file(packaging/linux/sunshine.desktop sunshine.desktop @ONLY) +elseif(${SUNSHINE_CONFIGURE_FLATPAK}) + configure_file(packaging/linux/flatpak/com.github.sunshinestream.sunshine.yml com.github.sunshinestream.sunshine.yml @ONLY) +elseif(${SUNSHINE_CONFIGURE_PORTFILE}) + configure_file(packaging/macos/Portfile Portfile @ONLY) +endif() + +# return if configure only is set +if(${SUNSHINE_CONFIGURE_ONLY}) + return() +endif() + set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) set(SUNSHINE_SOURCE_ASSETS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src_assets") @@ -562,9 +575,6 @@ if(APPLE) # TODO: test set(CPACK_BUNDLE_PLIST "${APPLE_PLIST_FILE}") set(CPACK_BUNDLE_ICON "${PROJECT_SOURCE_DIR}/sunshine.icns") # set(CPACK_BUNDLE_STARTUP_COMMAND "${INSTALL_RUNTIME_DIR}/sunshine") - - # Portfile - configure_file(Portfile.in Portfile @ONLY) endif() if(UNIX AND NOT APPLE) install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/assets/" DESTINATION "${SUNSHINE_ASSETS_DIR}") @@ -587,9 +597,6 @@ if(UNIX AND NOT APPLE) set(CPACK_DEBIAN_PACKAGE_DEPENDS "openssl, libavdevice58, libboost-thread1.67.0 | libboost-thread1.71.0 | libboost-thread1.74.0, libboost-filesystem1.67.0 | libboost-filesystem1.71.0 | libboost-filesystem1.74.0, libboost-log1.67.0 | libboost-log1.71.0 | libboost-log1.74.0, libpulse0, libopus0, libxcb-shm0, libxcb-xfixes0, libxtst6, libevdev2, libdrm2, libcap2") set(CPACK_RPM_PACKAGE_REQUIRES "openssl >= 1.1, libavdevice >= 4.3, boost-thread >= 1.67.0, boost-filesystem >= 1.67.0, boost-log >= 1.67.0, pulseaudio-libs >= 10.0, libopusenc >= 0.2.1, libxcb >= 1.13, libXtst >= 1.2.3, libevdev >= 1.5.6, libdrm >= 2.4.97, libcap >= 2.22") set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF) # This should automatically figure out dependencies, doesn't work with the current config - - # AppImage desktop file - configure_file(sunshine.desktop.in sunshine.desktop @ONLY) endif() include(CPack) diff --git a/packaging/linux/flatpak/com.github.sunshinestream.sunshine.yml b/packaging/linux/flatpak/com.github.sunshinestream.sunshine.yml new file mode 100644 index 00000000000..da50ed3fd20 --- /dev/null +++ b/packaging/linux/flatpak/com.github.sunshinestream.sunshine.yml @@ -0,0 +1,212 @@ +app-id: com.github.sunshinestream.sunshine +runtime: org.freedesktop.Platform +runtime-version: "21.08" +sdk: org.freedesktop.Sdk +command: sunshine +separate-locales: false +finish-args: + - --share=ipc + - --socket=x11 + - --socket=wayland + - --socket=pulseaudio + - --share=network + - --device=all + - --persist=. + - --system-talk-name=org.freedesktop.Avahi + - --env=PULSE_PROP_media.category=Manager + +cleanup: + - /include + - /lib/cmake + - /lib/pkgconfig + - /lib/*.la + - /lib/*.a + - /share + +modules: +# - name: cuda +# buildsystem: simple +# only-arches: +# - x86_64 +# - aarch64 +# cleanup: +# - '*' +# build-commands: +# - chmod u+x ./cuda.run +# - ./cuda.run --silent --toolkit --toolkitpath=/app --no-opengl-libs --no-man-page --no-drm +# - rm ./cuda.run +# - rm -r /app/nsight-systems-2021.3.2 +# sources: +# - type: file +# only-arches: +# - x86_64 +# url: https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda_11.4.2_470.57.02_linux.run +# sha256: bbd87ca0e913f837454a796367473513cddef555082e4d86ed9a38659cc81f0a +# dest-filename: cuda.run +# - type: file +# only-arches: +# - aarch64 +# url: https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda_11.4.2_470.57.02_linux_sbsa.run +# sha256: f2c4a52e06329606c8dfb7c5ea3f4cb4c0b28f9d3fdffeeb734fcc98daf580d8 +# dest-filename: cuda.run + + - name: boost + buildsystem: simple + build-commands: + - ./bootstrap.sh --prefix=/app --with-libraries=system,thread,log + - ./b2 install variant=release link=static,shared runtime-link=shared cxxflags="$CXXFLAGS" linkflags="$LDFLAGS" -j $FLATPAK_BUILDER_N_JOBS + sources: + - type: archive + url: https://boostorg.jfrog.io/artifactory/main/release/1.79.0/source/boost_1_79_0.tar.bz2 + sha256: 475d589d51a7f8b3ba2ba4eda022b170e562ca3b760ee922c146b6c65856ef39 + + - name: ffmpeg + config-opts: + - --enable-gpl + - --disable-static + - --enable-shared + - --disable-doc + - --disable-programs + - --disable-decoders + - --enable-libfontconfig + - --enable-libfreetype + - --enable-libopus + - --enable-libvorbis + - --enable-libvpx + - --enable-libx264 + - --enable-libx265 + - --enable-nvenc + - --enable-encoder=h264_v4l2m2m + - --enable-encoder=hevc_v4l2m2m + # - --enable-nonfree + # - --enable-cuda-nvcc + # - --enable-libnpp + # - --extra-cflags=-I/app/include + # - --extra-ldflags=-L/app/lib64 + cleanup: + - /share/ffmpeg/examples + sources: + - type: archive + url: https://ffmpeg.org/releases/ffmpeg-4.4.2.tar.xz + sha256: af419a7f88adbc56c758ab19b4c708afbcae15ef09606b82b855291f6a6faa93 + modules: + - name: vmaf + buildsystem: meson + subdir: libvmaf + cleanup: + - /bin + sources: + - type: archive + url: https://github.com/Netflix/vmaf/archive/refs/tags/v2.3.1.tar.gz + sha256: 8d60b1ddab043ada25ff11ced821da6e0c37fd7730dd81c24f1fc12be7293ef2 + - name: x264 + config-opts: + - --disable-cli + - --enable-shared + sources: + - type: archive + url: https://code.videolan.org/videolan/x264/-/archive/stable/x264-stable.tar.bz2 + sha256: 8fedb184045722d8cc39353099373a5b7350171d0964d01fff8eced21b959b29 + - name: x265 + buildsystem: cmake-ninja + builddir: true + subdir: source + config-opts: + - -DCMAKE_BUILD_TYPE=RelWithDebInfo + - -DENABLE_CLI=OFF + sources: + - type: archive + url: https://bitbucket.org/multicoreware/x265_git/downloads/x265_3.5.tar.gz + sha256: e70a3335cacacbba0b3a20ec6fecd6783932288ebc8163ad74bcc9606477cae8 + - name: nv-codec-headers + no-autogen: true + make-install-args: + - PREFIX=/app + cleanup: + - '*' + sources: + - type: archive + url: https://github.com/FFmpeg/nv-codec-headers/archive/refs/tags/n11.1.5.1.tar.gz + sha256: d095fbd56aa93772471a323be0ebe65504a0f43f06c76a30b6d25da77b06ae9c + + - name: avahi + cleanup: + - /bin + - /lib/avahi + - /share/applications/*.desktop + - /share/avahi + config-opts: + - --with-distro=none + - --disable-gobject + - --disable-introspection + - --disable-qt3 + - --disable-qt4 + - --disable-qt5 + - --disable-gtk + - --disable-core-docs + - --disable-manpages + - --disable-libdaemon + - --disable-python + - --disable-pygobject + - --disable-mono + - --disable-monodoc + - --disable-autoipd + - --disable-doxygen-doc + - --disable-doxygen-dot + - --disable-doxygen-xml + - --disable-doxygen-html + - --disable-manpages + - --disable-xmltoman + sources: + - type: archive + url: https://avahi.org/download/avahi-0.8.tar.gz + sha256: 060309d7a333d38d951bc27598c677af1796934dbd98e1024e7ad8de798fedda + modules: + - name: libevent + cleanup: + - /bin + sources: + - type: archive + url: https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz + sha256: 92e6de1be9ec176428fd2367677e61ceffc2ee1cb119035037a27d346b0403bb + + - name: libevdev + buildsystem: meson + cleanup: + - /bin + sources: + - type: archive + url: https://www.freedesktop.org/software/libevdev/libevdev-1.12.1.tar.xz + sha256: 1dbba41bc516d3ca7abc0da5b862efe3ea8a7018fa6e9b97ce9d39401b22426c + modules: + - name: libcheck + buildsystem: cmake + cleanup: + - /bin + sources: + - type: archive + url: https://github.com/libcheck/check/archive/refs/tags/0.15.2.tar.gz + sha256: 998d355294bb94072f40584272cf4424571c396c631620ce463f6ea97aa67d2e + + - name: sunshine + buildsystem: cmake + no-make-install: true + build-options: + cxxflags: -I/app/include/libevdev-1.0 + config-opts: + - -DCMAKE_BUILD_TYPE=Release + - -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/app/bin + - -DCMAKE_INSTALL_PREFIX='' + - -DSUNSHINE_CONFIG_DIR=/app/config + - -DSUNSHINE_ASSETS_DIR=/app/assets + - -DSUNSHINE_EXECUTABLE_PATH=/app/bin/sunshine + - -DSUNSHINE_ENABLE_WAYLAND=ON + - -DSUNSHINE_ENABLE_X11=ON + - -DSUNSHINE_ENABLE_DRM=ON + - -DSUNSHINE_ENABLE_CUDA=ON + post-install: + cp -f ./src_assets/linux/misc/85-sunshine-rules.rules /etc/udev/rules.d/ + sources: + - type: git + url: https://github.com/@GITHUB_OWNER@/@GITHUB_REPO@.git + branch: @GITHUB_BRANCH@ diff --git a/sunshine.desktop.in b/packaging/linux/sunshine.desktop similarity index 100% rename from sunshine.desktop.in rename to packaging/linux/sunshine.desktop diff --git a/Portfile.in b/packaging/macos/Portfile similarity index 100% rename from Portfile.in rename to packaging/macos/Portfile