Files
jellyfin-desktop/CMakeModules/WindowsInstaller.cmake
T
iZack 52d5067676 Working 2.0.0 build for Windows
It is really late so I'm calling it here. I wanted to put this out for relevant people to get eyes on, in order to aid in getting the Windows build of v2.0.0 out. Apologies in advance for not following any contrib guidelines or there being messes.  I'm leaving in the build scripts I used for now. The build scripts still contain a few hardcoded visual studio related values for now.  At the moment when I run the app on a different machine to the dev VM I'm using the qt web view doesn't seem to be rendering.

summary of where this is at:
the whole thing builds
works on my Windows 11 virtual machine

short summary of what I did:

A couple of qt6 updates specific to windows were addressed.

Some build system issues were addressed

did some minor refactoring to sieve out binary build dependencies from generated build files since its a lot easier when you can just delete the build folder to run a clean build
2025-12-19 01:43:38 -08:00

161 lines
5.2 KiB
CMake

find_program(WIX_HEAT heat)
find_program(WIX_CANDLE candle)
find_program(WIX_LIGHT light)
find_program(WIX_INSIGNIA insignia)
get_filename_component(WIX_BIN_DIR ${WIX_CANDLE} DIRECTORY)
configure_file(${PROJECT_SOURCE_DIR}/bundle/win/Version.wxi.in Version.wxi)
set(WIX_VARIABLES -dDeploymentPath="${CMAKE_INSTALL_PREFIX}" -dOutputPath="${CMAKE_INSTALL_PREFIX}" -dBuildPath="${CMAKE_BINARY_DIR}")
include(CMakeParseArguments)
function(wix_harvest_directory dir fragment)
set(ARGS REFVARIABLE CGROUP DEPENDS)
cmake_parse_arguments(_WHD "" "${ARGS}" "" ${ARGN})
if(NOT _WHD_REFVARIABLE)
set(_WHD_REFVARIABLE INSTALLLOCATION)
endif()
if(_WHD_CGROUP)
set(CGROUP -cg ${_WHD_CGROUP})
endif()
add_custom_command(OUTPUT ${fragment}
DEPENDS ${_WHD_DEPENDS}
COMMAND ${WIX_HEAT} dir "${dir}" -srd -nologo -sw5150 ${CGROUP} -dr ${_WHD_REFVARIABLE} -ag -out ${fragment} -var var.DeploymentPath
COMMENT "Harvesting dir ${dir} to ${fragment}")
add_custom_target(heat_${fragment} DEPENDS ${fragment})
endfunction()
function(wix_get_extension VARIABLE)
foreach(f ${ARGN})
find_file(${f}_PATH ${f}.dll PATHS ${WIX_BIN_DIR})
set(EXTS ${EXTS} -ext ${${f}_PATH})
endforeach()
set(${VARIABLE} ${EXTS} PARENT_SCOPE)
endfunction()
function(wix_candle wsxfile)
set(ARGS OUTPUT ARCH)
set(MARGS EXTENSIONS)
cmake_parse_arguments(_WC "" "${ARGS}" "${MARGS}" ${ARGN})
if(NOT _WC_OUTPUT)
get_filename_component(WC_BASENAME ${wsxfile} NAME_WE)
set(_WC_OUTPUT ${WC_BASENAME}.wixobj)
endif()
if(NOT _WC_ARCH)
set(_WC_ARCH x64)
endif()
if(_WC_EXTENSIONS)
wix_get_extension(WIX_EXTENSIONS ${_WC_EXTENSIONS})
endif()
add_custom_command(OUTPUT ${_WC_OUTPUT}
DEPENDS ${wsxfile}
COMMAND ${WIX_CANDLE} -nologo ${WIX_VARIABLES} -I${CMAKE_CURRENT_BINARY_DIR} -arch ${_WC_ARCH} ${wsxfile} ${WIX_EXTENSIONS} -out ${_WC_OUTPUT}
COMMENT "Candle file ${_WC_OUTPUT}"
)
endfunction()
function(wix_light)
set(MARGS OBJS DEPENDS EXTENSIONS)
set(ARGS OUTPUT BASEDIR TARGET)
cmake_parse_arguments(_WL "" "${ARGS}" "${MARGS}" ${ARGN})
if(NOT _WL_OUTPUT)
message(FATAL_ERROR "Need OUTPUT")
endif()
if(_WL_EXTENSIONS)
wix_get_extension(WIX_EXTENSIONS ${_WL_EXTENSIONS})
endif()
if(_WL_BASEDIR)
set(_WL_BASEDIR -b ${_WL_BASEDIR})
endif()
if(NOT _WL_TARGET)
set(_WL_TARGET wix_${_WL_OUTPUT})
endif()
add_custom_command(OUTPUT ${_WL_OUTPUT}
DEPENDS ${_WL_OBJS} ${_WL_DEPENDS}
COMMAND ${WIX_LIGHT} -nologo ${_WL_BASEDIR} ${_WL_OBJS} ${WIX_VARIABLES} ${WIX_EXTENSIONS} -out ${_WL_OUTPUT}
COMMENT "Light it up: ${_WL_OUTPUT}")
add_custom_target(${_WL_TARGET} DEPENDS ${_WL_OUTPUT})
if(CODE_SIGN)
if(_WL_OUTPUT MATCHES ".*exe")
add_custom_command(TARGET ${_WL_TARGET} POST_BUILD
COMMAND ${WIX_INSIGNIA} -ib ${_WL_OUTPUT} -o engine.exe
COMMAND ${CMAKE_SOURCE_DIR}/bundle/win/WindowsSign.cmd engine.exe
COMMAND ${WIX_INSIGNIA} -ab engine.exe ${_WL_OUTPUT} -o ${_WL_OUTPUT}
COMMENT "Doing insignia dance"
)
endif()
add_custom_command(TARGET ${_WL_TARGET} POST_BUILD
COMMAND ${CMAKE_SOURCE_DIR}/bundle/win/WindowsSign.cmd ${_WL_OUTPUT}
COMMENT Signing ${_WL_OUTPUT}
)
endif()
endfunction()
function(wix_create_installer output)
set(MARGS WXS_FILES EXTENSIONS DEPENDS)
set(ARGS ARCH BASEDIR TARGET)
cmake_parse_arguments(_WCI "" "${ARGS}" "${MARGS}" ${ARGN})
foreach(wxs ${_WCI_WXS_FILES})
get_filename_component(WXSBASE ${wxs} NAME_WE)
wix_candle(${wxs} OUTPUT ${WXSBASE}.wixobj EXTENSIONS ${_WCI_EXTENSIONS} ARCH ${_WCI_ARCH})
list(APPEND WIXOBJS ${WXSBASE}.wixobj)
endforeach()
wix_light(OBJS ${WIXOBJS}
EXTENSIONS ${_WCI_EXTENSIONS}
OUTPUT ${output}
DEPENDS ${_WCI_DEPENDS}
BASEDIR ${_WCI_BASEDIR}
TARGET ${_WCI_TARGET})
endfunction()
add_custom_target(wix_install
COMMAND ${CMAKE_COMMAND} -P cmake_install.cmake
COMMENT "Copying files..."
DEPENDS JellyfinDesktop)
wix_harvest_directory("${CMAKE_INSTALL_PREFIX}" files.wxs CGROUP ProgramFilesComponentGroup DEPENDS wix_install)
wix_create_installer(PMP.msi
WXS_FILES files.wxs "${PROJECT_SOURCE_DIR}/bundle/win/JMP.wxs"
EXTENSIONS WixUtilExtension WixFirewallExtension
BASEDIR "${PROJECT_SOURCE_DIR}/bundle/win"
)
if (CMAKE_SIZEOF_VOID_P MATCHES 8)
set(INSTALLER_ARCH_STR windows-x64)
else()
set(INSTALLER_ARCH_STR windows-x86)
endif()
wix_create_installer(JellyfinDesktop-${VERSION_STRING}-${INSTALLER_ARCH_STR}.exe
TARGET JellyfinDesktopInstaller
WXS_FILES "${PROJECT_SOURCE_DIR}/bundle/win/Bundle.wxs"
EXTENSIONS WixUtilExtension WixBalExtension
DEPENDS wix_PMP.msi
BASEDIR "${PROJECT_SOURCE_DIR}/bundle/win"
)
add_custom_target(windows_package DEPENDS JellyfinDesktopInstaller)