WindowsInstaller.cmake 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. find_program(WIX_HEAT heat)
  2. find_program(WIX_CANDLE candle)
  3. find_program(WIX_LIGHT light)
  4. get_filename_component(WIX_BIN_DIR ${WIX_CANDLE} DIRECTORY)
  5. configure_file(${PROJECT_SOURCE_DIR}/bundle/win/Version.wxi.in Version.wxi)
  6. set(WIX_VARIABLES -dDeploymentPath="${CMAKE_INSTALL_PREFIX}" -dOutputPath="${CMAKE_BINARY_DIR}")
  7. include(CMakeParseArguments)
  8. function(wix_harvest_directory dir fragment)
  9. set(ARGS REFVARIABLE CGROUP)
  10. cmake_parse_arguments(_WHD "" "${ARGS}" "" ${ARGN})
  11. if(NOT _WHD_REFVARIABLE)
  12. set(_WHD_REFVARIABLE INSTALLLOCATION)
  13. endif()
  14. if(_WHD_CGROUP)
  15. set(CGROUP -cg ${_WHD_CGROUP})
  16. endif()
  17. if(IS_DIRECTORY ${dir})
  18. add_custom_command(OUTPUT ${fragment}
  19. COMMAND ${WIX_HEAT} dir "${dir}" -srd -nologo -sw5150 ${CGROUP} -dr ${_WHD_REFVARIABLE} -ag -out ${fragment} -var var.DeploymentPath
  20. COMMENT "Harvesting dir ${dir} to ${fragment}")
  21. endif()
  22. endfunction()
  23. function(wix_get_extension VARIABLE)
  24. foreach(f ${ARGN})
  25. find_file(${f}_PATH ${f}.dll PATHS ${WIX_BIN_DIR})
  26. set(EXTS ${EXTS} -ext ${${f}_PATH})
  27. endforeach()
  28. set(${VARIABLE} ${EXTS} PARENT_SCOPE)
  29. endfunction()
  30. function(wix_candle wsxfile)
  31. set(ARGS OUTPUT ARCH)
  32. set(MARGS EXTENSIONS)
  33. cmake_parse_arguments(_WC "" "${ARGS}" "${MARGS}" ${ARGN})
  34. if(NOT _WC_OUTPUT)
  35. get_filename_component(WC_BASENAME ${wsxfile} NAME_WE)
  36. set(_WC_OUTPUT ${WC_BASENAME}.wixobj)
  37. endif()
  38. if(NOT _WC_ARCH)
  39. set(_WC_ARCH x64)
  40. endif()
  41. if(_WC_EXTENSIONS)
  42. wix_get_extension(WIX_EXTENSIONS ${_WC_EXTENSIONS})
  43. endif()
  44. add_custom_command(OUTPUT ${_WC_OUTPUT}
  45. DEPENDS ${wsxfile}
  46. COMMAND ${WIX_CANDLE} -nologo ${WIX_VARIABLES} -I${CMAKE_CURRENT_BINARY_DIR} -arch ${_WC_ARCH} ${wsxfile} ${WIX_EXTENSIONS} -out ${_WC_OUTPUT}
  47. COMMENT "Candle file ${_WC_OUTPUT}"
  48. )
  49. endfunction()
  50. function(wix_light)
  51. set(MARGS OBJS DEPENDS EXTENSIONS)
  52. set(ARGS OUTPUT BASEDIR TARGET)
  53. cmake_parse_arguments(_WL "" "${ARGS}" "${MARGS}" ${ARGN})
  54. if(NOT _WL_OUTPUT)
  55. message(FATAL_ERROR "Need OUTPUT")
  56. endif()
  57. if(_WL_EXTENSIONS)
  58. wix_get_extension(WIX_EXTENSIONS ${_WL_EXTENSIONS})
  59. endif()
  60. if(_WL_BASEDIR)
  61. set(_WL_BASEDIR -b ${_WL_BASEDIR})
  62. endif()
  63. if(NOT _WL_TARGET)
  64. set(_WL_TARGET wix_${_WL_OUTPUT})
  65. endif()
  66. add_custom_command(OUTPUT ${_WL_OUTPUT}
  67. DEPENDS ${_WL_OBJS} ${_WL_DEPENDS}
  68. COMMAND ${WIX_LIGHT} -nologo ${_WL_BASEDIR} ${_WL_OBJS} ${WIX_VARIABLES} ${WIX_EXTENSIONS} -out ${_WL_OUTPUT}
  69. COMMENT "Light it up: ${_WL_OUTPUT}")
  70. add_custom_target(${_WL_TARGET} DEPENDS ${_WL_OUTPUT})
  71. if(CODE_SIGN)
  72. add_custom_command(TARGET ${_WL_TARGET} POST_BUILD
  73. COMMAND ${CMAKE_SOURCE_DIR}/scripts/WindowsSign.cmd ${_WL_OUTPUT}
  74. COMMENT Signing ${_WL_OUTPUT}
  75. )
  76. endif()
  77. endfunction()
  78. function(wix_create_installer output)
  79. set(MARGS WXS_FILES EXTENSIONS DEPENDS)
  80. set(ARGS ARCH BASEDIR TARGET)
  81. cmake_parse_arguments(_WCI "" "${ARGS}" "${MARGS}" ${ARGN})
  82. foreach(wxs ${_WCI_WXS_FILES})
  83. get_filename_component(WXSBASE ${wxs} NAME_WE)
  84. wix_candle(${wxs} OUTPUT ${WXSBASE}.wixobj EXTENSIONS ${_WCI_EXTENSIONS} ARCH ${_WCI_ARCH})
  85. list(APPEND WIXOBJS ${WXSBASE}.wixobj)
  86. endforeach()
  87. wix_light(OBJS ${WIXOBJS}
  88. EXTENSIONS ${_WCI_EXTENSIONS}
  89. OUTPUT ${output}
  90. DEPENDS ${_WCI_DEPENDS}
  91. BASEDIR ${_WCI_BASEDIR}
  92. TARGET ${_WCI_TARGET})
  93. endfunction()
  94. wix_harvest_directory("${CMAKE_INSTALL_PREFIX}" "files.wxs" CGROUP ProgramFilesComponentGroup)
  95. wix_create_installer(PMP.msi
  96. WXS_FILES files.wxs "${PROJECT_SOURCE_DIR}/bundle/win/PMP.wxs"
  97. EXTENSIONS WixUtilExtension WixFirewallExtension
  98. )
  99. wix_create_installer(PlexMediaPlayer-${VERSION_STRING}-windows-x64.exe
  100. TARGET PlexMediaPlayerInstaller
  101. WXS_FILES "${PROJECT_SOURCE_DIR}/bundle/win/Bundle.wxs"
  102. EXTENSIONS WixUtilExtension WixBalExtension
  103. DEPENDS wix_PMP.msi
  104. BASEDIR "${PROJECT_SOURCE_DIR}/bundle/win"
  105. )
  106. add_custom_target(wix_install
  107. COMMAND ${CMAKE_COMMAND} -P cmake_install.cmake > wix_install.log
  108. DEPENDS PlexMediaPlayer PMPHelper
  109. COMMENT Installing files...)
  110. add_custom_target(windows_package
  111. DEPENDS wix_install PlexMediaPlayerInstaller)