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