wix.py (2659B)
1 #!/usr/bin/python 2 # encoding: utf-8 3 # vim: tabstop=4 noexpandtab 4 5 """ 6 Windows Installer XML Tool (WiX) 7 8 .wxs --- candle ---> .wxobj --- light ---> .msi 9 10 bld(features='wix', some.wxs, gen='some.msi', candleflags=[..], lightflags=[..]) 11 12 bld(features='wix', source=['bundle.wxs','WixBalExtension'], gen='setup.exe', candleflags=[..]) 13 """ 14 15 import os, copy 16 from waflib import TaskGen 17 from waflib import Task 18 from waflib.Utils import winreg 19 20 class candle(Task.Task): 21 run_str = '${CANDLE} -nologo ${CANDLEFLAGS} -out ${TGT} ${SRC[0].abspath()}', 22 23 class light(Task.Task): 24 run_str = "${LIGHT} -nologo -b ${SRC[0].parent.abspath()} ${LIGHTFLAGS} -out ${TGT} ${SRC[0].abspath()}" 25 26 @TaskGen.feature('wix') 27 @TaskGen.before_method('process_source') 28 def wix(self): 29 #X.wxs -> ${SRC} for CANDLE 30 #X.wxobj -> ${SRC} for LIGHT 31 #X.dll -> -ext X in ${LIGHTFLAGS} 32 #X.wxl -> wixui.wixlib -loc X.wxl in ${LIGHTFLAGS} 33 wxobj = [] 34 wxs = [] 35 exts = [] 36 wxl = [] 37 rest = [] 38 for x in self.source: 39 if x.endswith('.wxobj'): 40 wxobj.append(x) 41 elif x.endswith('.wxs'): 42 wxobj.append(self.path.find_or_declare(x[:-4]+'.wxobj')) 43 wxs.append(x) 44 elif x.endswith('.dll'): 45 exts.append(x[:-4]) 46 elif '.' not in x: 47 exts.append(x) 48 elif x.endswith('.wxl'): 49 wxl.append(x) 50 else: 51 rest.append(x) 52 self.source = self.to_nodes(rest) #.wxs 53 54 cndl = self.create_task('candle', self.to_nodes(wxs), self.to_nodes(wxobj)) 55 lght = self.create_task('light', self.to_nodes(wxobj), self.path.find_or_declare(self.gen)) 56 57 cndl.env.CANDLEFLAGS = copy.copy(getattr(self,'candleflags',[])) 58 lght.env.LIGHTFLAGS = copy.copy(getattr(self,'lightflags',[])) 59 60 for x in wxl: 61 lght.env.append_value('LIGHTFLAGS','wixui.wixlib') 62 lght.env.append_value('LIGHTFLAGS','-loc') 63 lght.env.append_value('LIGHTFLAGS',x) 64 for x in exts: 65 cndl.env.append_value('CANDLEFLAGS','-ext') 66 cndl.env.append_value('CANDLEFLAGS',x) 67 lght.env.append_value('LIGHTFLAGS','-ext') 68 lght.env.append_value('LIGHTFLAGS',x) 69 70 #wix_bin_path() 71 def wix_bin_path(): 72 basekey = r"SOFTWARE\Microsoft\.NETFramework\AssemblyFolders" 73 query = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, basekey) 74 cnt=winreg.QueryInfoKey(query)[0] 75 thiskey = r'C:\Program Files (x86)\WiX Toolset v3.10\SDK' 76 for i in range(cnt-1,-1,-1): 77 thiskey = winreg.EnumKey(query,i) 78 if 'WiX' in thiskey: 79 break 80 winreg.CloseKey(query) 81 return os.path.normpath(winreg.QueryValue(winreg.HKEY_LOCAL_MACHINE, basekey+r'\\'+thiskey)+'..\\bin') 82 83 def configure(ctx): 84 path_list=[wix_bin_path()] 85 ctx.find_program('candle', var='CANDLE', mandatory=True, path_list = path_list) 86 ctx.find_program('light', var='LIGHT', mandatory=True, path_list = path_list) 87