2015-12-18 00:35:27 +01:00
|
|
|
#!/usr/bin/python
|
|
|
|
# encoding: utf-8
|
|
|
|
# vim: tabstop=4 noexpandtab
|
|
|
|
|
|
|
|
"""
|
|
|
|
Windows Installer XML Tool (WiX)
|
|
|
|
|
|
|
|
.wxs --- candle ---> .wxobj --- light ---> .msi
|
|
|
|
|
|
|
|
bld(features='wix', some.wxs, gen='some.msi', candleflags=[..], lightflags=[..])
|
|
|
|
|
|
|
|
bld(features='wix', source=['bundle.wxs','WixBalExtension'], gen='setup.exe', candleflags=[..])
|
|
|
|
"""
|
|
|
|
|
2016-01-03 05:06:44 +01:00
|
|
|
import os, copy
|
2015-12-18 00:35:27 +01:00
|
|
|
from waflib import TaskGen
|
|
|
|
from waflib import Task
|
|
|
|
from waflib.Utils import winreg
|
|
|
|
|
|
|
|
class candle(Task.Task):
|
|
|
|
run_str = '${CANDLE} -nologo ${CANDLEFLAGS} -out ${TGT} ${SRC[0].abspath()}',
|
|
|
|
|
|
|
|
class light(Task.Task):
|
|
|
|
run_str = "${LIGHT} -nologo -b ${SRC[0].parent.abspath()} ${LIGHTFLAGS} -out ${TGT} ${SRC[0].abspath()}"
|
|
|
|
|
|
|
|
@TaskGen.feature('wix')
|
|
|
|
@TaskGen.before_method('process_source')
|
|
|
|
def wix(self):
|
|
|
|
#X.wxs -> ${SRC} for CANDLE
|
|
|
|
#X.wxobj -> ${SRC} for LIGHT
|
|
|
|
#X.dll -> -ext X in ${LIGHTFLAGS}
|
|
|
|
#X.wxl -> wixui.wixlib -loc X.wxl in ${LIGHTFLAGS}
|
|
|
|
wxobj = []
|
|
|
|
wxs = []
|
|
|
|
exts = []
|
|
|
|
wxl = []
|
|
|
|
rest = []
|
|
|
|
for x in self.source:
|
|
|
|
if x.endswith('.wxobj'):
|
|
|
|
wxobj.append(x)
|
|
|
|
elif x.endswith('.wxs'):
|
|
|
|
wxobj.append(self.path.find_or_declare(x[:-4]+'.wxobj'))
|
|
|
|
wxs.append(x)
|
|
|
|
elif x.endswith('.dll'):
|
|
|
|
exts.append(x[:-4])
|
|
|
|
elif '.' not in x:
|
|
|
|
exts.append(x)
|
|
|
|
elif x.endswith('.wxl'):
|
|
|
|
wxl.append(x)
|
|
|
|
else:
|
|
|
|
rest.append(x)
|
|
|
|
self.source = self.to_nodes(rest) #.wxs
|
|
|
|
|
|
|
|
cndl = self.create_task('candle', self.to_nodes(wxs), self.to_nodes(wxobj))
|
|
|
|
lght = self.create_task('light', self.to_nodes(wxobj), self.path.find_or_declare(self.gen))
|
|
|
|
|
2016-01-03 05:06:44 +01:00
|
|
|
cndl.env.CANDLEFLAGS = copy.copy(getattr(self,'candleflags',[]))
|
|
|
|
lght.env.LIGHTFLAGS = copy.copy(getattr(self,'lightflags',[]))
|
2015-12-18 00:35:27 +01:00
|
|
|
|
|
|
|
for x in wxl:
|
|
|
|
lght.env.append_value('LIGHTFLAGS','wixui.wixlib')
|
|
|
|
lght.env.append_value('LIGHTFLAGS','-loc')
|
|
|
|
lght.env.append_value('LIGHTFLAGS',x)
|
|
|
|
for x in exts:
|
|
|
|
cndl.env.append_value('CANDLEFLAGS','-ext')
|
|
|
|
cndl.env.append_value('CANDLEFLAGS',x)
|
|
|
|
lght.env.append_value('LIGHTFLAGS','-ext')
|
|
|
|
lght.env.append_value('LIGHTFLAGS',x)
|
|
|
|
|
|
|
|
#wix_bin_path()
|
|
|
|
def wix_bin_path():
|
|
|
|
basekey = r"SOFTWARE\Microsoft\.NETFramework\AssemblyFolders"
|
|
|
|
query = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, basekey)
|
|
|
|
cnt=winreg.QueryInfoKey(query)[0]
|
|
|
|
thiskey = r'C:\Program Files (x86)\WiX Toolset v3.10\SDK'
|
|
|
|
for i in range(cnt-1,-1,-1):
|
|
|
|
thiskey = winreg.EnumKey(query,i)
|
|
|
|
if 'WiX' in thiskey:
|
2016-01-03 06:53:20 +01:00
|
|
|
break
|
2015-12-18 00:35:27 +01:00
|
|
|
winreg.CloseKey(query)
|
|
|
|
return os.path.normpath(winreg.QueryValue(winreg.HKEY_LOCAL_MACHINE, basekey+r'\\'+thiskey)+'..\\bin')
|
|
|
|
|
|
|
|
def configure(ctx):
|
|
|
|
path_list=[wix_bin_path()]
|
|
|
|
ctx.find_program('candle', var='CANDLE', mandatory=True, path_list = path_list)
|
|
|
|
ctx.find_program('light', var='LIGHT', mandatory=True, path_list = path_list)
|
|
|
|
|