From 81a7776d5ab523894a7c4745baee3988ad9f1ef9 Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Sun, 23 Oct 2011 12:29:44 +0100
Subject: Initial support for WiX installer.

dist=1 on Windows now generates .msi instead, as long as wix_bindir
is set to the path of \bin\ for WiX.

nsis is no longer used

diff --git a/BuildTools/SCons/SConscript.boot b/BuildTools/SCons/SConscript.boot
index 24a8b67..2463d6c 100644
--- a/BuildTools/SCons/SConscript.boot
+++ b/BuildTools/SCons/SConscript.boot
@@ -32,6 +32,8 @@ if os.name == "mac" or (os.name == "posix" and os.uname()[0] == "Darwin"):
 if os.name == "nt" :
 	vars.Add(PathVariable("vcredist", "MSVC redistributable dir", "", PathVariable.PathAccept))
 if os.name == "nt" :
+	vars.Add(PathVariable("wix_bindir", "Path to WiX binaries", "", PathVariable.PathAccept))
+if os.name == "nt" :
 	vars.Add(PackageVariable("bonjour", "Bonjour SDK location", "yes"))
 vars.Add(PackageVariable("openssl", "OpenSSL location", "yes"))
 vars.Add(PathVariable("boost_includedir", "Boost headers location", None, PathVariable.PathAccept))
