diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index 6a9f46ae861..eb567d0b631 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -236,6 +236,11 @@ jobs: # Clean up Remove-Item -Path doxygen-setup.exe + - name: Setup dotnet # needed for wix + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '9.x' + - name: Setup python id: setup-python uses: actions/setup-python@v6 @@ -284,12 +289,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 /d/a/Sunshine/Sunshine/build/cpack_artifacts/_CPack_Packages/win64/WIX/wix.log + - name: Run tests id: test shell: msys2 {0} diff --git a/cmake/packaging/windows_wix.cmake b/cmake/packaging/windows_wix.cmake index bc956182f06..47b179e8e38 100644 --- a/cmake/packaging/windows_wix.cmake +++ b/cmake/packaging/windows_wix.cmake @@ -1,4 +1,72 @@ # WIX Packaging # see options at: https://cmake.org/cmake/help/latest/cpack_gen/wix.html -# TODO: Replace nsis with wix +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 "${CPACK_PACKAGE_DIRECTORY}/_CPack_Packages/win64") +set(WIX_BUILD_DIRECTORY "${WIX_BUILD_PARENT_DIRECTORY}/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}) + +# find dotnet +find_program(DOTNET_EXECUTABLE dotnet REQUIRED HINTS "C:/Program Files/dotnet") + +# 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() + +# Set WiX-specific variables +set(CPACK_WIX_ROOT "${WIX_TOOL_PATH}") +set(CPACK_WIX_UPGRADE_GUID "512A3D1B-BE16-401B-A0D1-59BBA3942FB8") + +# Help/Support URLs +set(CPACK_WIX_HELP_LINK "https://docs.lizardbyte.dev/projects/sunshine/latest/md_docs_2getting__started.html") +set(CPACK_WIX_PRODUCT_URL "${CMAKE_PROJECT_HOMEPAGE_URL}") +set(CPACK_WIX_PROGRAM_MENU_FOLDER "LizardByte") + +set(CPACK_WIX_EXTENSIONS + "WixToolset.UI.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}/custom-actions.wxs" + "${WIX_BUILD_PARENT_DIRECTORY}/custom-shortcuts.wxs" +) + +# 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 +set(CPACK_WIX_ARCHITECTURE "x64") diff --git a/cmake/packaging/wix_resources/custom-actions.wxs b/cmake/packaging/wix_resources/custom-actions.wxs new file mode 100644 index 00000000000..fc3ee705b71 --- /dev/null +++ b/cmake/packaging/wix_resources/custom-actions.wxs @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cmake/packaging/wix_resources/custom-shortcuts.wxs b/cmake/packaging/wix_resources/custom-shortcuts.wxs new file mode 100644 index 00000000000..62d0df98b7c --- /dev/null +++ b/cmake/packaging/wix_resources/custom-shortcuts.wxs @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/cmake/prep/build_version.cmake b/cmake/prep/build_version.cmake index 030e93c4a58..602c040844f 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 5a176622761..883117b4362 100644 --- a/docs/building.md +++ b/docs/building.md @@ -149,9 +149,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 ```}