waf

FORK: waf with some random patches
git clone https://git.neptards.moe/neptards/waf.git
Log | Files | Refs | README

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