diff --git a/BuildTools/SCons/Tools/wix.py b/BuildTools/SCons/Tools/wix.py
new file mode 100644
index 0000000..2c5904b
--- /dev/null
+++ b/BuildTools/SCons/Tools/wix.py
@@ -0,0 +1,52 @@
+import re, os
+import SCons.Util
+from subprocess import call
+
+def generate(env) :
+	print "Adding WiX to environment"
+	wixPath = env.get("wix_bindir", "")
+	if len(wixPath) > 0 and wixPath[-1] != "\\":
+		wixPath += "\\"
+	env['WIX_HEAT'] = wixPath + 'heat.exe'
+	env['WIX_HEAT_OPTIONS'] = '-gg -sfrag -suid -template fragment -dr ProgramFilesFolder'
+	env['WIX_CANDLE'] = wixPath + 'candle.exe'
+	env['WIX_CANDLE_OPTIONS'] = ''
+	env['WIX_LIGHT'] = wixPath + 'light.exe'
+	env['WIX_LIGHT_OPTIONS'] = '-ext WixUIExtension'
+
+	def WiX_IncludeScanner(source, env, path, arg):
+		wixIncludeRegexp = re.compile(r'^\s*\<\?include (\S+.wxs)\s*\?\>\S*', re.M)
+		contents = source.get_contents()
+		includes = wixIncludeRegexp.findall(contents)
+		return [ "" + include for include in includes ]
+
+	heat_builder = SCons.Builder.Builder(
+ 		action = '"$WIX_HEAT" dir Swift\\QtUI\\Swift -cg Files $WIX_HEAT_OPTIONS -o ${TARGET} -t Swift\\Packaging\\WiX\\include.xslt',
+		suffix = '.wxi')
+
+
+	candle_scanner = env.Scanner(name = 'wixincludefile',
+		function = WiX_IncludeScanner,
+		argument = None,
+		skeys = ['.wxs'])
+
+	candle_builder = SCons.Builder.Builder(
+ 		action = '"$WIX_CANDLE" $WIX_CANDLE_OPTIONS ${SOURCES} -o ${TARGET}',
+		src_suffix = '.wxs',
+		suffix = '.wixobj',
+		source_scanner = candle_scanner,
+ 		src_builder = heat_builder)
+
+
+	light_builder = SCons.Builder.Builder(
+ 		action = '"$WIX_LIGHT" $WIX_LIGHT_OPTIONS -b Swift\\QtUI\\Swift ${SOURCES} -o ${TARGET}',
+		src_suffix = '.wixobj',
+ 		src_builder = candle_builder)
+
+	env['BUILDERS']['WiX_Heat'] = heat_builder
+	env['BUILDERS']['WiX_Candle'] = candle_builder
+	env['BUILDERS']['WiX_Light'] = light_builder
+
+def exists(env) :
+	return True
+
diff --git a/Swift/Packaging/WiX/Swift.wxs b/Swift/Packaging/WiX/Swift.wxs
new file mode 100644
index 0000000..7ac96d5
--- /dev/null
+++ b/Swift/Packaging/WiX/Swift.wxs
@@ -0,0 +1,66 @@
+<?xml version='1.0' encoding='utf-8'?>
+
+<!-- For a sensible tutorial on WiX, see http://wix.tramontana.co.hu/tutorial -->
+
+<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
+
+	<?include variables.wxs ?>
+
+	<Product Name='Swift' Id='D7F276D5-BA67-421E-817B-9E7AB4B7D2BF' UpgradeCode='D7F276D5-BA67-421E-817B-9E7AB4B7D2BF' Language='1033' Codepage='1252' Version='0.0.1' Manufacturer='Swift.im'>
+		<Package Id='*' Keywords='Installer' Description="Swift Installer" Comments="Swift is available under the GPL version 3" Manufacturer="Swift.im" InstallerVersion='300' Languages='1033' Compressed='yes' SummaryCodepage='1252'/>
+		<Media Id='1' Cabinet='Swift.cab' EmbedCab='yes'/>
+
+		<!--<Upgrade Id='D7F276D5-BA67-421E-817B-9E7AB4B7D2BF'>
+			<UpgradeVersion OnlyDetect='no' Property='PREVIOUSFOUND' 
+				Minimum='0.0.1' IncludeMinimum='yes'
+				Maximum='2.0.0' IncludeMaximum='no'/>
+		</Upgrade>-->
+		<!-- This means it will upgrade any existing version up to but not including 2.0.
+			This'll mean we can ship nightlies and we can upgrade to 2.0 from them.
+			It also means we can 'upgrade' from e.g. 1.0 to 0.9. We want to change this so only real upgrades are allowed.
+			The numbering scheme probably needs to therefore be major.minor.commitssinceversion -->
+
+
+		<Directory Id='TARGETDIR' Name='SourceDir'>
+	      <Directory Id='ProgramFilesFolder' Name='PFiles'>
+	          <!--<Directory Id='INSTALLDIR' Name='Swift'>
+	          	
+	          </Directory>-->
+	      </Directory>
+
+	      <Directory Id="ProgramMenuFolder" Name="Programs">
+	        <Directory Id="ProgramMenuDir" Name="Swift">
+	          <Component Id="Shortcuts" Guid="D3BB9B0A-5D14-4920-B127-7CCD2D57BFB0">
+	        	<RemoveFolder Id='ProgramMenuDir' On='uninstall' />
+	            <RegistryValue Root='HKCU' Key='Software\Swift\Swift' Type='string' Value='' KeyPath='yes' />
+		    <Shortcut Id='SwiftShortcut' Directory='ProgramMenuDir' Name='Swift' Target="[INSTALLDIR]\Swift.exe" Icon='Swift.exe'/>
+	          </Component>
+	        </Directory>
+	      </Directory>
+
+	      <Directory Id="DesktopFolder" Name="Desktop" />
+
+	      <Merge Id="CRT" DiskId="1" Language="1033" SourceFile="$(var.VCCRTFile)"/>
+	    </Directory>
+
+	    <Feature Id='Core' Level='1' Title='Swift' Description='All necessary Swift files' Display='expand' ConfigurableDirectory='INSTALLDIR' AllowAdvertise='no' Absent='disallow'>
+	      <ComponentGroupRef Id='Files' />
+	      
+	      <!--<ComponentRef Id='Manual' />-->
+	      <MergeRef Id="CRT"/>
+	    </Feature>
+
+	    <Feature Id='Shortcut' Level='1' Title='Shortcut' Description='Start Menu Shortcut' Display='expand' ConfigurableDirectory='INSTALLDIR' AllowAdvertise='no'>
+	      <ComponentRef Id='Shortcuts' />
+	    </Feature>
+
+	    <!--<UIRef Id='WixUI_Advanced'/>-->
+	    <!--<UIRef Id="WixUI_Minimal"/>-->
+	    <UIRef Id="WixUI_Mondo"/>
+	    <WixVariable Id='WixUILicenseRtf' Value='COPYING.rtf'/>
+
+	    <Icon Id="Swift.exe" SourceFile="Swift.exe" />
+
+	    
+	</Product>
+</Wix>
\ No newline at end of file
diff --git a/Swift/Packaging/WiX/include.xslt b/Swift/Packaging/WiX/include.xslt
new file mode 100644
index 0000000..ec1ad50
--- /dev/null
+++ b/Swift/Packaging/WiX/include.xslt
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">
+
+	<xsl:template match='wix:Directory[@Id="Swift"]/@Id'>
+		<xsl:attribute name='Id'>INSTALLDIR</xsl:attribute>
+	</xsl:template>
+
+	<xsl:template match="@*|node()">
+		<xsl:copy>
+			<xsl:apply-templates select="@*|node()"/>
+		</xsl:copy>
+	</xsl:template>
+</xsl:stylesheet>
diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript
index a62e14c..95ec49a 100644
--- a/Swift/QtUI/SConscript
+++ b/Swift/QtUI/SConscript
@@ -43,6 +43,7 @@ myenv.UseFlags(myenv["PLATFORM_FLAGS"])
 
 myenv.Tool("qt4", toolpath = ["#/BuildTools/SCons/Tools"])
 myenv.Tool("nsis", toolpath = ["#/BuildTools/SCons/Tools"])
