From c4977b5393e6a266467bb9261b7866f6384cd798 Mon Sep 17 00:00:00 2001 From: ABeltramo Date: Sat, 23 Apr 2022 10:48:05 +0100 Subject: [PATCH 01/12] WIP: Moving to cpack in order to unify installers across all platforms --- CMakeLists.txt | 62 ++++++++++++- assets/linux-deb/conffiles | 2 + assets/linux-deb/postinst | 41 +++++++++ assets/linux-deb/preinst | 9 ++ gen-deb.in | 123 ------------------------- gen-rpm.in | 179 ------------------------------------- 6 files changed, 112 insertions(+), 304 deletions(-) create mode 100644 assets/linux-deb/conffiles create mode 100644 assets/linux-deb/postinst create mode 100644 assets/linux-deb/preinst delete mode 100755 gen-deb.in delete mode 100755 gen-rpm.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 862e4f1ae3b..291a6f2eb35 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -312,8 +312,6 @@ else() if(NOT DEFINED SUNSHINE_EXECUTABLE_PATH) set(SUNSHINE_EXECUTABLE_PATH "sunshine") endif() - configure_file(gen-deb.in gen-deb @ONLY) - configure_file(gen-rpm.in gen-rpm @ONLY) configure_file(sunshine.desktop.in sunshine.desktop @ONLY) configure_file(sunshine.service.in sunshine.service @ONLY) endif() @@ -448,3 +446,63 @@ foreach(flag IN LISTS SUNSHINE_COMPILE_OPTIONS) endforeach() target_compile_options(sunshine PRIVATE $<$:${SUNSHINE_COMPILE_OPTIONS}>;$<$:${SUNSHINE_COMPILE_OPTIONS_CUDA};-std=c++17>) + +############# +# CPACK +#### + +# Add all assets dependencies +install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/web" DESTINATION ".") +install(FILES "${SUNSHINE_ASSETS_DIR}/sunshine.conf" DESTINATION ".") +if(WIN32) # TODO: test + install(TARGETS sunshine RUNTIME DESTINATION ".") + + install(FILES "${SUNSHINE_ASSETS_DIR}/apps_windows.json" DESTINATION ".") + install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/shaders/directx" DESTINATION "shaders") +endif() +if(APPLE) # TODO: test + install(TARGETS sunshine RUNTIME DESTINATION ".") + + install(FILES "${SUNSHINE_ASSETS_DIR}/apps_mac.json" DESTINATION ".") + # TODO: info.plist ?? +endif() +if(UNIX AND NOT APPLE) + install(FILES "${SUNSHINE_ASSETS_DIR}/apps_linux.json" DESTINATION ".") + install(FILES "${SUNSHINE_ASSETS_DIR}/85-sunshine-rules.rules" DESTINATION "/etc/udev/rules.d") + install(TARGETS sunshine RUNTIME DESTINATION "/usr/bin") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine.service" DESTINATION "/usr/lib/systemd/user") + install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/shaders/opengl" DESTINATION "shaders") + + # Pre and post install + set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA + "${SUNSHINE_ASSETS_DIR}/linux-deb/preinst;${SUNSHINE_ASSETS_DIR}/linux-deb/postinst;${SUNSHINE_ASSETS_DIR}/linux-deb/conffiles") + set(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE "${SUNSHINE_ASSETS_DIR}/linux-deb/preinst") + set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${SUNSHINE_ASSETS_DIR}/linux-deb/postinst") +endif() + +# Common options +set(CPACK_PACKAGE_NAME "SunshineStream") +set(CPACK_PACKAGE_VENDOR "CMake.org") +set(CPACK_PACKAGE_CONTACT "https://github.com/SunshineStream/Sunshine") +set(CPACK_DEBIAN_PACKAGE_MAINTAINER "https://github.com/SunshineStream/Sunshine") +set(CPACK_PACKAGE_DESCRIPTION "Gamestream host for Moonlight") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/SunshineStream/Sunshine") +set(CPACK_RESOURCE_FILE_LICENSE ${PROJECT_SOURCE_DIR}/LICENSE) +set(CPACK_PACKAGE_ICON ${PROJECT_SOURCE_DIR}/sunshine.png) +set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}") +set(CPACK_STRIP_FILES YES) + +# Installation destination dir +if(NOT WIN32) + set(CPACK_SET_DESTDIR true) +endif() +if(UNIX AND NOT APPLE) + set(CMAKE_INSTALL_PREFIX "/etc/sunshine") +endif() + +## DEB +set(CPACK_DEB_COMPONENT_INSTALL ON) +set(CPACK_DEBIAN_PACKAGE_DEPENDS "libssl1.1, 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_DEBIAN_PACKAGE_SHLIBDEPS OFF) + +include(CPack) \ No newline at end of file diff --git a/assets/linux-deb/conffiles b/assets/linux-deb/conffiles new file mode 100644 index 00000000000..78176a81021 --- /dev/null +++ b/assets/linux-deb/conffiles @@ -0,0 +1,2 @@ +/etc/sunshine/sunshine.conf +/etc/sunshine/apps_linux.json diff --git a/assets/linux-deb/postinst b/assets/linux-deb/postinst new file mode 100644 index 00000000000..cf66231fd26 --- /dev/null +++ b/assets/linux-deb/postinst @@ -0,0 +1,41 @@ +#!/bin/sh + +export GROUP_INPUT=input + +if [ -f /etc/group ]; then + if ! grep -q $GROUP_INPUT /etc/group; then + echo "Creating group $GROUP_INPUT" + + groupadd $GROUP_INPUT + fi +else + echo "Warning: /etc/group not found" +fi + +if [ -f /etc/sunshine/sunshine.conf.old ]; then + echo "Restoring old sunshine.conf" + mv /etc/sunshine/sunshine.conf.old /etc/sunshine/sunshine.conf +fi + +if [ -f /etc/sunshine/apps_linux.json.old ]; then + echo "Restoring old apps_linux.json" + mv /etc/sunshine/apps_linux.json.old /etc/sunshine/apps_linux.json +fi + +# Update permissions on config files for Web Manager +if [ -f /etc/sunshine/apps_linux.json ]; then + echo "chmod 666 /etc/sunshine/apps_linux.json" + chmod 666 /etc/sunshine/apps_linux.json +fi + +if [ -f /etc/sunshine/sunshine.conf ]; then + echo "chmod 666 /etc/sunshine/sunshine.conf" + chmod 666 /etc/sunshine/sunshine.conf +fi + +# Ensure Sunshine can grab images from KMS +path_to_setcap=$(which setcap) +if [ -x "$path_to_setcap" ] ; then + echo "$path_to_setcap cap_sys_admin+p /usr/bin/sunshine" + $path_to_setcap cap_sys_admin+p $(readlink -f /usr/bin/sunshine) +fi diff --git a/assets/linux-deb/preinst b/assets/linux-deb/preinst new file mode 100644 index 00000000000..515d1a34ca5 --- /dev/null +++ b/assets/linux-deb/preinst @@ -0,0 +1,9 @@ +#!/bin/sh +#Store backup for old config files to prevent it from being overwritten +if [ -f /etc/sunshine/sunshine.conf ]; then + cp /etc/sunshine/sunshine.conf /etc/sunshine/sunshine.conf.old +fi + +if [ -f /etc/sunshine/apps_linux.json ]; then + cp /etc/sunshine/apps_linux.json /etc/sunshine/apps_linux.json.old +fi diff --git a/gen-deb.in b/gen-deb.in deleted file mode 100755 index 25ca36096f9..00000000000 --- a/gen-deb.in +++ /dev/null @@ -1,123 +0,0 @@ -#!/bin/sh - -if [ ! "@SUNSHINE_UNDEFINED_VARIABLE@" = "" ]; then - echo "Please run gen-deb generated by cmake inside the build directory" - exit 1 -fi - -if [ -d package-deb ]; then - echo "package-deb already exists: It will be replaced" - rm -rf package-deb -fi - -export DEBIAN=@CMAKE_CURRENT_BINARY_DIR@/package-deb/sunshine/DEBIAN -export RULES=@CMAKE_CURRENT_BINARY_DIR@/package-deb/sunshine/etc/udev/rules.d -export BIN=@CMAKE_CURRENT_BINARY_DIR@/package-deb/sunshine/usr/bin -export SERVICE=@CMAKE_CURRENT_BINARY_DIR@/package-deb/sunshine/usr/lib/systemd/user -export ASSETS=@CMAKE_CURRENT_BINARY_DIR@/package-deb/sunshine/etc/sunshine - -mkdir -p $DEBIAN -mkdir -p $RULES -mkdir -p $BIN -mkdir -p $ASSETS/shaders -mkdir -p $SERVICE - -if [ ! -f sunshine ]; then - echo "Error: Can't find sunshine" - exit 1 -fi - -cat << 'EOF' > $DEBIAN/conffiles -/etc/sunshine/sunshine.conf -/etc/sunshine/apps_linux.json -EOF - -cat << 'EOF' > $DEBIAN/control -Package: sunshine -Architecture: amd64 -Maintainer: @loki -Priority: optional -Version: @PROJECT_VERSION@ -Depends: libssl1.1, 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 -Description: Gamestream host for Moonlight -EOF - -cat << 'EOF' > $DEBIAN/preinst -#Store backup for old config files to prevent it from being overwritten -if [ -f /etc/sunshine/sunshine.conf ]; then - cp /etc/sunshine/sunshine.conf /etc/sunshine/sunshine.conf.old -fi - -if [ -f /etc/sunshine/apps_linux.json ]; then - cp /etc/sunshine/apps_linux.json /etc/sunshine/apps_linux.json.old -fi -EOF - -cat << 'EOF' > $DEBIAN/postinst -#!/bin/sh - -export GROUP_INPUT=input - -if [ -f /etc/group ]; then - if ! grep -q $GROUP_INPUT /etc/group; then - echo "Creating group $GROUP_INPUT" - - groupadd $GROUP_INPUT - fi -else - echo "Warning: /etc/group not found" -fi - -if [ -f /etc/sunshine/sunshine.conf.old ]; then - echo "Restoring old sunshine.conf" - mv /etc/sunshine/sunshine.conf.old /etc/sunshine/sunshine.conf -fi - -if [ -f /etc/sunshine/apps_linux.json.old ]; then - echo "Restoring old apps_linux.json" - mv /etc/sunshine/apps_linux.json.old /etc/sunshine/apps_linux.json -fi - -# Update permissions on config files for Web Manager -if [ -f /etc/sunshine/apps_linux.json ]; then - echo "chmod 666 /etc/sunshine/apps_linux.json" - chmod 666 /etc/sunshine/apps_linux.json -fi - -if [ -f /etc/sunshine/sunshine.conf ]; then - echo "chmod 666 /etc/sunshine/sunshine.conf" - chmod 666 /etc/sunshine/sunshine.conf -fi - -# Ensure Sunshine can grab images from KMS -path_to_setcap=$(which setcap) -if [ -x "$path_to_setcap" ] ; then - echo "$path_to_setcap cap_sys_admin+p /usr/bin/sunshine" - $path_to_setcap cap_sys_admin+p /usr/bin/sunshine -fi -EOF - -cat << 'EOF' > $RULES/85-sunshine-rules.rules -KERNEL=="uinput", GROUP="input", MODE="0660" -EOF - -cp sunshine $BIN/sunshine -cp @CMAKE_CURRENT_SOURCE_DIR@/assets/apps_linux.json $ASSETS/apps_linux.json -cp @CMAKE_CURRENT_SOURCE_DIR@/assets/sunshine.conf $ASSETS/sunshine.conf -cp @CMAKE_CURRENT_BINARY_DIR@/sunshine.service $SERVICE/sunshine.service -cp -r @CMAKE_CURRENT_SOURCE_DIR@/assets/web $ASSETS/web -cp -r @CMAKE_CURRENT_SOURCE_DIR@/assets/shaders/opengl $ASSETS/shaders/opengl - -chmod 755 $DEBIAN/postinst -chmod 755 $DEBIAN/preinst -chmod 755 $BIN/sunshine -chmod 644 $RULES/85-sunshine-rules.rules -chmod 666 $ASSETS/apps_linux.json -chmod 666 $ASSETS/sunshine.conf - -cd package-deb -if fakeroot dpkg-deb --build sunshine; then - echo "generated debian package: @CMAKE_CURRENT_BINARY_DIR@/package-deb/sunshine.deb" -fi -cd .. - diff --git a/gen-rpm.in b/gen-rpm.in deleted file mode 100755 index 792a3895573..00000000000 --- a/gen-rpm.in +++ /dev/null @@ -1,179 +0,0 @@ -#!/bin/sh - -# Export filepaths -export BUILDDIR=@CMAKE_CURRENT_SOURCE_DIR@/build -export BUILDROOT=~/rpmbuild/ -export RPMSRC=~/rpmbuild/SOURCES -export RPMSPEC=~/rpmbuild/SPECS -export RPMBUILD=~/rpmbuild/BUILD - -# Check for Docker switch -if [ "$1" == "-d" ]; then - export DOCKERSTATUS=TRUE -else - export DOCKERSTATUS=FALSE -fi - -# Check if user's rpmbuild folder is there, if so, temoprairly rename it. -if [ -d ~/rpmbuild ]; then - echo "Backing up rpmbuild" - ~/rpmbuild ~/rpmbuild.bkp - export RPMBUILDEXISTS=TRUE -else - export RPMBUILDEXISTS=FALSE -fi - -# Create rpmbuild folder structure -mkdir ~/rpmbuild -mkdir ~/rpmbuild/BUILD -mkdir ~/rpmbuild/BUILDROOT -mkdir ~/rpmbuild/RPMS -mkdir ~/rpmbuild/SOURCES -mkdir ~/rpmbuild/SPECS -mkdir ~/rpmbuild/SRPMS - -# Create sunshine .spec file with preinstall and postinstall scripts -cat << 'EOF' > $RPMSPEC/sunshine.spec -Name: sunshine -Version: @PROJECT_VERSION@ -Release: 1%{?dist} -Summary: An NVIDIA Gamestream-compatible hosting server -BuildArch: x86_64 - -License: GPLv3 -URL: https://github.com/SunshineStream/Sunshine -Source0: sunshine-@PROJECT_VERSION@_bin.tar.gz - -Requires: systemd ffmpeg rpmfusion-free-release - -%description -An NVIDIA Gamestream-compatible hosting server - -%pre -#!/bin/sh - -# Sunshine Pre-Install Script -# Store backup for old config files to prevent it from being overwritten -if [ -f /etc/sunshine/sunshine.conf ]; then - cp /etc/sunshine/sunshine.conf /etc/sunshine/sunshine.conf.old -fi - -if [ -f /etc/sunshine/apps_linux.json ]; then - cp /etc/sunshine/apps_linux.json /etc/sunshine/apps_linux.json.old -fi - -%post -#!/bin/sh - -# Sunshine Post-Install Script -export GROUP_INPUT=input - -if [ -f /etc/group ]; then - if ! grep -q $GROUP_INPUT /etc/group; then - echo "Creating group $GROUP_INPUT" - - groupadd $GROUP_INPUT - fi -else - echo "Warning: /etc/group not found" -fi - -if [ -f /etc/sunshine/sunshine.conf.old ]; then - echo "Restoring old sunshine.conf" - mv /etc/sunshine/sunshine.conf.old /etc/sunshine/sunshine.conf -fi - -if [ -f /etc/sunshine/apps_linux.json.old ]; then - echo "Restoring old apps_linux.json" - mv /etc/sunshine/apps_linux.json.old /etc/sunshine/apps_linux.json -fi - -# Update permissions on config files for Web Manager -if [ -f /etc/sunshine/apps_linux.json ]; then - echo "chmod 666 /etc/sunshine/apps_linux.json" - chmod 666 /etc/sunshine/apps_linux.json -fi - -if [ -f /etc/sunshine/sunshine.conf ]; then - echo "chmod 666 /etc/sunshine/sunshine.conf" - chmod 666 /etc/sunshine/sunshine.conf -fi - -# Ensure Sunshine can grab images from KMS -path_to_setcap=$(which setcap) -if [ -x "$path_to_setcap" ] ; then - echo "$path_to_setcap cap_sys_admin+p /usr/bin/sunshine" - $path_to_setcap cap_sys_admin+p /usr/bin/sunshine -fi - -%prep -%setup -q - -%install -rm -rf $RPM_BUILD_ROOT -mkdir -p $RPM_BUILD_ROOT/%{_bindir} -mkdir -p $RPM_BUILD_ROOT/etc/sunshine -mkdir -p $RPM_BUILD_ROOT/usr/lib/systemd/user -mkdir -p $RPM_BUILD_ROOT/usr/share/applications -mkdir -p $RPM_BUILD_ROOT/etc/udev/rules.d - -cp sunshine $RPM_BUILD_ROOT/%{_bindir}/sunshine -cp sunshine.conf $RPM_BUILD_ROOT/etc/sunshine/sunshine.conf -cp apps_linux.json $RPM_BUILD_ROOT/etc/sunshine/apps_linux.json -cp sunshine.service $RPM_BUILD_ROOT/usr/lib/systemd/user/sunshine.service -cp sunshine.desktop $RPM_BUILD_ROOT/usr/share/applications/sunshine.desktop -cp 85-sunshine-rules.rules $RPM_BUILD_ROOT/etc/udev/rules.d/85-sunshine-rules.rules - -%clean -rm -rf $RPM_BUILD_ROOT - -%files -%{_bindir}/sunshine -/usr/lib/systemd/user/sunshine.service -/etc/sunshine/sunshine.conf -/etc/sunshine/apps_linux.json -/usr/share/applications/sunshine.desktop -/etc/udev/rules.d/85-sunshine-rules.rules - -%changelog -* Sat Mar 12 2022 h <65380846+thatsysadmin@users.noreply.github.com> -- Initial packaging of Sunshine. -EOF - -# Copy over sunshine binary and supplemental files into rpmbuild/BUILD/ -mkdir genrpm -mkdir genrpm/sunshine-@PROJECT_VERSION@ -cp sunshine-@PROJECT_VERSION@ genrpm/sunshine-@PROJECT_VERSION@/sunshine -cp sunshine.service genrpm/sunshine-@PROJECT_VERSION@/sunshine.service -cp sunshine.desktop genrpm/sunshine-@PROJECT_VERSION@/sunshine.desktop -cp @CMAKE_CURRENT_SOURCE_DIR@/assets/sunshine.conf genrpm/sunshine-@PROJECT_VERSION@/sunshine.conf -cp @CMAKE_CURRENT_SOURCE_DIR@/assets/apps_linux.json genrpm/sunshine-@PROJECT_VERSION@/apps_linux.json -cp @CMAKE_CURRENT_SOURCE_DIR@/assets/85-sunshine-rules.rules genrpm/sunshine-@PROJECT_VERSION@/85-sunshine-rules.rules -cd genrpm - -# tarball everything as if it was a source file for rpmbuild -tar --create --file sunshine-@PROJECT_VERSION@_bin.tar.gz sunshine-@PROJECT_VERSION@/ -cp sunshine-@PROJECT_VERSION@_bin.tar.gz ~/rpmbuild/SOURCES - -# Use rpmbuild to build the RPM package. -rpmbuild -bb $RPMSPEC/sunshine.spec - -# Check if running in a CT -if [ "$DOCKERSTATUS" == "FALSE" ]; then - # Move the completed RPM into the cmake build folder - mv ~/rpmbuild/RPMS/x86_64/sunshine-@PROJECT_VERSION@-1.fc*.x86_64.rpm @CMAKE_CURRENT_BINARY_DIR@/ - echo "Moving completed RPM package into CMake build folder." -elif [ "$DOCKERSTATUS" == "TRUE" ]; then - # Move into pickup location - mkdir -p /root/sunshine-build/package-rpm/ - mv ~/rpmbuild/RPMS/x86_64/sunshine-@PROJECT_VERSION@-1.fc*.x86_64.rpm /root/sunshine-build/package-rpm/sunshine.rpm - echo "Moving completed RPM package for pickup." -fi - -# Clean up; delete the rpmbuild folder we created and move back the original one -if [ "$RPMBUILDEXISTS" == "TRUE" ]; then - echo "Removing and replacing original rpmbuild folder." - rm -rf ~/rpmbuild - mv ~/rpmbuild.bkp ~/rpmbuild -fi -exit 0 From 2ea414d1d4d6f152650b41d826c2196b14a47d42 Mon Sep 17 00:00:00 2001 From: ABeltramo Date: Sat, 23 Apr 2022 11:04:00 +0100 Subject: [PATCH 02/12] testing RPM package dependencies --- CMakeLists.txt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 291a6f2eb35..859b544a9e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -478,6 +478,12 @@ if(UNIX AND NOT APPLE) "${SUNSHINE_ASSETS_DIR}/linux-deb/preinst;${SUNSHINE_ASSETS_DIR}/linux-deb/postinst;${SUNSHINE_ASSETS_DIR}/linux-deb/conffiles") set(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE "${SUNSHINE_ASSETS_DIR}/linux-deb/preinst") set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${SUNSHINE_ASSETS_DIR}/linux-deb/postinst") + + # Dependencies + set(CPACK_DEB_COMPONENT_INSTALL ON) + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libssl1.1, 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 "libssl==1.1, libavdevice>=58, libboost-thread>=1.67.0, libboost-filesystem>=1.67.0, libboost-log>=1.67.0, libpulse>=0, libopus>=0, libxcb-shm>=0, libxcb-xfixes>=0, libxtst>=0, libevdev>=2.0, libdrm>=2.0, libcap>=2.0") + set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF) # endif() # Common options @@ -500,9 +506,4 @@ if(UNIX AND NOT APPLE) set(CMAKE_INSTALL_PREFIX "/etc/sunshine") endif() -## DEB -set(CPACK_DEB_COMPONENT_INSTALL ON) -set(CPACK_DEBIAN_PACKAGE_DEPENDS "libssl1.1, 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_DEBIAN_PACKAGE_SHLIBDEPS OFF) - include(CPack) \ No newline at end of file From ffdcf0fea86bb046e329554d117510346c987d32 Mon Sep 17 00:00:00 2001 From: ABeltramo Date: Sat, 23 Apr 2022 15:13:27 +0100 Subject: [PATCH 03/12] feat: basic OSX .app generation added default brew link libraries path --- CMakeLists.txt | 40 ++++++++++++++++++++++++++-------------- sunshine.icns | Bin 0 -> 23711 bytes 2 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 sunshine.icns diff --git a/CMakeLists.txt b/CMakeLists.txt index 859b544a9e1..d81bda12fb3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,7 +58,7 @@ if(WIN32) INPUT "${CMAKE_CURRENT_BINARY_DIR}/pre-compiled.zip" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/pre-compiled) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") - + if(NOT DEFINED SUNSHINE_PREPARED_BINARIES) set(SUNSHINE_PREPARED_BINARIES "${CMAKE_CURRENT_BINARY_DIR}/pre-compiled/windows") endif() @@ -127,8 +127,8 @@ if(WIN32) elseif(APPLE) add_compile_definitions(SUNSHINE_PLATFORM="macos") list(APPEND SUNSHINE_DEFINITIONS APPS_JSON="apps_mac.json") + link_directories(/opt/homebrew/lib/) # Default brew lib location link_directories(/opt/local/lib) - link_directories(/usr/local/lib) ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK) find_package(FFmpeg REQUIRED) @@ -296,14 +296,14 @@ else() third-party/glad/include/KHR/khrplatform.h third-party/glad/include/glad/gl.h third-party/glad/include/glad/egl.h) - + list(APPEND PLATFORM_LIBRARIES dl evdev pulse pulse-simple ) - + include_directories( /usr/include/libevdev-1.0 third-party/nv-codec-headers/include @@ -451,22 +451,36 @@ target_compile_options(sunshine PRIVATE $<$:${SUNSHINE_COM # CPACK #### -# Add all assets dependencies -install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/web" DESTINATION ".") -install(FILES "${SUNSHINE_ASSETS_DIR}/sunshine.conf" DESTINATION ".") +# Add all assets dependencies if(WIN32) # TODO: test install(TARGETS sunshine RUNTIME DESTINATION ".") + install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/web" DESTINATION ".") + install(FILES "${SUNSHINE_ASSETS_DIR}/sunshine.conf" DESTINATION ".") install(FILES "${SUNSHINE_ASSETS_DIR}/apps_windows.json" DESTINATION ".") install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/shaders/directx" DESTINATION "shaders") endif() if(APPLE) # TODO: test - install(TARGETS sunshine RUNTIME DESTINATION ".") - install(FILES "${SUNSHINE_ASSETS_DIR}/apps_mac.json" DESTINATION ".") - # TODO: info.plist ?? + set(prefix "${CMAKE_PROJECT_NAME}.app/Contents") + set(INSTALL_RUNTIME_DIR "${prefix}/MacOS") + + install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/web" DESTINATION "${INSTALL_RUNTIME_DIR}") + install(FILES "${SUNSHINE_ASSETS_DIR}/sunshine.conf" DESTINATION "${INSTALL_RUNTIME_DIR}") + + install(TARGETS sunshine + BUNDLE DESTINATION . COMPONENT Runtime + RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR} COMPONENT Runtime) + + # TODO: bundle doesn't produce a valid .app use cpack -G DragNDrop + # set(CPACK_BUNDLE_NAME "Sunshine") + # set(CPACK_BUNDLE_PLIST "${SUNSHINE_ASSETS_DIR}/info.plist") + # set(CPACK_BUNDLE_ICON "${PROJECT_SOURCE_DIR}/sunshine.icns") endif() if(UNIX AND NOT APPLE) + install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/web" DESTINATION ".") + install(FILES "${SUNSHINE_ASSETS_DIR}/sunshine.conf" DESTINATION ".") + install(FILES "${SUNSHINE_ASSETS_DIR}/apps_linux.json" DESTINATION ".") install(FILES "${SUNSHINE_ASSETS_DIR}/85-sunshine-rules.rules" DESTINATION "/etc/udev/rules.d") install(TARGETS sunshine RUNTIME DESTINATION "/usr/bin") @@ -474,7 +488,7 @@ if(UNIX AND NOT APPLE) install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/shaders/opengl" DESTINATION "shaders") # Pre and post install - set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA + set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${SUNSHINE_ASSETS_DIR}/linux-deb/preinst;${SUNSHINE_ASSETS_DIR}/linux-deb/postinst;${SUNSHINE_ASSETS_DIR}/linux-deb/conffiles") set(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE "${SUNSHINE_ASSETS_DIR}/linux-deb/preinst") set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${SUNSHINE_ASSETS_DIR}/linux-deb/postinst") @@ -499,10 +513,8 @@ set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${VERSION}_${CPACK_DEBIAN_PAC set(CPACK_STRIP_FILES YES) # Installation destination dir -if(NOT WIN32) - set(CPACK_SET_DESTDIR true) -endif() if(UNIX AND NOT APPLE) + set(CPACK_SET_DESTDIR true) set(CMAKE_INSTALL_PREFIX "/etc/sunshine") endif() diff --git a/sunshine.icns b/sunshine.icns new file mode 100644 index 0000000000000000000000000000000000000000..0420582b244aa1599ebe86a9016d3113ef42c7cc GIT binary patch literal 23711 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 literal 0 HcmV?d00001 From e2bef750b4b3201be8ef6ee49a95263f025af05f Mon Sep 17 00:00:00 2001 From: ABeltramo Date: Wed, 27 Apr 2022 20:50:30 +0100 Subject: [PATCH 04/12] feat: created NSIS windows installer, fixed Linux packaging paths --- CMakeLists.txt | 99 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 71 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d81bda12fb3..4c19621ac45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -451,14 +451,71 @@ target_compile_options(sunshine PRIVATE $<$:${SUNSHINE_COM # CPACK #### -# Add all assets dependencies -if(WIN32) # TODO: test - install(TARGETS sunshine RUNTIME DESTINATION ".") - - install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/web" DESTINATION ".") - install(FILES "${SUNSHINE_ASSETS_DIR}/sunshine.conf" DESTINATION ".") - install(FILES "${SUNSHINE_ASSETS_DIR}/apps_windows.json" DESTINATION ".") - install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/shaders/directx" DESTINATION "shaders") +# Common options +set(CPACK_PACKAGE_NAME "SunshineStream") +set(CPACK_PACKAGE_VENDOR "CMake.org") +set(CPACK_PACKAGE_CONTACT "https://github.com/SunshineStream/Sunshine") +set(CPACK_DEBIAN_PACKAGE_MAINTAINER "https://github.com/SunshineStream/Sunshine") +set(CPACK_PACKAGE_DESCRIPTION "Gamestream host for Moonlight") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/SunshineStream/Sunshine") +set(CPACK_RESOURCE_FILE_LICENSE ${PROJECT_SOURCE_DIR}/LICENSE) +set(CPACK_PACKAGE_ICON ${PROJECT_SOURCE_DIR}/sunshine.png) +set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}") +set(CPACK_STRIP_FILES YES) + +# Platform specific options +if(WIN32) # see options at: https://cmake.org/cmake/help/latest/cpack_gen/nsis.html + install(TARGETS sunshine RUNTIME DESTINATION "." COMPONENT application) + + # Adding tools + install(TARGETS dxgi-info RUNTIME DESTINATION "tools" COMPONENT dxgi) + install(TARGETS audio-info RUNTIME DESTINATION "tools" COMPONENT audio) + install(TARGETS sunshinesvc RUNTIME DESTINATION "tools" COMPONENT sunshinesvc) + + install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/web" DESTINATION "${SUNSHINE_CONFIG_DIR}" COMPONENT web) + install(FILES "${SUNSHINE_ASSETS_DIR}/apps_windows.json" DESTINATION "${SUNSHINE_CONFIG_DIR}" COMPONENT assets) + install(FILES "${SUNSHINE_ASSETS_DIR}/sunshine.conf" DESTINATION "${SUNSHINE_CONFIG_DIR}" COMPONENT assets) + install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/shaders/directx" DESTINATION "${SUNSHINE_CONFIG_DIR}/shaders" COMPONENT assets) + + set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\sunshine.ico") + set(CPACK_NSIS_INSTALLED_ICON_NAME "${PROJECT__DIR}\\\\${PROJECT_EXE}") + string(APPEND CPACK_NSIS_DEFINES "\n RequestExecutionLevel admin") # TODO: Not sure if this is needed but it took me a while to figure out where to put this option so I'm leaving it here + + # Sets permissions on the installed folder so that we can write in it + SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS + "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS} + ExecWait 'icacls \\\"$INSTDIR\\\" /grant:r Users:\\\(OI\\\)\\\(CI\\\)\\\(F\\\)' + ") + + # Adding an option for the start menu and PATH + set(CPACK_NSIS_MODIFY_PATH "OFF") # TODO: it asks to add it to the PATH but then it seems I can't just run it from powershell + set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") + set(CPACK_NSIS_MUI_FINISHPAGE_RUN "${PROJECT_NAME}.exe") + set(CPACK_NSIS_INSTALLED_ICON_NAME "${PROJECT_NAME}.exe") # This will be shown on the installed apps Windows settings + set(CPACK_NSIS_CREATE_ICONS "CreateShortCut '\$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\${PROJECT_NAME}.lnk' '\$INSTDIR\\\\${PROJECT_NAME}.exe'") + + # Checking for previous installed versions + # set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL "ON") # TODO: doesn't work on my machine when Sunshine is already installed + + # Setting components groups and dependencies + set(CPACK_COMPONENT_APPLICATION_DISPLAY_NAME "Sunshine") + set(CPACK_COMPONENT_WEB_DISPLAY_NAME "Web interface") + set(CPACK_COMPONENT_ASSETS_DISPLAY_NAME "Extra assets files") + set(CPACK_COMPONENT_LIBRARIES_DISPLAY_NAME "Libraries") + + set(CPACK_COMPONENT_APPLICATION_GROUP "Runtime") + set(CPACK_COMPONENT_WEB_GROUP "Runtime") + set(CPACK_COMPONENT_ASSETS_GROUP "Runtime") + + set(CPACK_COMPONENT_DXGI_DISPLAY_NAME "dxgi-info.exe") + set(CPACK_COMPONENT_AUDIO_DISPLAY_NAME "audio-info.exe") + set(CPACK_COMPONENT_SUNSHINESVC_DISPLAY_NAME "sunshinesvc.exe") + + set(CPACK_COMPONENT_DXGI_GROUP "Extra Tools") + set(CPACK_COMPONENT_AUDIO_GROUP "Extra Tools") + set(CPACK_COMPONENT_SUNSHINESVC_GROUP "Extra Tools") + + set(CPACK_COMPONENT_APPLICATION_DEPENDS web assets) endif() if(APPLE) # TODO: test @@ -478,14 +535,14 @@ if(APPLE) # TODO: test # set(CPACK_BUNDLE_ICON "${PROJECT_SOURCE_DIR}/sunshine.icns") endif() if(UNIX AND NOT APPLE) - install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/web" DESTINATION ".") - install(FILES "${SUNSHINE_ASSETS_DIR}/sunshine.conf" DESTINATION ".") + install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/web" DESTINATION "${SUNSHINE_CONFIG_DIR}") + install(FILES "${SUNSHINE_ASSETS_DIR}/sunshine.conf" DESTINATION "${SUNSHINE_CONFIG_DIR}") - install(FILES "${SUNSHINE_ASSETS_DIR}/apps_linux.json" DESTINATION ".") + install(FILES "${SUNSHINE_ASSETS_DIR}/apps_linux.json" DESTINATION "${SUNSHINE_CONFIG_DIR}") install(FILES "${SUNSHINE_ASSETS_DIR}/85-sunshine-rules.rules" DESTINATION "/etc/udev/rules.d") install(TARGETS sunshine RUNTIME DESTINATION "/usr/bin") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine.service" DESTINATION "/usr/lib/systemd/user") - install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/shaders/opengl" DESTINATION "shaders") + install(DIRECTORY "${SUNSHINE_ASSETS_DIR}/shaders/opengl" DESTINATION "${SUNSHINE_CONFIG_DIR}/shaders") # Pre and post install set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA @@ -497,23 +554,9 @@ if(UNIX AND NOT APPLE) set(CPACK_DEB_COMPONENT_INSTALL ON) set(CPACK_DEBIAN_PACKAGE_DEPENDS "libssl1.1, 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 "libssl==1.1, libavdevice>=58, libboost-thread>=1.67.0, libboost-filesystem>=1.67.0, libboost-log>=1.67.0, libpulse>=0, libopus>=0, libxcb-shm>=0, libxcb-xfixes>=0, libxtst>=0, libevdev>=2.0, libdrm>=2.0, libcap>=2.0") - set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF) # -endif() + set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF) # This should automatically figure out dependencies, doesn't work with the current config -# Common options -set(CPACK_PACKAGE_NAME "SunshineStream") -set(CPACK_PACKAGE_VENDOR "CMake.org") -set(CPACK_PACKAGE_CONTACT "https://github.com/SunshineStream/Sunshine") -set(CPACK_DEBIAN_PACKAGE_MAINTAINER "https://github.com/SunshineStream/Sunshine") -set(CPACK_PACKAGE_DESCRIPTION "Gamestream host for Moonlight") -set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/SunshineStream/Sunshine") -set(CPACK_RESOURCE_FILE_LICENSE ${PROJECT_SOURCE_DIR}/LICENSE) -set(CPACK_PACKAGE_ICON ${PROJECT_SOURCE_DIR}/sunshine.png) -set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}") -set(CPACK_STRIP_FILES YES) - -# Installation destination dir -if(UNIX AND NOT APPLE) + # Installation destination dir set(CPACK_SET_DESTDIR true) set(CMAKE_INSTALL_PREFIX "/etc/sunshine") endif() From cc2d982cebee5cc19894ef2a23bf9fb29f88d638 Mon Sep 17 00:00:00 2001 From: ABeltramo Date: Wed, 27 Apr 2022 21:00:20 +0100 Subject: [PATCH 05/12] feat: testing out CI building for new packages --- .github/workflows/CI.yml | 56 ++++++++++++---------------------------- 1 file changed, 17 insertions(+), 39 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b0be11308d8..e4a76c6e071 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -147,43 +147,29 @@ jobs: name: Linux runs-on: ubuntu-20.04 needs: check_changelog - strategy: - fail-fast: true # false to test all, true to fail entire job if any fail - matrix: - distro: [ debian, ubuntu_18_04, ubuntu_20_04, ubuntu_21_10 ] - package: [ -p ] - extension: [ deb ] - include: # package these differently - - distro: fedora_35 - package: '-p' - extension: rpm - steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive - - name: Setup Container + - name: Build DEB and RPM run: | + mkdir -p build mkdir -p artifacts - - cd scripts - sudo ./build-container.sh -c build -f Dockerfile-${{ matrix.distro }} -n sunshine-${{ matrix.distro }} - - name: Build Linux - run: | - cd scripts - sudo ./build-sunshine.sh ${{ matrix.package }} -e ${{ matrix.extension }} -u -n sunshine-${{ matrix.distro }} -s .. - - name: Package Linux - if: ${{ matrix.package != '' }} - run: | - cd scripts - sudo mv ./sunshine-${{ matrix.distro }}-build/sunshine-${{ matrix.distro }}.${{ matrix.extension }} ../artifacts/ + cd build + + cmake -DCMAKE_BUILD_TYPE=Release -DSUNSHINE_CONFIG_DIR="." ../ + cpack -G DEB + cpack -G RPM + + cp Sunshine__.rpm ../artifacts/ + cp Sunshine__.deb ../artifacts/ - name: Upload Artifacts if: ${{ matrix.package == '-p' && ( github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' ) }} uses: actions/upload-artifact@v3 with: - name: sunshine-${{ matrix.distro }} + name: sunshine-linux path: artifacts/ - name: Create Release if: ${{ matrix.package == '-p' && github.event_name == 'push' && github.ref == 'refs/heads/master' }} @@ -218,6 +204,7 @@ jobs: mingw-w64-x86_64-opus mingw-w64-x86_64-x265 mingw-w64-x86_64-boost + mingw-w64-x86_64-nsis git yasm nasm @@ -226,23 +213,14 @@ jobs: - name: Build Windows shell: msys2 {0} run: | + mkdir artifacts + mkdir sunshine-windows-build && cd sunshine-windows-build cmake -DCMAKE_BUILD_TYPE=Release -DSUNSHINE_ASSETS_DIR=assets -G "MinGW Makefiles" .. mingw32-make -j2 - - name: Package Windows - run: | - cd sunshine-windows-build - del ..\assets\apps_linux.json - 7z a sunshine-windows.zip ..\assets - 7z a sunshine-windows.zip sunshine.exe - 7z a sunshine-windows.zip tools\dxgi-info.exe - 7z a sunshine-windows.zip tools\audio-info.exe - 7z a sunshine-windows.zip tools\sunshinesvc.exe - 7z a sunshine-windows.zip ..\tools\install-service.bat - 7z a sunshine-windows.zip ..\tools\uninstall-service.bat - cd .. - mkdir artifacts - move "sunshine-windows-build\sunshine-windows.zip" "artifacts" + cpack + + cp Sunshine__.exe ../artifacts - name: Upload Artifacts if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} uses: actions/upload-artifact@v3 From 4e4a5c8df8c60dcf4fe2a409c4455c9786cc45ef Mon Sep 17 00:00:00 2001 From: ABeltramo Date: Fri, 29 Apr 2022 21:19:05 +0100 Subject: [PATCH 06/12] feat: testing out a better CI workflow --- .github/workflows/CI.yml | 162 ++++++++++++++++++++++++++------------- CMakeLists.txt | 2 +- 2 files changed, 110 insertions(+), 54 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index e4a76c6e071..b1503feb02d 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -51,10 +51,60 @@ 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: + name: Build Sunshine on Linux + runs-on: ubuntu-20.04 + needs: check_changelog + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Cache Sunshine build + uses: actions/cache@v2 + with: + path: build + key: ${{ runner.os }}-sunshine-build + + - name: Setup Dependencies + run: | + mkdir -p artifacts + + sudo apt-get update -y && \ + sudo apt-get --reinstall install -y \ + git wget gcc-10 g++-10 build-essential cmake libssl-dev libavdevice-dev libboost-thread-dev libboost-filesystem-dev libboost-log-dev libpulse-dev libopus-dev libxtst-dev libx11-dev libxrandr-dev libxfixes-dev libevdev-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev libdrm-dev libcap-dev libwayland-dev + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 + sudo wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda_11.4.2_470.57.02_linux.run --progress=bar:force:noscroll -q --show-progress -O /root/cuda.run && sudo chmod a+x /root/cuda.run + sudo /root/cuda.run --silent --toolkit --toolkitpath=/usr --no-opengl-libs --no-man-page --no-drm && sudo rm /root/cuda.run + sudo add-apt-repository ppa:savoury1/graphics -y + sudo add-apt-repository ppa:savoury1/multimedia -y + sudo add-apt-repository ppa:savoury1/ffmpeg4 -y + sudo apt-get update -y + sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y + sudo apt-get install ffmpeg -y + + - name: Build Sunshine + run: | + CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE:-Release}" + SUNSHINE_EXECUTABLE_PATH="${SUNSHINE_EXECUTABLE_PATH:-/usr/bin/sunshine}" + SUNSHINE_ASSETS_DIR="${SUNSHINE_ASSETS_DIR:-sunshine.AppImage.config}" + + SUNSHINE_ENABLE_WAYLAND=${SUNSHINE_ENABLE_WAYLAND:-ON} + SUNSHINE_ENABLE_X11=${SUNSHINE_ENABLE_X11:-ON} + SUNSHINE_ENABLE_DRM=${SUNSHINE_ENABLE_DRM:-ON} + SUNSHINE_ENABLE_CUDA=${SUNSHINE_ENABLE_CUDA:-ON} + + mkdir -p build + cd build + + cmake "-DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE" "-DSUNSHINE_EXECUTABLE_PATH=$SUNSHINE_EXECUTABLE_PATH" "-DSUNSHINE_ASSETS_DIR=$SUNSHINE_ASSETS_DIR" "-DSUNSHINE_ENABLE_WAYLAND=$SUNSHINE_ENABLE_WAYLAND" "-DSUNSHINE_ENABLE_X11=$SUNSHINE_ENABLE_X11" "-DSUNSHINE_ENABLE_DRM=$SUNSHINE_ENABLE_DRM" "-DSUNSHINE_ENABLE_CUDA=$SUNSHINE_ENABLE_CUDA" "../" -DCMAKE_INSTALL_PREFIX=/usr + make -j ${nproc} DESTDIR=AppDir + build_appimage: name: AppImage runs-on: ubuntu-20.04 - needs: check_changelog + needs: build_linux steps: - name: Checkout @@ -62,38 +112,12 @@ jobs: with: submodules: recursive - - name: Setup Dependencies AppImage - run: | - mkdir -p artifacts - - sudo apt-get update -y && \ - sudo apt-get --reinstall install -y \ - git wget gcc-10 g++-10 build-essential cmake libssl-dev libavdevice-dev libboost-thread-dev libboost-filesystem-dev libboost-log-dev libpulse-dev libopus-dev libxtst-dev libx11-dev libxrandr-dev libxfixes-dev libevdev-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev libdrm-dev libcap-dev libwayland-dev - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 - sudo wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda_11.4.2_470.57.02_linux.run --progress=bar:force:noscroll -q --show-progress -O /root/cuda.run && sudo chmod a+x /root/cuda.run - sudo /root/cuda.run --silent --toolkit --toolkitpath=/usr --no-opengl-libs --no-man-page --no-drm && sudo rm /root/cuda.run - sudo add-apt-repository ppa:savoury1/graphics -y - sudo add-apt-repository ppa:savoury1/multimedia -y - sudo add-apt-repository ppa:savoury1/ffmpeg4 -y - sudo apt-get update -y - sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y - sudo apt-get install ffmpeg -y - - name: Build AppImage - run: | - CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE:-Release}" - SUNSHINE_EXECUTABLE_PATH="${SUNSHINE_EXECUTABLE_PATH:-/usr/bin/sunshine}" - SUNSHINE_ASSETS_DIR="${SUNSHINE_ASSETS_DIR:-sunshine.AppImage.config}" - - SUNSHINE_ENABLE_WAYLAND=${SUNSHINE_ENABLE_WAYLAND:-ON} - SUNSHINE_ENABLE_X11=${SUNSHINE_ENABLE_X11:-ON} - SUNSHINE_ENABLE_DRM=${SUNSHINE_ENABLE_DRM:-ON} - SUNSHINE_ENABLE_CUDA=${SUNSHINE_ENABLE_CUDA:-ON} - - mkdir -p appimage-build && cd appimage-build - - cmake "-DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE" "-DSUNSHINE_EXECUTABLE_PATH=$SUNSHINE_EXECUTABLE_PATH" "-DSUNSHINE_ASSETS_DIR=$SUNSHINE_ASSETS_DIR" "-DSUNSHINE_ENABLE_WAYLAND=$SUNSHINE_ENABLE_WAYLAND" "-DSUNSHINE_ENABLE_X11=$SUNSHINE_ENABLE_X11" "-DSUNSHINE_ENABLE_DRM=$SUNSHINE_ENABLE_DRM" "-DSUNSHINE_ENABLE_CUDA=$SUNSHINE_ENABLE_CUDA" "../" -DCMAKE_INSTALL_PREFIX=/usr + - name: Cache Sunshine build + uses: actions/cache@v2 + with: + path: build + key: ${{ runner.os }}-sunshine-build - make -j ${nproc} DESTDIR=AppDir - name: Set AppImage Version if: ${{ needs.check_changelog.outputs.next_version_bare != needs.check_changelog.outputs.latest_version }} run: | @@ -143,34 +167,44 @@ jobs: last_version: ${{ needs.check_changelog.outputs.last_version }} release_body: ${{ needs.check_changelog.outputs.release_body }} - build_linux: - name: Linux + build_deb_and_rpm: + name: Build DEB and RPM runs-on: ubuntu-20.04 - needs: check_changelog + needs: build_linux steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive + - name: Cache Sunshine build + uses: actions/cache@v2 + with: + path: build + key: ${{ runner.os }}-sunshine-build + + - name: Extra dependencies + run: | + sudo apt-get update -y + sudo apt-get install -y cpack + - name: Build DEB and RPM run: | - mkdir -p build - mkdir -p artifacts cd build - - cmake -DCMAKE_BUILD_TYPE=Release -DSUNSHINE_CONFIG_DIR="." ../ cpack -G DEB cpack -G RPM - - cp Sunshine__.rpm ../artifacts/ - cp Sunshine__.deb ../artifacts/ - - name: Upload Artifacts + - name: Upload RPM if: ${{ matrix.package == '-p' && ( github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' ) }} uses: actions/upload-artifact@v3 with: - name: sunshine-linux - path: artifacts/ + name: sunshine-linux-rpm + path: build/Sunshine__.rpm + - name: Upload DEB + if: ${{ matrix.package == '-p' && ( github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' ) }} + uses: actions/upload-artifact@v3 + with: + name: sunshine-linux-deb + path: build/Sunshine__.deb - name: Create Release if: ${{ matrix.package == '-p' && github.event_name == 'push' && github.ref == 'refs/heads/master' }} uses: SunshineStream/actions/create_release@master @@ -212,21 +246,43 @@ jobs: make - name: Build Windows shell: msys2 {0} - run: | - mkdir artifacts - - mkdir sunshine-windows-build && cd sunshine-windows-build + run: | + mkdir sunshine-windows-build + cd sunshine-windows-build cmake -DCMAKE_BUILD_TYPE=Release -DSUNSHINE_ASSETS_DIR=assets -G "MinGW Makefiles" .. mingw32-make -j2 + - name: Create packages + shell: msys2 {0} + run: | + cd sunshine-windows-build cpack + + mkdir -p artifacts/standalone + mkdir -p artifacts/web + mkdir -p artifacts/shaders/directx + + # Installers + mv Sunshine__.exe artifacts/sunshine-windows-installer.exe - cp Sunshine__.exe ../artifacts - - name: Upload Artifacts + # Standalone + mv ../assets/web artifacts/web + mv tools artifacts/tools + mv ../assets/shaders/directx artifacts/shaders/directx + mv ../assets/apps_windows.json artifacts/apps_windows.json + mv ../assets/sunshine.conf artifacts/sunshine.conf + mv sunshine.exe artifacts/sunshine.exe + - name: Upload Sunshine Installer + if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} + uses: actions/upload-artifact@v3 + with: + name: sunshine-windows-installer + path: artifacts/sunshine-windows-installer.exe + - name: Upload Sunshine executable if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} uses: actions/upload-artifact@v3 with: - name: sunshine-windows - path: artifacts/ + name: sunshine-windows-standalone + path: artifacts/standalone - name: Create Release if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} uses: SunshineStream/actions/create_release@master diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c19621ac45..f34a86b03ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -457,7 +457,7 @@ set(CPACK_PACKAGE_VENDOR "CMake.org") set(CPACK_PACKAGE_CONTACT "https://github.com/SunshineStream/Sunshine") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "https://github.com/SunshineStream/Sunshine") set(CPACK_PACKAGE_DESCRIPTION "Gamestream host for Moonlight") -set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/SunshineStream/Sunshine") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://sunshinestream.github.io") set(CPACK_RESOURCE_FILE_LICENSE ${PROJECT_SOURCE_DIR}/LICENSE) set(CPACK_PACKAGE_ICON ${PROJECT_SOURCE_DIR}/sunshine.png) set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}") From af342c8cc98c1f9d5a29dff1dadbf1b3564f113b Mon Sep 17 00:00:00 2001 From: ABeltramo Date: Fri, 29 Apr 2022 21:21:37 +0100 Subject: [PATCH 07/12] fix: CI, better jobs dependencies --- .github/workflows/CI.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b1503feb02d..082f1cd9947 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -32,7 +32,6 @@ jobs: check_versions: name: Check Versions runs-on: ubuntu-latest - needs: check_changelog if: ${{ github.ref == 'refs/heads/master' || github.base_ref == 'master' }} # base_ref for pull request check, ref for push steps: @@ -54,7 +53,7 @@ jobs: build_linux: name: Build Sunshine on Linux runs-on: ubuntu-20.04 - needs: check_changelog + needs: [check_versions, check_changelog] steps: - name: Checkout uses: actions/checkout@v3 @@ -217,7 +216,7 @@ jobs: build_win: name: Windows runs-on: windows-2019 - needs: check_changelog + needs: [check_versions, check_changelog] steps: - name: Checkout From 6858f9c8d47a4e26fc25544aac25425c5b72db08 Mon Sep 17 00:00:00 2001 From: ABeltramo Date: Fri, 29 Apr 2022 23:10:27 +0100 Subject: [PATCH 08/12] fix: testing CI --- .github/workflows/CI.yml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 082f1cd9947..70d442d31bb 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -32,13 +32,12 @@ jobs: check_versions: name: Check Versions runs-on: ubuntu-latest - if: ${{ github.ref == 'refs/heads/master' || github.base_ref == 'master' }} - # base_ref for pull request check, ref for push steps: - name: Checkout uses: actions/checkout@v3 - name: Check CMakeLists.txt Version + if: ${{ github.ref == 'refs/heads/master' || github.base_ref == 'master' }} run: | version=$(grep -o -E '^project\(Sunshine VERSION [0-9]+\.[0-9]+\.[0-9]+\)' CMakeLists.txt | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+') echo "cmakelists_version=${version}" >> $GITHUB_ENV @@ -134,7 +133,7 @@ jobs: wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage && chmod +x linuxdeploy-x86_64.AppImage - ./linuxdeploy-x86_64.AppImage --appdir ../AppDir -e ../appimage-build/sunshine -i "../$ICON_FILE" -d "../appimage-build/$DESKTOP_FILE" --output appimage + ./linuxdeploy-x86_64.AppImage --appdir ../AppDir -e ../build/sunshine -i "../$ICON_FILE" -d "../build/$DESKTOP_FILE" --output appimage mv sunshine*.AppImage sunshine.AppImage mkdir sunshine && mv sunshine.AppImage sunshine/ @@ -185,7 +184,7 @@ jobs: - name: Extra dependencies run: | sudo apt-get update -y - sudo apt-get install -y cpack + sudo apt-get install -y cmake # will install cpack - name: Build DEB and RPM run: | @@ -256,32 +255,33 @@ jobs: cd sunshine-windows-build cpack - mkdir -p artifacts/standalone - mkdir -p artifacts/web - mkdir -p artifacts/shaders/directx + mkdir -p ../artifacts # Installers - mv Sunshine__.exe artifacts/sunshine-windows-installer.exe + mv Sunshine__.exe ../artifacts/sunshine-windows-installer.exe # Standalone - mv ../assets/web artifacts/web - mv tools artifacts/tools - mv ../assets/shaders/directx artifacts/shaders/directx - mv ../assets/apps_windows.json artifacts/apps_windows.json - mv ../assets/sunshine.conf artifacts/sunshine.conf - mv sunshine.exe artifacts/sunshine.exe + del ..\assets\apps_linux.json + 7z a sunshine-windows.zip ..\assets + 7z a sunshine-windows.zip sunshine.exe + 7z a sunshine-windows.zip tools\dxgi-info.exe + 7z a sunshine-windows.zip tools\audio-info.exe + 7z a sunshine-windows.zip tools\sunshinesvc.exe + 7z a sunshine-windows.zip ..\tools\install-service.bat + 7z a sunshine-windows.zip ..\tools\uninstall-service.bat + move "sunshine-windows.zip" "../artifacts" - name: Upload Sunshine Installer if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} uses: actions/upload-artifact@v3 with: - name: sunshine-windows-installer - path: artifacts/sunshine-windows-installer.exe + name: sunshine-windows + path: artifacts - name: Upload Sunshine executable if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} uses: actions/upload-artifact@v3 with: name: sunshine-windows-standalone - path: artifacts/standalone + path: sunshine-windows-build/artifacts/standalone - name: Create Release if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} uses: SunshineStream/actions/create_release@master From 5eb3e7c75f50426a9e4e5ca3eae0d55d167a90ce Mon Sep 17 00:00:00 2001 From: ABeltramo Date: Sat, 30 Apr 2022 09:45:33 +0100 Subject: [PATCH 09/12] CI: use cpack for windows 7Z, split back deb/rpm and appimage, moved release action at the end --- .github/workflows/CI.yml | 287 ++++++++++++++++++--------------------- 1 file changed, 130 insertions(+), 157 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 70d442d31bb..b85dfcd7408 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -5,7 +5,7 @@ on: branches: [master, nightly] types: [opened, synchronize, reopened] push: - branches: [master] + branches: [ master ] workflow_dispatch: jobs: @@ -13,62 +13,57 @@ jobs: name: Check Changelog runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Verify Changelog - id: verify_changelog - if: ${{ github.ref == 'refs/heads/master' || github.base_ref == 'master' }} - # base_ref for pull request check, ref for push - uses: SunshineStream/actions/verify_changelog@master - with: - token: ${{ secrets.GITHUB_TOKEN }} + - name: Checkout + uses: actions/checkout@v3 + + - name: Verify Changelog + id: verify_changelog + if: ${{ github.ref == 'refs/heads/master' || github.base_ref == 'master' }} + # base_ref for pull request check, ref for push + uses: SunshineStream/actions/verify_changelog@master + with: + token: ${{ secrets.GITHUB_TOKEN }} outputs: next_version: ${{ steps.verify_changelog.outputs.changelog_parser_version }} next_version_bare: ${{ steps.verify_changelog.outputs.changelog_parser_version_bare }} last_version: ${{ steps.verify_changelog.outputs.latest_release_tag_name }} - release_body: ${{ steps.verify_changelog.outputs.changelog_parser_description }} + release_body: ${{ steps.verify_changelog.outputs.changelog_parser_description }} check_versions: name: Check Versions runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v3 + - name: Checkout + uses: actions/checkout@v3 - - name: Check CMakeLists.txt Version - if: ${{ github.ref == 'refs/heads/master' || github.base_ref == 'master' }} - run: | - version=$(grep -o -E '^project\(Sunshine VERSION [0-9]+\.[0-9]+\.[0-9]+\)' CMakeLists.txt | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+') - echo "cmakelists_version=${version}" >> $GITHUB_ENV - - name: Compare CMakeList.txt Version - if: ${{ env.cmakelists_version != needs.check_changelog.outputs.next_version_bare }} - run: | - echo CMakeLists version: "$cmakelists_version" - echo Changelog version: "${{ needs.check_changelog.outputs.next_version_bare }}" - echo Within 'CMakeLists.txt' change "project(Sunshine VERSION $cmakelists_version)" to "project(Sunshine VERSION ${{ needs.check_changelog.outputs.next_version_bare }})" - exit 1 + - name: Check CMakeLists.txt Version + if: ${{ github.ref == 'refs/heads/master' || github.base_ref == 'master' }} + run: | + version=$(grep -o -E '^project\(Sunshine VERSION [0-9]+\.[0-9]+\.[0-9]+\)' CMakeLists.txt | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+') + echo "cmakelists_version=${version}" >> $GITHUB_ENV - build_linux: - name: Build Sunshine on Linux + - name: Compare CMakeList.txt Version + if: ${{ env.cmakelists_version != needs.check_changelog.outputs.next_version_bare }} + run: | + echo CMakeLists version: "$cmakelists_version" + echo Changelog version: "${{ needs.check_changelog.outputs.next_version_bare }}" + echo Within 'CMakeLists.txt' change "project(Sunshine VERSION $cmakelists_version)" to "project(Sunshine VERSION ${{ needs.check_changelog.outputs.next_version_bare }})" + exit 1 + + build_appimage: + name: AppImage runs-on: ubuntu-20.04 - needs: [check_versions, check_changelog] + needs: check_changelog + steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive - - name: Cache Sunshine build - uses: actions/cache@v2 - with: - path: build - key: ${{ runner.os }}-sunshine-build - - - name: Setup Dependencies + - name: Setup Dependencies AppImage run: | mkdir -p artifacts - sudo apt-get update -y && \ sudo apt-get --reinstall install -y \ git wget gcc-10 g++-10 build-essential cmake libssl-dev libavdevice-dev libboost-thread-dev libboost-filesystem-dev libboost-log-dev libpulse-dev libopus-dev libxtst-dev libx11-dev libxrandr-dev libxfixes-dev libevdev-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev libdrm-dev libcap-dev libwayland-dev @@ -82,146 +77,129 @@ jobs: sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y sudo apt-get install ffmpeg -y - - name: Build Sunshine + - name: Build AppImage run: | CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE:-Release}" SUNSHINE_EXECUTABLE_PATH="${SUNSHINE_EXECUTABLE_PATH:-/usr/bin/sunshine}" SUNSHINE_ASSETS_DIR="${SUNSHINE_ASSETS_DIR:-sunshine.AppImage.config}" - SUNSHINE_ENABLE_WAYLAND=${SUNSHINE_ENABLE_WAYLAND:-ON} SUNSHINE_ENABLE_X11=${SUNSHINE_ENABLE_X11:-ON} SUNSHINE_ENABLE_DRM=${SUNSHINE_ENABLE_DRM:-ON} SUNSHINE_ENABLE_CUDA=${SUNSHINE_ENABLE_CUDA:-ON} - - mkdir -p build - cd build - + mkdir -p appimage-build && cd appimage-build cmake "-DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE" "-DSUNSHINE_EXECUTABLE_PATH=$SUNSHINE_EXECUTABLE_PATH" "-DSUNSHINE_ASSETS_DIR=$SUNSHINE_ASSETS_DIR" "-DSUNSHINE_ENABLE_WAYLAND=$SUNSHINE_ENABLE_WAYLAND" "-DSUNSHINE_ENABLE_X11=$SUNSHINE_ENABLE_X11" "-DSUNSHINE_ENABLE_DRM=$SUNSHINE_ENABLE_DRM" "-DSUNSHINE_ENABLE_CUDA=$SUNSHINE_ENABLE_CUDA" "../" -DCMAKE_INSTALL_PREFIX=/usr make -j ${nproc} DESTDIR=AppDir - build_appimage: - name: AppImage - runs-on: ubuntu-20.04 - needs: build_linux - - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Cache Sunshine build - uses: actions/cache@v2 - with: - path: build - key: ${{ runner.os }}-sunshine-build - - - name: Set AppImage Version - if: ${{ needs.check_changelog.outputs.next_version_bare != needs.check_changelog.outputs.latest_version }} - run: | - version=${{ needs.check_changelog.outputs.next_version_bare }} - echo "VERSION=${version}" >> $GITHUB_ENV - - name: Package AppImage - # https://docs.appimage.org/packaging-guide/index.html - run: | - mkdir -p appimage_temp && cd appimage_temp - - DESKTOP_FILE="${DESKTOP_FILE:-sunshine.desktop}" - ICON_FILE="${ICON_FILE:-sunshine.png}" - CONFIG_DIR="${CONFIG_DIR:-sunshine/sunshine.AppImage.config/}" - HOME_DIR="${HOME_DIR:-sunshine/sunshine.AppImage.home/}" - - wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage && chmod +x linuxdeploy-x86_64.AppImage - - ./linuxdeploy-x86_64.AppImage --appdir ../AppDir -e ../build/sunshine -i "../$ICON_FILE" -d "../build/$DESKTOP_FILE" --output appimage + - name: Set AppImage Version + if: ${{ needs.check_changelog.outputs.next_version_bare != needs.check_changelog.outputs.latest_version }} + run: | + version=${{ needs.check_changelog.outputs.next_version_bare }} + echo "VERSION=${version}" >> $GITHUB_ENV + - name: Package AppImage + # https://docs.appimage.org/packaging-guide/index.html + run: | + mkdir -p appimage_temp && cd appimage_temp + DESKTOP_FILE="${DESKTOP_FILE:-sunshine.desktop}" + ICON_FILE="${ICON_FILE:-sunshine.png}" + CONFIG_DIR="${CONFIG_DIR:-sunshine/sunshine.AppImage.config/}" + HOME_DIR="${HOME_DIR:-sunshine/sunshine.AppImage.home/}" + wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage && chmod +x linuxdeploy-x86_64.AppImage + ./linuxdeploy-x86_64.AppImage --appdir ../AppDir -e ../appimage-build/sunshine -i "../$ICON_FILE" -d "../appimage-build/$DESKTOP_FILE" --output appimage + mv sunshine*.AppImage sunshine.AppImage + mkdir sunshine && mv sunshine.AppImage sunshine/ + ./sunshine/sunshine.AppImage --appimage-portable-config + ./sunshine/sunshine.AppImage --appimage-portable-home + cp -r ../assets/* "$CONFIG_DIR" + rm -f "$CONFIG_DIR"/apps_windows.json + mkdir -p ./"$HOME_DIR"/.config/"$CONFIG_DIR" + cp ./"$CONFIG_DIR"/apps_linux.json ./"$HOME_DIR"/.config/"$CONFIG_DIR" + zip -r ./sunshine-appimage.zip ./sunshine/* + mv sunshine-appimage.zip ../artifacts/ - mv sunshine*.AppImage sunshine.AppImage - mkdir sunshine && mv sunshine.AppImage sunshine/ - ./sunshine/sunshine.AppImage --appimage-portable-config - ./sunshine/sunshine.AppImage --appimage-portable-home - cp -r ../assets/* "$CONFIG_DIR" - rm -f "$CONFIG_DIR"/apps_windows.json - mkdir -p ./"$HOME_DIR"/.config/"$CONFIG_DIR" - cp ./"$CONFIG_DIR"/apps_linux.json ./"$HOME_DIR"/.config/"$CONFIG_DIR" - zip -r ./sunshine-appimage.zip ./sunshine/* + - name: Verify AppImage + run: | + cd appimage_temp + wget https://github.com/TheAssassin/appimagelint/releases/download/continuous/appimagelint-x86_64.AppImage && chmod +x appimagelint-x86_64.AppImage && ./appimagelint-x86_64.AppImage ./sunshine/sunshine.AppImage - mv sunshine-appimage.zip ../artifacts/ - - name: Verify AppImage - run: | - cd appimage_temp - wget https://github.com/TheAssassin/appimagelint/releases/download/continuous/appimagelint-x86_64.AppImage && chmod +x appimagelint-x86_64.AppImage && ./appimagelint-x86_64.AppImage ./sunshine/sunshine.AppImage - - name: Upload Artifacts - if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} - uses: actions/upload-artifact@v3 - with: - name: sunshine-appimage - 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 }} + - name: Upload Artifacts + if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} + uses: actions/upload-artifact@v3 + with: + name: sunshine-appimage + path: artifacts/ - build_deb_and_rpm: - name: Build DEB and RPM + build_linux: + name: Linux runs-on: ubuntu-20.04 - needs: build_linux + needs: check_changelog steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive - - name: Cache Sunshine build - uses: actions/cache@v2 - with: - path: build - key: ${{ runner.os }}-sunshine-build - - - name: Extra dependencies + - name: Setup Dependencies AppImage run: | + mkdir -p artifacts + sudo apt-get update -y && \ + sudo apt-get --reinstall install -y \ + git wget gcc-10 g++-10 build-essential cmake libssl-dev libavdevice-dev libboost-thread-dev libboost-filesystem-dev libboost-log-dev libpulse-dev libopus-dev libxtst-dev libx11-dev libxrandr-dev libxfixes-dev libevdev-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev libdrm-dev libcap-dev libwayland-dev + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 + sudo wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda_11.4.2_470.57.02_linux.run --progress=bar:force:noscroll -q --show-progress -O /root/cuda.run && sudo chmod a+x /root/cuda.run + sudo /root/cuda.run --silent --toolkit --toolkitpath=/usr --no-opengl-libs --no-man-page --no-drm && sudo rm /root/cuda.run + sudo add-apt-repository ppa:savoury1/graphics -y + sudo add-apt-repository ppa:savoury1/multimedia -y + sudo add-apt-repository ppa:savoury1/ffmpeg4 -y sudo apt-get update -y - sudo apt-get install -y cmake # will install cpack + sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y + sudo apt-get install ffmpeg -y - - name: Build DEB and RPM + - name: Build Sunshine + run: | + CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE:-Release}" + SUNSHINE_EXECUTABLE_PATH="${SUNSHINE_EXECUTABLE_PATH:-/usr/bin/sunshine}" + SUNSHINE_ENABLE_WAYLAND=${SUNSHINE_ENABLE_WAYLAND:-ON} + SUNSHINE_ENABLE_X11=${SUNSHINE_ENABLE_X11:-ON} + SUNSHINE_ENABLE_DRM=${SUNSHINE_ENABLE_DRM:-ON} + SUNSHINE_ENABLE_CUDA=${SUNSHINE_ENABLE_CUDA:-ON} + SUNSHINE_CONFIG_DIR=${SUNSHINE_CONFIG_DIR:-.} + + mkdir -p build + mkdir -p artifacts + + cd build + cmake "-DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE" "-DSUNSHINE_CONFIG_DIR=$SUNSHINE_CONFIG_DIR" "-DSUNSHINE_EXECUTABLE_PATH=$SUNSHINE_EXECUTABLE_PATH" "-DSUNSHINE_ASSETS_DIR=$SUNSHINE_ASSETS_DIR" "-DSUNSHINE_ENABLE_WAYLAND=$SUNSHINE_ENABLE_WAYLAND" "-DSUNSHINE_ENABLE_X11=$SUNSHINE_ENABLE_X11" "-DSUNSHINE_ENABLE_DRM=$SUNSHINE_ENABLE_DRM" "-DSUNSHINE_ENABLE_CUDA=$SUNSHINE_ENABLE_CUDA" "../" -DCMAKE_INSTALL_PREFIX=/usr + + - name: Build DEB run: | cd build cpack -G DEB + mv Sunshine__.deb ../artifacts/ + + - name: Build RPM + run: | + cd build cpack -G RPM - - name: Upload RPM - if: ${{ matrix.package == '-p' && ( github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' ) }} - uses: actions/upload-artifact@v3 - with: - name: sunshine-linux-rpm - path: build/Sunshine__.rpm - - name: Upload DEB + mv Sunshine__.rpm ../artifacts/ + + - name: Upload Artifacts if: ${{ matrix.package == '-p' && ( github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' ) }} uses: actions/upload-artifact@v3 with: - name: sunshine-linux-deb - path: build/Sunshine__.deb - - name: Create Release - if: ${{ matrix.package == '-p' && 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 }} + name: sunshine-linux + path: artifacts/ build_win: name: Windows runs-on: windows-2019 - needs: [check_versions, check_changelog] + needs: [ check_versions, check_changelog ] steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive + - name: MSYS2 Setup uses: msys2/setup-msys2@v2 with: @@ -242,46 +220,41 @@ jobs: nasm diffutils make + - name: Build Windows shell: msys2 {0} - run: | + run: | mkdir sunshine-windows-build cd sunshine-windows-build cmake -DCMAKE_BUILD_TYPE=Release -DSUNSHINE_ASSETS_DIR=assets -G "MinGW Makefiles" .. mingw32-make -j2 + - name: Create packages shell: msys2 {0} run: | cd sunshine-windows-build - cpack - + + cpack -G NSIS + cpack -G 7Z + mkdir -p ../artifacts # Installers mv Sunshine__.exe ../artifacts/sunshine-windows-installer.exe - - # Standalone - del ..\assets\apps_linux.json - 7z a sunshine-windows.zip ..\assets - 7z a sunshine-windows.zip sunshine.exe - 7z a sunshine-windows.zip tools\dxgi-info.exe - 7z a sunshine-windows.zip tools\audio-info.exe - 7z a sunshine-windows.zip tools\sunshinesvc.exe - 7z a sunshine-windows.zip ..\tools\install-service.bat - 7z a sunshine-windows.zip ..\tools\uninstall-service.bat - move "sunshine-windows.zip" "../artifacts" + mv Sunshine__.7z ../artifacts/sunshine-windows-standalone.7z + - name: Upload Sunshine Installer if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} uses: actions/upload-artifact@v3 with: name: sunshine-windows path: artifacts - - name: Upload Sunshine executable - if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} - uses: actions/upload-artifact@v3 - with: - name: sunshine-windows-standalone - path: sunshine-windows-build/artifacts/standalone + + release: + name: Create Release + runs-on: ubuntu-20.04 + needs: [ "build_win", "build_linux", "build_appimage" ] + steps: - name: Create Release if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} uses: SunshineStream/actions/create_release@master @@ -289,4 +262,4 @@ jobs: 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 }} + release_body: ${{ needs.check_changelog.outputs.release_body }} \ No newline at end of file From dc4393a583c4dc2bb28838b993c0383b56cd3d97 Mon Sep 17 00:00:00 2001 From: ABeltramo Date: Sat, 30 Apr 2022 10:02:26 +0100 Subject: [PATCH 10/12] CI: windows build packaging to ZIP, split artifacts upload for different packages --- .github/workflows/CI.yml | 44 ++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b85dfcd7408..f5cd2a6210b 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -53,7 +53,7 @@ jobs: build_appimage: name: AppImage runs-on: ubuntu-20.04 - needs: check_changelog + needs: [ check_versions, check_changelog ] steps: - name: Checkout @@ -61,7 +61,7 @@ jobs: with: submodules: recursive - - name: Setup Dependencies AppImage + - name: Setup Dependencies run: | mkdir -p artifacts sudo apt-get update -y && \ @@ -131,14 +131,14 @@ jobs: build_linux: name: Linux runs-on: ubuntu-20.04 - needs: check_changelog + needs: [ check_versions, check_changelog ] steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive - - name: Setup Dependencies AppImage + - name: Setup Dependencies run: | mkdir -p artifacts sudo apt-get update -y && \ @@ -174,20 +174,27 @@ jobs: run: | cd build cpack -G DEB - mv Sunshine__.deb ../artifacts/ + mv Sunshine__.deb ../artifacts/sunshine.deb - name: Build RPM run: | cd build cpack -G RPM - mv Sunshine__.rpm ../artifacts/ + mv Sunshine__.rpm ../artifacts/sunshine.rpm - - name: Upload Artifacts - if: ${{ matrix.package == '-p' && ( github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' ) }} + - name: Upload Sunshine DEB + if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} uses: actions/upload-artifact@v3 with: - name: sunshine-linux - path: artifacts/ + name: sunshine.deb + path: artifacts/sunshine.deb + + - name: Upload Sunshine RPM + if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} + uses: actions/upload-artifact@v3 + with: + name: sunshine.rpm + path: artifacts/sunshine.rpm build_win: name: Windows @@ -235,20 +242,27 @@ jobs: cd sunshine-windows-build cpack -G NSIS - cpack -G 7Z + cpack -G ZIP mkdir -p ../artifacts # Installers mv Sunshine__.exe ../artifacts/sunshine-windows-installer.exe - mv Sunshine__.7z ../artifacts/sunshine-windows-standalone.7z + mv Sunshine__.zip ../artifacts/sunshine-windows-standalone.zip + + - name: Upload Sunshine Windows Installer + if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} + uses: actions/upload-artifact@v3 + with: + name: sunshine-windows-installer + path: artifacts/sunshine-windows-installer.exe - - name: Upload Sunshine Installer + - name: Upload Sunshine Windows Standalone if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} uses: actions/upload-artifact@v3 with: - name: sunshine-windows - path: artifacts + name: sunshine-windows-installer + path: artifacts/sunshine-windows-standalone.zip release: name: Create Release From 31f7faa6a504cb284962240ec9ad070d3594bc54 Mon Sep 17 00:00:00 2001 From: ABeltramo Date: Sat, 30 Apr 2022 10:18:10 +0100 Subject: [PATCH 11/12] win: installation directory fix --- .github/workflows/CI.yml | 2 +- CMakeLists.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index f5cd2a6210b..160fff7fa14 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -261,7 +261,7 @@ jobs: if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} uses: actions/upload-artifact@v3 with: - name: sunshine-windows-installer + name: sunshine-windows-standalone path: artifacts/sunshine-windows-standalone.zip release: diff --git a/CMakeLists.txt b/CMakeLists.txt index f34a86b03ea..cfe45ecae9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -479,6 +479,7 @@ if(WIN32) # see options at: https://cmake.org/cmake/help/latest/cpack_gen/nsis.h set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\sunshine.ico") set(CPACK_NSIS_INSTALLED_ICON_NAME "${PROJECT__DIR}\\\\${PROJECT_EXE}") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "Sunshine") # The name of the directory that will be created in C:/Program files/ string(APPEND CPACK_NSIS_DEFINES "\n RequestExecutionLevel admin") # TODO: Not sure if this is needed but it took me a while to figure out where to put this option so I'm leaving it here # Sets permissions on the installed folder so that we can write in it From 2a69385aedbd1794c612d368aeff86186dddfd6a Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Sat, 30 Apr 2022 12:38:08 -0400 Subject: [PATCH 12/12] Revert workflow logic --- .github/workflows/CI.yml | 131 ++++++++++++++++++++------------------- 1 file changed, 68 insertions(+), 63 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 160fff7fa14..87a9d9fb48d 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -5,7 +5,7 @@ on: branches: [master, nightly] types: [opened, synchronize, reopened] push: - branches: [ master ] + branches: [master] workflow_dispatch: jobs: @@ -32,12 +32,14 @@ jobs: check_versions: name: Check Versions runs-on: ubuntu-latest + needs: check_changelog + if: ${{ github.ref == 'refs/heads/master' || github.base_ref == 'master' }} + # base_ref for pull request check, ref for push steps: - name: Checkout uses: actions/checkout@v3 - name: Check CMakeLists.txt Version - if: ${{ github.ref == 'refs/heads/master' || github.base_ref == 'master' }} run: | version=$(grep -o -E '^project\(Sunshine VERSION [0-9]+\.[0-9]+\.[0-9]+\)' CMakeLists.txt | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+') echo "cmakelists_version=${version}" >> $GITHUB_ENV @@ -53,17 +55,15 @@ jobs: build_appimage: name: AppImage runs-on: ubuntu-20.04 - needs: [ check_versions, check_changelog ] - + needs: check_changelog steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive - - name: Setup Dependencies + - name: Setup Dependencies AppImage run: | - mkdir -p artifacts sudo apt-get update -y && \ sudo apt-get --reinstall install -y \ git wget gcc-10 g++-10 build-essential cmake libssl-dev libavdevice-dev libboost-thread-dev libboost-filesystem-dev libboost-log-dev libpulse-dev libopus-dev libxtst-dev libx11-dev libxrandr-dev libxfixes-dev libevdev-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev libdrm-dev libcap-dev libwayland-dev @@ -82,11 +82,14 @@ jobs: CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE:-Release}" SUNSHINE_EXECUTABLE_PATH="${SUNSHINE_EXECUTABLE_PATH:-/usr/bin/sunshine}" SUNSHINE_ASSETS_DIR="${SUNSHINE_ASSETS_DIR:-sunshine.AppImage.config}" + SUNSHINE_ENABLE_WAYLAND=${SUNSHINE_ENABLE_WAYLAND:-ON} SUNSHINE_ENABLE_X11=${SUNSHINE_ENABLE_X11:-ON} SUNSHINE_ENABLE_DRM=${SUNSHINE_ENABLE_DRM:-ON} SUNSHINE_ENABLE_CUDA=${SUNSHINE_ENABLE_CUDA:-ON} + mkdir -p appimage-build && cd appimage-build + cmake "-DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE" "-DSUNSHINE_EXECUTABLE_PATH=$SUNSHINE_EXECUTABLE_PATH" "-DSUNSHINE_ASSETS_DIR=$SUNSHINE_ASSETS_DIR" "-DSUNSHINE_ENABLE_WAYLAND=$SUNSHINE_ENABLE_WAYLAND" "-DSUNSHINE_ENABLE_X11=$SUNSHINE_ENABLE_X11" "-DSUNSHINE_ENABLE_DRM=$SUNSHINE_ENABLE_DRM" "-DSUNSHINE_ENABLE_CUDA=$SUNSHINE_ENABLE_CUDA" "../" -DCMAKE_INSTALL_PREFIX=/usr make -j ${nproc} DESTDIR=AppDir @@ -95,16 +98,21 @@ jobs: run: | version=${{ needs.check_changelog.outputs.next_version_bare }} echo "VERSION=${version}" >> $GITHUB_ENV + - name: Package AppImage # https://docs.appimage.org/packaging-guide/index.html run: | mkdir -p appimage_temp && cd appimage_temp + DESKTOP_FILE="${DESKTOP_FILE:-sunshine.desktop}" ICON_FILE="${ICON_FILE:-sunshine.png}" CONFIG_DIR="${CONFIG_DIR:-sunshine/sunshine.AppImage.config/}" HOME_DIR="${HOME_DIR:-sunshine/sunshine.AppImage.home/}" + wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage && chmod +x linuxdeploy-x86_64.AppImage + ./linuxdeploy-x86_64.AppImage --appdir ../AppDir -e ../appimage-build/sunshine -i "../$ICON_FILE" -d "../appimage-build/$DESKTOP_FILE" --output appimage + mv sunshine*.AppImage sunshine.AppImage mkdir sunshine && mv sunshine.AppImage sunshine/ ./sunshine/sunshine.AppImage --appimage-portable-config @@ -114,6 +122,8 @@ jobs: mkdir -p ./"$HOME_DIR"/.config/"$CONFIG_DIR" cp ./"$CONFIG_DIR"/apps_linux.json ./"$HOME_DIR"/.config/"$CONFIG_DIR" zip -r ./sunshine-appimage.zip ./sunshine/* + + mkdir -p artifacts mv sunshine-appimage.zip ../artifacts/ - name: Verify AppImage @@ -128,17 +138,25 @@ jobs: name: sunshine-appimage 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 - needs: [ check_versions, check_changelog ] + needs: check_changelog steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive - - - name: Setup Dependencies + - name: Setup Dependencies Linux run: | mkdir -p artifacts sudo apt-get update -y && \ @@ -154,7 +172,7 @@ jobs: sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y sudo apt-get install ffmpeg -y - - name: Build Sunshine + - name: Build Linux run: | CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE:-Release}" SUNSHINE_EXECUTABLE_PATH="${SUNSHINE_EXECUTABLE_PATH:-/usr/bin/sunshine}" @@ -170,36 +188,37 @@ jobs: cd build cmake "-DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE" "-DSUNSHINE_CONFIG_DIR=$SUNSHINE_CONFIG_DIR" "-DSUNSHINE_EXECUTABLE_PATH=$SUNSHINE_EXECUTABLE_PATH" "-DSUNSHINE_ASSETS_DIR=$SUNSHINE_ASSETS_DIR" "-DSUNSHINE_ENABLE_WAYLAND=$SUNSHINE_ENABLE_WAYLAND" "-DSUNSHINE_ENABLE_X11=$SUNSHINE_ENABLE_X11" "-DSUNSHINE_ENABLE_DRM=$SUNSHINE_ENABLE_DRM" "-DSUNSHINE_ENABLE_CUDA=$SUNSHINE_ENABLE_CUDA" "../" -DCMAKE_INSTALL_PREFIX=/usr - - name: Build DEB + - name: Package Linux run: | cd build - cpack -G DEB - mv Sunshine__.deb ../artifacts/sunshine.deb - - name: Build RPM - run: | - cd build + # package + cpack -G DEB cpack -G RPM + + # move + mv Sunshine__.deb ../artifacts/sunshine.deb mv Sunshine__.rpm ../artifacts/sunshine.rpm - - name: Upload Sunshine DEB - if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} + - name: Upload Artifacts + if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} uses: actions/upload-artifact@v3 with: - name: sunshine.deb - path: artifacts/sunshine.deb - - - name: Upload Sunshine RPM - if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} - uses: actions/upload-artifact@v3 + name: sunshine-linux + path: artifacts/ + - name: Create Release + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + uses: SunshineStream/actions/create_release@master with: - name: sunshine.rpm - path: artifacts/sunshine.rpm + 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_win: name: Windows runs-on: windows-2019 - needs: [ check_versions, check_changelog ] + needs: check_changelog steps: - name: Checkout @@ -207,68 +226,54 @@ jobs: with: submodules: recursive - - name: MSYS2 Setup + - name: Setup Dependencies Windows uses: msys2/setup-msys2@v2 with: update: true install: >- base-devel + diffutils git + make mingw-w64-x86_64-binutils - mingw-w64-x86_64-openssl + mingw-w64-x86_64-boost mingw-w64-x86_64-cmake + mingw-w64-x86_64-nsis + mingw-w64-x86_64-openssl + mingw-w64-x86_64-opus mingw-w64-x86_64-toolchain - mingw-w64-x86_64-opus mingw-w64-x86_64-x265 - mingw-w64-x86_64-boost - mingw-w64-x86_64-nsis - git - yasm - nasm - diffutils - make + nasm + yasm - name: Build Windows shell: msys2 {0} run: | - mkdir sunshine-windows-build - cd sunshine-windows-build + mkdir build + cd build cmake -DCMAKE_BUILD_TYPE=Release -DSUNSHINE_ASSETS_DIR=assets -G "MinGW Makefiles" .. mingw32-make -j2 - - - name: Create packages + - name: Package Windows shell: msys2 {0} run: | - cd sunshine-windows-build - + mkdir -p artifacts + cd build + + # package cpack -G NSIS cpack -G ZIP - - mkdir -p ../artifacts - - # Installers + + # move mv Sunshine__.exe ../artifacts/sunshine-windows-installer.exe mv Sunshine__.zip ../artifacts/sunshine-windows-standalone.zip - - name: Upload Sunshine Windows Installer - if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} - uses: actions/upload-artifact@v3 - with: - name: sunshine-windows-installer - path: artifacts/sunshine-windows-installer.exe - - - name: Upload Sunshine Windows Standalone + - name: Upload Artifacts if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} uses: actions/upload-artifact@v3 with: - name: sunshine-windows-standalone - path: artifacts/sunshine-windows-standalone.zip + name: sunshine-windows + path: artifacts/ - release: - name: Create Release - runs-on: ubuntu-20.04 - needs: [ "build_win", "build_linux", "build_appimage" ] - steps: - name: Create Release if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} uses: SunshineStream/actions/create_release@master @@ -276,4 +281,4 @@ jobs: 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 }} \ No newline at end of file + release_body: ${{ needs.check_changelog.outputs.release_body }}