diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index e869692a451..1a40066db37 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -129,6 +129,11 @@ jobs: # Clean up Remove-Item -Path doxygen-setup.exe + - name: Setup dotnet # needed for wix + uses: actions/setup-dotnet@baa11fbfe1d6520db94683bd5c7a3818018e4309 # v5.1.0 + with: + dotnet-version: '10.x' + - name: Setup python id: setup-python uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 @@ -176,12 +181,19 @@ jobs: # package cpack -G NSIS + cpack -G WIX cpack -G ZIP # move mv ./cpack_artifacts/Sunshine.exe ../artifacts/Sunshine-${{ matrix.name }}-installer.exe + mv ./cpack_artifacts/Sunshine.msi ../artifacts/Sunshine-${{ matrix.name }}-installer.msi mv ./cpack_artifacts/Sunshine.zip ../artifacts/Sunshine-${{ matrix.name }}-portable.zip + - name: Debug wix + if: always() + shell: msys2 {0} + run: cat ./build/cpack_artifacts/_CPack_Packages/win64/WIX/wix.log || true + - name: Run tests id: test shell: msys2 {0} diff --git a/cmake/packaging/windows_wix.cmake b/cmake/packaging/windows_wix.cmake index bc956182f06..4a2f4d031c2 100644 --- a/cmake/packaging/windows_wix.cmake +++ b/cmake/packaging/windows_wix.cmake @@ -1,4 +1,97 @@ # WIX Packaging # see options at: https://cmake.org/cmake/help/latest/cpack_gen/wix.html -# TODO: Replace nsis with wix +# find dotnet +find_program(DOTNET_EXECUTABLE dotnet HINTS "C:/Program Files/dotnet") + +if(NOT DOTNET_EXECUTABLE) + message(WARNING "Dotnet executable not found, skipping WiX packaging.") + return() +endif() + +set(CPACK_WIX_VERSION 4) +set(WIX_VERSION 4.0.4) +set(WIX_UI_VERSION 4.0.4) # extension versioning is independent of the WiX version +set(WIX_BUILD_PARENT_DIRECTORY "${CMAKE_BINARY_DIR}/wix_packaging") +set(WIX_BUILD_DIRECTORY "${CPACK_PACKAGE_DIRECTORY}/_CPack_Packages/win64/WIX") + +# Download and install WiX tools locally in the build directory +set(WIX_TOOL_PATH "${CMAKE_BINARY_DIR}/.wix") +file(MAKE_DIRECTORY ${WIX_TOOL_PATH}) + +# Install WiX locally using dotnet +execute_process( + COMMAND ${DOTNET_EXECUTABLE} tool install --tool-path ${WIX_TOOL_PATH} wix --version ${WIX_VERSION} + ERROR_VARIABLE WIX_INSTALL_OUTPUT + RESULT_VARIABLE WIX_INSTALL_RESULT +) + +if(NOT WIX_INSTALL_RESULT EQUAL 0) + message(FATAL_ERROR "Failed to install WiX tools locally. + WiX packaging may not work correctly, error: ${WIX_INSTALL_OUTPUT}") +endif() + +# Install WiX UI Extension +execute_process( + COMMAND "${WIX_TOOL_PATH}/wix" extension add WixToolset.UI.wixext/${WIX_UI_VERSION} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ERROR_VARIABLE WIX_UI_INSTALL_OUTPUT + RESULT_VARIABLE WIX_UI_INSTALL_RESULT +) + +if(NOT WIX_UI_INSTALL_RESULT EQUAL 0) + message(FATAL_ERROR "Failed to install WiX UI extension, error: ${WIX_UI_INSTALL_OUTPUT}") +endif() + +# Install WiX Util Extension +execute_process( + COMMAND "${WIX_TOOL_PATH}/wix" extension add WixToolset.Util.wixext/${WIX_UI_VERSION} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ERROR_VARIABLE WIX_UTIL_INSTALL_OUTPUT + RESULT_VARIABLE WIX_UTIL_INSTALL_RESULT +) + +if(NOT WIX_UTIL_INSTALL_RESULT EQUAL 0) + message(FATAL_ERROR "Failed to install WiX Util extension, error: ${WIX_UTIL_INSTALL_OUTPUT}") +endif() + +# Set WiX-specific variables +set(CPACK_WIX_ROOT "${WIX_TOOL_PATH}") +set(CPACK_WIX_UPGRADE_GUID "512A3D1B-BE16-401B-A0D1-59BBA3942FB8") + +# Installer metadata +set(CPACK_WIX_HELP_LINK "https://docs.lizardbyte.dev/projects/sunshine/latest/md_docs_2getting__started.html") +set(CPACK_WIX_PRODUCT_ICON "${SUNSHINE_ICON_PATH}") +set(CPACK_WIX_PRODUCT_URL "${CMAKE_PROJECT_HOMEPAGE_URL}") +set(CPACK_WIX_PROGRAM_MENU_FOLDER "LizardByte") + +set(CPACK_WIX_EXTENSIONS + "WixToolset.UI.wixext" + "WixToolset.Util.wixext" +) + +message(STATUS "cpack package directory: ${CPACK_PACKAGE_DIRECTORY}") + +# copy custom wxs files to the build directory +file(COPY "${CMAKE_CURRENT_LIST_DIR}/wix_resources/" + DESTINATION "${WIX_BUILD_PARENT_DIRECTORY}/") + +set(CPACK_WIX_EXTRA_SOURCES + "${WIX_BUILD_PARENT_DIRECTORY}/sunshine-installer.wxs" +) +set(CPACK_WIX_PATCH_FILE + "${WIX_BUILD_PARENT_DIRECTORY}/patch.xml" +) + +# Copy root LICENSE and rename to have .txt extension +file(COPY "${CMAKE_SOURCE_DIR}/LICENSE" + DESTINATION "${CMAKE_BINARY_DIR}") +file(RENAME "${CMAKE_BINARY_DIR}/LICENSE" "${CMAKE_BINARY_DIR}/LICENSE.txt") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_BINARY_DIR}/LICENSE.txt") # cpack will covert this to an RTF if it is txt + +# https://cmake.org/cmake/help/latest/cpack_gen/wix.html#variable:CPACK_WIX_ARCHITECTURE +if(CMAKE_SYSTEM_PROCESSOR MATCHES "ARM64") + set(CPACK_WIX_ARCHITECTURE "arm64") +else() + set(CPACK_WIX_ARCHITECTURE "x64") +endif() diff --git a/cmake/packaging/wix_resources/patch.xml b/cmake/packaging/wix_resources/patch.xml new file mode 100644 index 00000000000..e85c3581dee --- /dev/null +++ b/cmake/packaging/wix_resources/patch.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/cmake/packaging/wix_resources/sunshine-installer.wxs b/cmake/packaging/wix_resources/sunshine-installer.wxs new file mode 100644 index 00000000000..36f92969b74 --- /dev/null +++ b/cmake/packaging/wix_resources/sunshine-installer.wxs @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cmake/prep/build_version.cmake b/cmake/prep/build_version.cmake index 7c10dde2414..91209922066 100644 --- a/cmake/prep/build_version.cmake +++ b/cmake/prep/build_version.cmake @@ -56,11 +56,11 @@ else() if(NOT GIT_DESCRIBE_ERROR_CODE) MESSAGE("Sunshine Branch: ${GIT_DESCRIBE_BRANCH}") if(NOT GIT_DESCRIBE_BRANCH STREQUAL "master") - set(PROJECT_VERSION ${PROJECT_VERSION}.${GIT_DESCRIBE_VERSION}) + set(PROJECT_VERSION ${PROJECT_VERSION}-${GIT_DESCRIBE_VERSION}) MESSAGE("Sunshine Version: ${GIT_DESCRIBE_VERSION}") endif() if(GIT_IS_DIRTY) - set(PROJECT_VERSION ${PROJECT_VERSION}.dirty) + set(PROJECT_VERSION ${PROJECT_VERSION}-dirty) MESSAGE("Git tree is dirty!") endif() else() diff --git a/docs/building.md b/docs/building.md index 67b2066cd49..b3474758e0e 100644 --- a/docs/building.md +++ b/docs/building.md @@ -156,6 +156,8 @@ dependencies=( pacman -S "${dependencies[@]}" ``` +To create a WiX installer, you also need to install [.NET](https://dotnet.microsoft.com/download). + ### Clone Ensure [git](https://git-scm.com) is installed on your system, then clone the repository using the following command: @@ -198,9 +200,12 @@ ninja -C build ```} }} @tab{Windows | @tabs{ - @tab{Installer | ```bash + @tab{NSIS Installer | ```bash cpack -G NSIS --config ./build/CPackConfig.cmake ```} + @tab{WiX Installer | ```bash + cpack -G WIX --config ./build/CPackConfig.cmake + ```} @tab{Portable | ```bash cpack -G ZIP --config ./build/CPackConfig.cmake ```} diff --git a/docs/getting_started.md b/docs/getting_started.md index 9872ed4507e..d69a309c4d0 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -331,7 +331,12 @@ brew uninstall sunshine #### Installer (recommended) +> [!CAUTION] +> The msi installer is preferred moving forward. Before using a different type of installer, you should manually +> uninstall the previous installation. + 1. Download and install + [Sunshine-Windows-AMD64-installer.msi](https://github.com/LizardByte/Sunshine/releases/latest/download/Sunshine-Windows-AMD64-installer.msi) [Sunshine-Windows-AMD64-installer.exe](https://github.com/LizardByte/Sunshine/releases/latest/download/Sunshine-Windows-AMD64-installer.exe) > [!TIP] @@ -339,6 +344,7 @@ brew uninstall sunshine > | File | log paths | > | ---- | --------- | > | .exe | `%%PROGRAMFILES%/Sunshine/install.log`
`%%TEMP%/Sunshine/logs/install/` | +> | .msi | `%%TEMP%/Sunshine/logs/install/` | > [!CAUTION] > You should carefully select or unselect the options you want to install. Do not blindly install or