packagemsi.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. from harvest import generateWixFragment
  2. from packagewindows import (
  3. PackageInfo, emptyOrCreateDirectory, generateInstallFiles
  4. )
  5. from io import open
  6. from os import environ, mkdir, system, unlink
  7. from os.path import exists, join as joinpath
  8. from zipfile import ZIP_DEFLATED, ZipFile
  9. import sys
  10. def _writeFragment(
  11. wxsFile, sourcePath, componentGroup, directoryRef,
  12. virtualDir, excludedFile, win64
  13. ):
  14. print('Generating ' + wxsFile)
  15. with open(wxsFile, 'w', encoding='utf-8') as out:
  16. out.writelines(
  17. line + '\n'
  18. for line in generateWixFragment(
  19. sourcePath, componentGroup, directoryRef, virtualDir,
  20. excludedFile, win64
  21. )
  22. )
  23. def packageMSI(info):
  24. print('Generating install files...')
  25. generateInstallFiles(info)
  26. wixIntermediatePath = joinpath(info.buildPath, 'build\\WiX')
  27. emptyOrCreateDirectory(wixIntermediatePath)
  28. if not exists(info.packagePath):
  29. mkdir(info.packagePath)
  30. print('Generating fragments...')
  31. # openMSX files
  32. openMSXExeFile = joinpath(wixIntermediatePath, 'openmsxexe.wxs')
  33. openMSXExeObjFile = joinpath(wixIntermediatePath, 'openmsxexe.wixobj')
  34. sourcePath = joinpath(info.makeInstallPath, 'bin\\openmsx.exe')
  35. _writeFragment(
  36. openMSXExeFile, sourcePath, 'openMSXExe', 'OPENMSXINSTALLDIR',
  37. None, None, info.win64
  38. )
  39. openMSXDocFile = joinpath(wixIntermediatePath, 'openmsxdoc.wxs')
  40. openMSXDocObjFile = joinpath(wixIntermediatePath, 'openmsxdoc.wixobj')
  41. sourcePath = joinpath(info.makeInstallPath, 'doc')
  42. _writeFragment(
  43. openMSXDocFile, sourcePath, 'openMSXDoc', 'OPENMSXINSTALLDIR',
  44. 'doc', None, info.win64
  45. )
  46. openMSXShareFile = joinpath(wixIntermediatePath, 'openmsxshare.wxs')
  47. openMSXShareObjFile = joinpath(wixIntermediatePath, 'openmsxshare.wixobj')
  48. sourcePath = joinpath(info.makeInstallPath, 'share')
  49. _writeFragment(
  50. openMSXShareFile, sourcePath, 'openMSXShare', 'OPENMSXINSTALLDIR',
  51. 'share', None, info.win64
  52. )
  53. openMSXIconFile = joinpath(wixIntermediatePath, 'openmsxicon.wxs')
  54. openMSXIconObjFile = joinpath(wixIntermediatePath, 'openmsxicon.wixobj')
  55. sourcePath = joinpath(info.sourcePath, 'resource\\openmsx.ico')
  56. _writeFragment(
  57. openMSXIconFile, sourcePath, 'openMSXIcon', 'OPENMSXINSTALLDIR',
  58. 'share\\icons', None, info.win64
  59. )
  60. # ZMBV files
  61. ZMBVCodecFile = joinpath(wixIntermediatePath, 'zmbvcodec.wxs')
  62. ZMBVCodecObjFile = joinpath(wixIntermediatePath, 'zmbvcodec.wixobj')
  63. sourcePath = joinpath(info.codecPath, 'zmbv.dll')
  64. _writeFragment(
  65. ZMBVCodecFile, sourcePath, 'ZMBVCodec', 'SystemFolder',
  66. None, None, False
  67. )
  68. ZMBVFilesFile = joinpath(wixIntermediatePath, 'zmbvfiles.wxs')
  69. ZMBVFilesObjFile = joinpath(wixIntermediatePath, 'zmbvfiles.wixobj')
  70. sourcePath = info.codecPath
  71. _writeFragment(
  72. ZMBVFilesFile, sourcePath, 'ZMBVFiles', 'OPENMSXINSTALLDIR',
  73. 'codec', 'zmbv.dll', info.win64
  74. )
  75. # Catapult files
  76. catapultBinFile = joinpath(wixIntermediatePath, 'catapultbin.wxs')
  77. catapultBinObjFile = joinpath(wixIntermediatePath, 'catapultbin.wixobj')
  78. sourcePath = joinpath(info.catapultBuildPath, 'install\\catapult.exe')
  79. _writeFragment(
  80. catapultBinFile, sourcePath, 'CatapultBin', 'OPENMSXINSTALLDIR',
  81. 'Catapult\\bin', None, info.win64
  82. )
  83. catapultDocFile = joinpath(wixIntermediatePath, 'catapultdoc.wxs')
  84. catapultDocObjFile = joinpath(wixIntermediatePath, 'catapultdoc.wixobj')
  85. sourcePath = joinpath(info.catapultPath, 'doc')
  86. _writeFragment(
  87. catapultDocFile, sourcePath, 'CatapultDoc', 'OPENMSXINSTALLDIR',
  88. 'Catapult\\doc', 'release-process.txt', info.win64
  89. )
  90. catapultBitmapsFile = joinpath(wixIntermediatePath, 'catapultbitmaps.wxs')
  91. catapultBitmapsObjFile = joinpath(
  92. wixIntermediatePath, 'catapultbitmaps.wixobj'
  93. )
  94. sourcePath = joinpath(info.catapultPath, 'resources\\bitmaps')
  95. _writeFragment(
  96. catapultBitmapsFile, sourcePath, 'CatapultBitmaps', 'OPENMSXINSTALLDIR',
  97. 'Catapult\\resources\\bitmaps', 'release-process.txt', info.win64
  98. )
  99. catapultDialogsFile = joinpath(wixIntermediatePath, 'catapultdialogs.wxs')
  100. catapultDialogsObjFile = joinpath(
  101. wixIntermediatePath, 'catapultdialogs.wixobj'
  102. )
  103. sourcePath = joinpath(info.catapultBuildPath, 'install\\dialogs')
  104. _writeFragment(
  105. catapultDialogsFile, sourcePath, 'CatapultDialogs', 'OPENMSXINSTALLDIR',
  106. 'Catapult\\resources\\dialogs', None, info.win64
  107. )
  108. catapultIconsFile = joinpath(wixIntermediatePath, 'catapulticons.wxs')
  109. catapultIconsObjFile = joinpath(wixIntermediatePath, 'catapulticons.wixobj')
  110. sourcePath = joinpath(info.catapultBuildPath, 'src\\catapult.xpm')
  111. _writeFragment(
  112. catapultIconsFile, sourcePath, 'CatapultIcons', 'OPENMSXINSTALLDIR',
  113. 'Catapult\\resources\\icons', None, info.win64
  114. )
  115. catapultReadmeFile = joinpath(wixIntermediatePath, 'catapultreadme.wxs')
  116. catapultReadmeObjFile = joinpath(
  117. wixIntermediatePath, 'catapultreadme.wixobj'
  118. )
  119. sourcePath = joinpath(info.catapultPath, 'README')
  120. _writeFragment(
  121. catapultReadmeFile, sourcePath, 'CatapultReadme', 'OPENMSXINSTALLDIR',
  122. 'Catapult\\doc', None, info.win64
  123. )
  124. # Variables needed inside the WiX scripts:
  125. # OPENMSX_VERSION to tell it the product version
  126. # OPENMSX_ICON_PATH to locate the MSI's control panel icon
  127. # OPENMSX_PACKAGE_WINDOWS_PATH to locate the bmps used in the UI
  128. environ.update(
  129. OPENMSX_VERSION = info.version,
  130. OPENMSX_ICON_PATH = info.openmsxExePath,
  131. OPENMSX_PACKAGE_WINDOWS_PATH = info.packageWindowsPath,
  132. )
  133. openMSXFile = joinpath(info.packageWindowsPath, 'openmsx.wxs')
  134. openMSXObjFile = joinpath(wixIntermediatePath, 'openmsx.wixobj')
  135. candleCmd = ' '.join((
  136. 'candle.exe',
  137. '-arch %s' % info.cpu,
  138. '-o "%s\\\\"' % wixIntermediatePath,
  139. '-ext WixUtilExtension',
  140. '"%s"' % openMSXFile,
  141. '"%s"' % openMSXExeFile,
  142. '"%s"' % openMSXDocFile,
  143. '"%s"' % openMSXShareFile,
  144. '"%s"' % openMSXIconFile,
  145. '"%s"' % ZMBVCodecFile,
  146. '"%s"' % ZMBVFilesFile,
  147. '"%s"' % catapultBinFile,
  148. '"%s"' % catapultDocFile,
  149. '"%s"' % catapultBitmapsFile,
  150. '"%s"' % catapultDialogsFile,
  151. '"%s"' % catapultIconsFile,
  152. '"%s"' % catapultReadmeFile,
  153. ))
  154. # Run Candle
  155. print(candleCmd)
  156. system(candleCmd)
  157. msiFileName = info.packageFileName + '-bin.msi'
  158. msiFilePath = joinpath(info.packagePath, msiFileName)
  159. if exists(msiFilePath):
  160. unlink(msiFilePath)
  161. print('Generating ' + msiFilePath)
  162. lightCmd = ' '.join((
  163. 'light.exe',
  164. '-o "%s"' % msiFilePath,
  165. '-sw1076',
  166. '-ext WixUtilExtension',
  167. '-ext WixUIExtension',
  168. '-loc "%s"' % joinpath(info.packageWindowsPath, 'openmsx1033.wxl'),
  169. '"%s"' % openMSXObjFile,
  170. '"%s"' % openMSXExeObjFile,
  171. '"%s"' % openMSXDocObjFile,
  172. '"%s"' % openMSXShareObjFile,
  173. '"%s"' % openMSXIconObjFile,
  174. '"%s"' % ZMBVCodecObjFile,
  175. '"%s"' % ZMBVFilesObjFile,
  176. '"%s"' % catapultBinObjFile,
  177. '"%s"' % catapultDocObjFile,
  178. '"%s"' % catapultBitmapsObjFile,
  179. '"%s"' % catapultDialogsObjFile,
  180. '"%s"' % catapultIconsObjFile,
  181. '"%s"' % catapultReadmeObjFile,
  182. ))
  183. # Run Light
  184. print(lightCmd)
  185. system(lightCmd)
  186. # Zip up the MSI
  187. zipFileName = info.packageFileName + '-bin-msi.zip'
  188. zipFilePath = joinpath(info.packagePath, zipFileName)
  189. print('Generating ' + zipFilePath)
  190. zipFile = ZipFile(zipFilePath, 'w')
  191. zipFile.write(msiFilePath, msiFileName, ZIP_DEFLATED)
  192. zipFile.close()
  193. if __name__ == '__main__':
  194. if len(sys.argv) == 4:
  195. packageMSI(PackageInfo(*sys.argv[1 : ]))
  196. else:
  197. print(
  198. 'Usage: python3 packagemsi.py '
  199. 'platform configuration catapultPath',
  200. file=sys.stderr
  201. )
  202. sys.exit(2)