+myenv.Tool("wix", toolpath = ["#/BuildTools/SCons/Tools"])
 qt4modules = ['QtCore', 'QtGui', 'QtWebKit']
 if env["PLATFORM"] == "posix" :
 	qt4modules += ["QtDBus"]
@@ -258,13 +259,54 @@ if env["PLATFORM"] == "win32" :
         #os.path.join(env["OPENSSL_DIR"], "bin", "libeay32.dll"),
         "#/Swift/resources/images",  
       ]
+    qtimageformats = ["gif", "ico", "jpeg", "mng", "svg", "tiff"]
+    qtlibs = ["QtCore4", "QtGui4", "QtNetwork4", "QtWebKit4", "QtXMLPatterns4", "phonon4"]
     myenv.WindowsBundle("Swift", 
       resources = commonResources,
-      qtimageformats = ["gif", "ico", "jpeg", "mng", "svg", "tiff"],
-      qtlibs = ["QtCore4", "QtGui4", "QtNetwork4", "QtWebKit4", "QtXMLPatterns4", "phonon4"])
+      qtimageformats = qtimageformats,
+      qtlibs = qtlibs)
+
+    #myenv.Append(NSIS_OPTIONS = [
+    #    "/DmsvccRedistributableDir=\"" + env["vcredist"] + "\"", 
+    #    "/DbuildVersion=" + myenv["SWIFT_VERSION"]
+    #  ])
+    #myenv.Nsis("../Packaging/nsis/swift.nsi")
+    #myenv.WiX("../Packaging/wix/swift.msi", ["../Packaging/WiX/Swift.wxs"])
+    if env["SCONS_STAGE"] == "build" and env.get("wix_bindir", None):
+      licensefile = open('../../COPYING', 'r')
+      rtf = '{\\rtf1\\ansi{\\fonttbl\\f0\\fswiss Helvetica;}\\f0\\pard'
+      for line in licensefile:
+        rtf += line
+        rtf += '\\par'
+      rtf += '}'
+      licensefile.close()
+      myenv.WriteVal("Swift/COPYING.rtf", env.Value(rtf))
+
+      wixvariables = {'VCCRTFile': env.get("vcredist", "c:\\Program Files\\Common Files\\Merge Modules") + "\\Microsoft_VC90_CRT_x86.msm"}
+      wixincludecontent = "<Include>"
+      for key in wixvariables:
+        wixincludecontent += "<?define %s = \"%s\" ?>" % (key, wixvariables[key])
+      wixincludecontent += "</Include>"
+      myenv.WriteVal("..\\Packaging\\Wix\\variables.wxs", env.Value(wixincludecontent))
+      heatDependencies = ['Swift/COPYING.rtf', 'Swift/Swift.exe']
+      for dir, resourceFiles in commonResources.items():
+        for resource in resourceFiles:
+          e = env.Entry(resource)
+          if e.isdir():
+            for subresource in env.Glob(str(e) + "/*") :
+              heatDependencies.append("Swift/" + e.name + "/" + subresource.name)
+          else:
+            if resource[-3:] != ".qm":
+              heatDependencies.append("Swift/" + resource)
+      for resource in qtlibs:
+        heatDependencies.append("Swift/" + resource + ".dll")
+      for resource in qtimageformats:
+        heatDependencies.append("Swift/imageformats/q" + resource + "4.dll")
+      for lang in translation_languages:
+        heatDependencies.append("Swift/translations/swift_" + lang + ".qm")
+      myenv.WiX_Heat('..\\Packaging\\WiX\\gen_files.wxs', heatDependencies)
+      myenv.WiX_Candle('..\\Packaging\\WiX\\Swift.wixobj', '..\\Packaging\\WiX\\Swift.wxs')
+      myenv.WiX_Candle('..\\Packaging\\WiX\\gen_files.wixobj', '..\\Packaging\\WiX\\gen_files.wxs')
+      myenv.WiX_Light('..\\Packaging\\WiX\\Swift-' + myenv["SWIFT_VERSION"] + '.msi', ['..\\Packaging\\WiX\\gen_files.wixobj','..\\Packaging\\WiX\\Swift.wixobj'])
+
 
-    myenv.Append(NSIS_OPTIONS = [
-        "/DmsvccRedistributableDir=\"" + env["vcredist"] + "\"", 
-        "/DbuildVersion=" + myenv["SWIFT_VERSION"]
-      ])
-    myenv.Nsis("../Packaging/nsis/swift.nsi")
-- 
cgit v0.10.2-6-g49f6