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