Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Move to a single feature tree, drop custom distutils dialogs in favor…

… of the dialog set provided by the WiX toolset, provide some images for those dialogs, restructure source tree somewhat, and a whole bunch of small improvements...
  • Loading branch information...
commit b404d85b6bae5bb481ead22239aa7b6811342ddb 1 parent ed0f728
@dieterv authored
Showing with 1,740 additions and 1,034 deletions.
  1. +2 −1  .gitignore
  2. +5 −3 README.rst
  3. +24 −0 bin/build.conf
  4. +7 −24 bin/build_bindings.sh
  5. +133 −0 bin/build_glade.sh
  6. +206 −265 bin/build_installer.py
  7. +0 −526 etc/2.22.0.0-win32.template.wxs
  8. +0 −213 etc/2.22.0.0-win32.xml
  9. +0 −2  var/overlays/2.22.0.0/gtk_runtime/etc/gtk-2.0/gtkrc
  10. +241 −0 wix/2.22.1.xml
  11. BIN  wix/images/PyGtkBanner.jpg
  12. +518 −0 wix/images/PyGtkBanner.svg
  13. BIN  wix/images/PyGtkDialog.jpg
  14. +332 −0 wix/images/PyGtkDialog.svg
  15. BIN  wix/images/PyGtkExclamationIco.ico
  16. BIN  wix/images/PyGtkExclamationIco.xcf
  17. BIN  wix/images/PyGtkIcon.ico
  18. BIN  wix/images/PyGtkIcon.xcf
  19. BIN  wix/images/PyGtkInfoIco.ico
  20. BIN  wix/images/PyGtkInfoIco.xcf
  21. BIN  wix/images/PyGtkNewIco.ico
  22. BIN  wix/images/PyGtkNewIco.xcf
  23. BIN  wix/images/PyGtkUpIco.ico
  24. BIN  wix/images/PyGtkUpIco.xcf
  25. 0  {var/overlays/2.22.0.0 → wix/overlays}/gtk_runtime/__init__.py
  26. 0  {var/overlays/2.22.0.0 → wix/overlays}/gtk_runtime/__init__.pyc
  27. 0  {var/overlays/2.22.0.0 → wix/overlays}/gtk_runtime/bin/reconfig.cmd
  28. +8 −0 wix/overlays/gtk_runtime/etc/gtk-2.0/gtkrc
  29. 0  {var/overlays/2.22.0.0 → wix/overlays}/gtk_runtime/etc/pango/pango.aliases
  30. 0  {var/overlays/2.22.0.0 → wix/overlays}/pygobject/pygtk.py
  31. +131 −0 wix/template/PyGtk.wxs
  32. +66 −0 wix/template/WixUI_PyGtk.wxs
  33. +67 −0 wix/template/WixUi_PyGtk_CustomizeDlg.wxs
View
3  .gitignore
@@ -1,2 +1,3 @@
+cache/*
+dist/*
tmp/*
-var/cache/*
View
8 README.rst
@@ -4,6 +4,8 @@ pygtk-installer
The pygtk-installer project provides:
+- build_glade.sh: a tool that builds glade3 binaries for mswindows with
+ "Python Widgets Support".
- build_bindings.sh: a tool that builds windows installer packages (both .exe
and .msi) for pycairo, pygobject, pygtk, pygoocanvas, pygtksourceview and pyrsvg.
- build_installer.py: a tool that generates an all-in-one installer bundling
@@ -26,13 +28,13 @@ If you decide to give it a test anyway:
The pygtk version that's installed with the all-in-one installer
should take care of loading the included gtk+ runtime on PATH
when you import pygtk; pygtk.require('2.0'). As a consequence
- simply importing gtk, gobject, etc *might* not work without
+ simply importing gobject, gtk, etc *might* not work without
the .require() call. The .require() call is typically done only
once in a startup script somewhere.
#. Why did you say "*might* not work" above? Ah, good question. If
you've got another gtk+ runtime on your PATH environment variable - for
- example you installed Dia, MonoDevelop (gtk#), etc. - the PyGTK bindings might
- use one of those runtime libraries. In that case the behavior of the PyGTK
+ example you installed Dia, MonoDevelop (gtk#), etc. - the PyGtk bindings might
+ use one of those runtime libraries. In that case the behavior of the PyGtk
bindings is unspecified (it might crash, error out, etc.).
#. If you want to test newer snapshots of the all-in-one installer when they
get available, you'll first need to uninstall the previous one, either from
View
24 bin/build.conf
@@ -0,0 +1,24 @@
+################################################################
+# This is the configuration file for the various build scripts #
+# of the pygtk-installer project. #
+################################################################
+
+# Configure the path to your source repositories.
+CHECKOUT="/d/dev/gnome.org/gnome-windows/checkout"
+
+# Configure the path to the tmp directory.
+TMPDIR="/d/dev/gnome.org/gnome-windows/checkout/pygtk-installer/tmp"
+
+# Congfigure the destination path for the built installers.
+# A subdirectory will be created into it each time you run
+# this script.
+DESTDIR="/d/dev/gnome.org/gnome-windows/dist"
+
+# Configure the path to your Python interpreter installations.
+# Installers will be built for any interpreter configured here.
+# Only Python 2.6 and Python 2.7 are supported atm.
+INTERPRETERS="/d/bin/Python26 /d/bin/Python27" # for msys
+#INTERPRETERS="c:/Python26 c:/Python27" # for wine
+
+# Configure the path to your gtk+-bundle installation.
+GTKBUNDLE="/d/dev/gnome.org/gnome-windows/prefix/gtk+-bundle/gtk+-bundle_2.22.0-20101016_win32"
View
31 bin/build_bindings.sh
@@ -17,12 +17,11 @@
# You should have received a copy of the GNU General Public License
# along with pygtk-installer. If not, see <http://www.gnu.org/licenses/>.
-
# What is this?
# =============
# build_bindings.sh is a script for building the
# Py{Cairo, GObject, GTK, GooCanvas, GtkSourceView, Rsvg}
-# installers using MinGW.
+# installers using MinGW/MSYS.
# This script has been tested with MSYS on MS Windows,
# but should work fine via wine on a Linux distribution.
@@ -33,37 +32,21 @@
# $ mingw-get.exe install msys-base
#
# Configure the CHECKOUT, DESTDIR and INTERPRETERS and GTKBUNDLE
-# variables below
+# variables in the build.conf file
#
# To build all installers, execute
-# $ build_bindings
+# $ ./build_bindings.sh
#
# To build specific (but known!) targets, execute
-# $ build_bindings pygobject pygtk
+# $ ./build_bindings.sh pygobject pygtk
# or
-# $ build_bindings pygoocanvas
+# $ ./build_bindings.sh pygoocanvas
# or ... well, you get the idea
-# Configure the path to source repositories.
-CHECKOUT="/d/dev/gnome.org/gnome-windows/checkout"
-
-# Congfigure the destination path for the built installers.
-# A subdirectory will be created into it each time you run
-# this script.
-DESTDIR="/d/dev/gnome.org/gnome-windows/dist"
-
-# Configure the path to your Python interpreter installations.
-# Installers will be built for any interpreter configured here.
-# Only Python 2.6 and Python 2.7 are supported atm.
-INTERPRETERS="/d/bin/Python26 /d/bin/Python27" # for msys
-#INTERPRETERS="c:/Python26 c:/Python27" # for wine
-
-# Configure the path to your gtk+-bundle installation.
-GTKBUNDLE="/d/dev/gnome.org/gnome-windows/prefix/gtk+-bundle/gtk+-bundle_2.22.0-20101016_win32/lib/pkgconfig"
-
+# Load "configuration"
+source ../etc/build_env.conf
-# you can stop configureing now ;)
TARGETS="pycairo-1.8.10 pygobject pygtk pygoocanvas pygtksourceview gnome-python-desktop"
DESTDIR=${DESTDIR}/`date +%Y%m%d-%H%M%S`
OLD_CWD=`pwd`
View
133 bin/build_glade.sh
@@ -0,0 +1,133 @@
+#!/bin/bash
+
+# Copyright © 2010 pygtk-installer Contributors
+#
+# This file is part of pygtk-installer.
+#
+# pygtk-installer is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# pygtk-installer is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with pygtk-installer. If not, see <http://www.gnu.org/licenses/>.
+
+# What is this?
+# =============
+# build_glade.sh is a script for building glade3 with
+# "python widgets support"
+
+# How does it work?
+# =================
+# Install the deps (gtk+-bundle, ...) MinGW/MSYS with GCC 4.5.0
+# $ mingw-get.exe install gcc
+# $ mingw-get.exe install msys-base
+#
+# Configure the CHECKOUT, DESTDIR and INTERPRETERS and GTKBUNDLE
+# variables in the etc/build_env.conf file
+#
+# To build glade for each python interpreter, execute
+# $ ./build_glade.sh
+
+#################################################################
+# Untill bug 634978 gets fixed you'll need to manually patch #
+# the configure script. #
+# https://bugzilla.gnome.org/show_bug.cgi?id=634978 #
+#################################################################
+
+# Load "configuration"
+source build.conf
+
+MOD=glade3
+VER=3.6.7
+REV=0
+ARCH=win32
+
+DESTDIR=${DESTDIR}/`date +%Y%m%d-%H%M%S`
+OLD_CWD=`pwd`
+OLD_PATH=${PATH}
+OLD_PKG_CONFIG_PATH=${PKG_CONFIG_PATH}
+
+for INTERPRETER in ${INTERPRETERS}; do
+ export PATH=${INTERPRETER}:${INTERPRETER}/Scripts:${GTKBUNDLE}/bin:${OLD_PATH}
+ export PKG_CONFIG_PATH=${INTERPRETER}/Lib/pkgconfig/:${GTKBUNDLE}/lib/pkgconfig/:${OLD_PKG_CONFIG_PATH}
+
+ len=${#INTERPRETER}
+ INTERPRETER_VERSION=$(echo "$INTERPRETER"|cut -c"$((len-1))"-"$len")
+ THIS=${MOD}-${VER}-${REV}.${ARCH}-py${INTERPRETER_VERSION}
+ ZIP=${MOD}-${VER}-${REV}.${ARCH}-py${INTERPRETER_VERSION}.zip
+
+ PREFIX=${TMPDIR}/${THIS}
+
+ if test -d "${PREFIX}"; then
+ rm -rf "${PREFIX}"
+ fi
+
+ LOG=${PREFIX}/src/dieterv/${THIS}.log
+ mkdir -p ${PREFIX}/src/dieterv/
+
+ (
+ set -x
+
+ mkdir -p ${DESTDIR}
+ mkdir -p "${PREFIX}"
+
+ cd ${CHECKOUT}/${MOD}-${VER}
+
+ # Copied from tml@iki.fi's build scripts:
+ # Don't do any relinking and don't use any wrappers in libtool. It
+ # just causes trouble, IMHO.
+ sed -e "s/need_relink=yes/need_relink=no # no way --tml/" \
+ -e "s/wrappers_required=yes/wrappers_required=no # no thanks --tml/" \
+ <ltmain.sh >ltmain.temp && mv ltmain.temp ltmain.sh
+
+ lt_cv_deplibs_check_method="pass_all" \
+ CC="gcc -mthreads" \
+ CFLAGS=-O2 \
+ PYTHON_INCLUDES="-I${INTERPRETER}/include/" \
+ PYTHON_LIBS="-L${INTERPRETER}/libs/ -lpython${INTERPRETER_VERSION}" \
+ PYTHON_LIB_LOC="${INTERPRETER}/libs/" \
+ ./configure \
+ --enable-debug=yes \
+ --disable-static \
+ --disable-gnome \
+ --disable-gtk-doc \
+ --enable-python \
+ --disable-static \
+ --prefix="${PREFIX}" &&
+
+ make -j3 install
+ ) 2>&1 | tee "${LOG}"
+
+ # Write a .exe.manifest file...
+ echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>
+<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">
+ <assemblyIdentity version=\"1.0.0.0\"
+ name=\"glade-3.exe\"
+ type=\"win32\" />
+ <dependency>
+ <dependentAssembly>
+ <assemblyIdentity
+ type=\"win32\"
+ name=\"Microsoft.VC90.CRT\"
+ version=\"9.0.21022.8\"
+ processorArchitecture=\"*\"
+ publicKeyToken=\"1fc8b3b9a1e18e3b\" />
+ </dependentAssembly>
+ </dependency>
+</assembly>
+" > "${PREFIX}/bin/glade-3.exe.manifest"
+
+ # We don't need these for modules...
+ rm -rf ${PREFIX}/lib/glade3/modules/*.dll.a
+ rm -rf ${PREFIX}/lib/glade3/modules/*.la
+
+ # Put everything in a zip archive...
+ cd ${PREFIX}
+ zip ${DESTDIR}/${ZIP} -r ./*
+done
View
471 bin/build_installer.py
@@ -37,20 +37,26 @@
from lxml import etree, objectify
-# Known Python target versions
-PYTHON_VERSIONS = ['2.6', '2.7']
-# Set to the target version when merging a Product
-PYTHON_FULLVERSION = None
-PYTHON_VERSION = None
-
# These paths are used all over the place
ROOTDIR = abspath(join(dirname(__file__), '..'))
-ETCDIR = join(ROOTDIR, 'etc')
+WIXDIR = join(ROOTDIR, 'wix')
TMPDIR = join(ROOTDIR, 'tmp')
-VARDIR = join(ROOTDIR, 'var')
-CACHEDIR = join(VARDIR, 'cache')
+CACHEDIR = None
+
+# Everything we need to know about the platform we'll build PyGtk installers
+# for. Also maps human readable identifiers to msi speak...
+PLATFORMS = {'win32': 'x86', 'win64': 'x64'}
+WIN_PLATFORM = None
+WIX_PLATFORM = None
+
+# Everything we need to know about the Python interpreter versions we'll
+# build PyGtk installers for. If these change, you'll need to update the
+# template .wxs file...
+PYTHON_VERSIONS = ['2.6', '2.7']
+PYTHON_FULLVERSION = None
+PYTHON_VERSION = None
-# Everything we need to know about WiX and it's tools
+# Everything we need to know about the WiX toolset...
WIX_VERSION = '3.5.2305.0'
WIX_NAMESPACE = 'http://schemas.microsoft.com/wix/2006/wi'
WIX_NSMAP = {None : WIX_NAMESPACE}
@@ -60,7 +66,7 @@
WIX_CANDLE = None
WIX_LIGHT = None
-# Everything we need to know about xmllint
+# Everything we need to know about xmllint...
XML_LINT_VERSION = 20707
XML_LINT = 'xmllint'
@@ -89,59 +95,50 @@ def xmllint_format(src_file, dest_file, logfile):
process.wait()
file.close()
+def copytree(srcdir, dstdir):
+ srcnames = os.listdir(srcdir)
+
+ for name in srcnames:
+ srcfname = join(srcdir, name)
+ dstfname = join(dstdir, name)
+
+ if isdir(srcfname):
+ if not isdir(dstfname):
+ os.mkdir(dstfname)
+
+ copytree(srcfname, dstfname)
+ elif isfile(srcfname):
+ sf = open(srcfname, 'rb')
+ df = open(dstfname, 'wb')
+ df.write(sf.read())
+ df.close()
+ sf.close()
+
class Builder(object):
def __init__(self, arguments=None):
self.parse_options(arguments)
- self.parse_configuration()
- self.validate_environment()
+ self.validate_environment_wix()
+ self.validate_environment_xmllint()
+ self.load_product()
def parse_options(self, arguments=None):
if arguments == None:
arguments = sys.argv[1:]
- parser = OptionParser(usage='usage: %prog [options] config')
- parser.add_option('-k', '--keep-work',
- action='store_true', dest='keep_work', default=False,
- help='keep working directory after build')
-
+ #TODO: implement a --keep-tmp option?
+ parser = OptionParser(usage='usage: %prog [options] moduleset')
(self.options, self.args) = parser.parse_args(arguments)
if not len(self.args) == 1:
error(parser.get_usage())
- def parse_configuration(self):
- version, platform = self.args[0].split('-')
-
- configfilename = '%s-%s.xml' % (version, platform)
- templatefilename = '%s-%s.template.wxs' % (version, platform)
- configfile = join(ETCDIR, configfilename)
- templatefile = join(ETCDIR, templatefilename)
-
- if not isfile(configfile):
- error('Unable to load configuration file "%s".' % configfile)
-
- if not isfile(templatefile):
- error('Unable to load template file "%s".' % templatefile)
-
- self.config = objectify.parse(configfile).getroot()
- etree.SubElement(self.config, 'version', version=version)
- etree.SubElement(self.config, 'platform', version=platform)
- etree.SubElement(self.config, 'templatefile', path=templatefile)
-
- info('Loaded configuration "%s" (loaded from "%s").' % (version, configfile))
-
- def validate_environment(self):
- self.validate_environment_wix()
- self.validate_environment_xmllint()
-
def validate_environment_wix(self):
global WIX_DIR
global WIX_DARK
global WIX_HEAT
global WIX_CANDLE
global WIX_LIGHT
- global XML_LINT
# Get WiX path from environment variable
if not os.environ.has_key('WIX'):
@@ -170,8 +167,10 @@ def validate_environment_wix(self):
if not int(WIX_VERSION.replace('.', '')) <= int(wix_version.replace('.', '')):
error('Your WiX (version %s) is too old. A mininmum of version %s is required.' % (wix_version, WIX_VERSION))
-
def validate_environment_xmllint(self):
+ #TODO: why global?
+ global XML_LINT
+
try:
output = Popen([XML_LINT,
'--version'],
@@ -187,81 +186,103 @@ def validate_environment_xmllint(self):
if not XML_LINT_VERSION <= int(xml_lint_version):
error('Your xmllint (version %s) is too old. A mininmum of version %s is required.' % (xml_lint_version, XML_LINT_VERSION))
+ def load_product(self):
+ global CACHEDIR
+
+ version = self.args[0]
+ CACHEDIR = join(TMPDIR, 'cache', version)
+ productfile = join(WIXDIR, '%s.xml' % version)
+
+ if not isdir(CACHEDIR):
+ os.makedirs(CACHEDIR)
+
+ if not isfile(productfile):
+ error('Unable to load product "%s".' % productfile)
+
+ self.build = objectify.parse(productfile).getroot()
+ etree.SubElement(self.build, 'Version', Version=version)
+
+ info('Loaded product "%s" (loaded from "%s").' % (version, productfile))
def run(self):
- for child in self.config.interpreters.iterchildren():
- if child.tag == 'interpreter':
- if not child.get('version') in PYTHON_VERSIONS:
- error('Unknown interpreter version (%s).' % child.get('version'))
+ for child in self.build.Interpreters.iterchildren():
+ if child.tag == 'Interpreter':
+ if not child.get('Version') in PYTHON_VERSIONS:
+ error('Unknown interpreter version (%s).' % child.get('Version'))
+ if not child.get('Platform') in PLATFORMS.keys():
+ error('Unknown platform (%s).' % child.get('Platform'))
+
+ global WIN_PLATFORM
+ global WIX_PLATFORM
global PYTHON_FULLVERSION
global PYTHON_VERSION
- PYTHON_FULLVERSION = child.get('version')
- PYTHON_VERSION = child.get('version').replace('.', '')
+ WIN_PLATFORM = child.get('Platform')
+ WIX_PLATFORM = PLATFORMS[child.get('Platform')]
+ PYTHON_FULLVERSION = child.get('Version')
+ PYTHON_VERSION = child.get('Version')
- product = Product(self.config)
+ product = Product(self.build)
product.merge()
class Product(object):
- def __init__(self, config):
- self.config = config
- self.version = self.config.version.get('version')
- self.platform = self.config.platform.get('version')
- self.templatefile = self.config.templatefile.get('path')
- self.packageid = 'pygtk-all-in-one-%s.%s-py%s' % (self.version, self.platform, PYTHON_FULLVERSION)
-
- self.workdir = join(TMPDIR, PYTHON_FULLVERSION, self.packageid)
+ def __init__(self, build):
+ self.build = build
+ self.version = self.build.Version.get('Version')
+ self.packageid = 'pygtk-all-in-one-%s.%s-py%s' % (self.version, WIN_PLATFORM, PYTHON_FULLVERSION)
+ self.builddir = join(TMPDIR, 'build', '%s-%s' % (PYTHON_FULLVERSION, WIN_PLATFORM), self.packageid)
self.wxsfilename = '%s.wxs' % self.packageid
self.wixobjfilename = '%s.wixobj' % self.packageid
self.msifilename = '%s.msi' % self.packageid
- self.tmpwxsfile = join(self.workdir, '%s.unformatted' % self.wxsfilename)
- self.wxsfile = join(self.workdir, self.wxsfilename)
- self.wixobjfile = join(self.workdir, self.wixobjfilename)
- self.msifile = join(self.workdir, self.msifilename)
+ self.tmpwxsfile = join(self.builddir, '%s.unformatted' % self.wxsfilename)
+ self.wxsfile = join(self.builddir, self.wxsfilename)
+ self.wixobjfile = join(self.builddir, self.wixobjfilename)
+ self.msifile = join(self.builddir, self.msifilename)
def merge(self):
info('Creating .msi installer targeting Python %s' % PYTHON_FULLVERSION)
self.clean()
self.prepare()
- self.build()
+ self.build_()
self.transform()
+ self.validate()
self.compile()
self.link()
info('Success: .msi installer targeting Python %s has been created ("%s")' % (PYTHON_FULLVERSION, self.msifile))
def clean(self):
- allworkdirs = join(TMPDIR, PYTHON_FULLVERSION)
-
- if isdir(allworkdirs):
- rmtree(allworkdirs)
+ # This removes all workdirs!
+ if isdir(join(self.builddir, '..')):
+ rmtree(join(self.builddir, '..'))
def prepare(self):
- if not isdir(self.workdir):
- os.makedirs(self.workdir)
+ if not isdir(self.builddir):
+ os.makedirs(self.builddir)
- copyfile(self.templatefile, self.wxsfile)
+ copytree(join(WIXDIR, 'template'), self.builddir)
+ os.rename(join(self.builddir, 'PyGTK.wxs'), self.wxsfile)
- def build(self):
- for child in self.config.product.features.iterchildren():
- if child.tag == 'feature':
+ def build_(self):
+ for child in self.build.Product.Features.iterchildren():
+ if child.tag == 'Feature':
self.build_feature(child)
else:
info('Unknown child element in Features: "%s".' % child.tag, 1)
def build_feature(self, feature):
- info('Preparing features for "%s"...' % feature.get('id'), 1)
+ info('Preparing feature "%s"...' % feature.get('Id'), 1)
for child in feature.iterchildren():
- if child.tag == 'feature':
+ if child.tag == 'Feature':
self.build_feature(child)
- elif child.tag == 'package':
- info('Preparing source package "%s"' % child.get('id'), 2)
+ elif child.tag == 'Package':
+ info('Preparing source package "%s"' % child.get('Id'), 2)
- sourcepackage = SourcePackage.from_packagetype(self.config, child)
+ sourcepackage = SourcePackage.from_packagetype(self.build, child)
sourcepackage.merge()
def transform(self):
@@ -290,73 +311,67 @@ def transform_variables(self, element):
#TODO: child.tag seems to be a function for Comment and
# ProcessingInstruction elements? Feels dirty :(
if 'ProcessingInstruction' in str(child.tag):
- if 'PythonVersion' in child.text:
+ if 'SrcImages' in child.text:
+ child.text = child.text.replace('XXX', join(WIXDIR, 'images'))
+ elif 'Platform' in child.text:
+ child.text = child.text.replace('XXX', WIX_PLATFORM)
+ elif 'PythonVersion' in child.text:
child.text = child.text.replace('XXX', PYTHON_FULLVERSION)
- elif 'ProductName' in child.text:
- productname = 'Python %s %s' % (PYTHON_FULLVERSION, self.config.product.get('name'))
- child.text = child.text.replace('XXX', productname)
elif 'ProductVersion' in child.text:
child.text = child.text.replace('XXX', self.version)
- elif 'UpgradeCode' in child.text:
- upgradecode = self.config.product.get('upgradecode_%s' % PYTHON_VERSION)
- child.text = child.text.replace('XXX', upgradecode)
def transform_includes(self, element):
#TODO: there has to be a better way to get at elements than .find + .getnext... XPath???
product = element.find('{%s}Product' % WIX_NAMESPACE)
FEATURE = product.find('{%s}Feature' % WIX_NAMESPACE)
+ assert FEATURE.get('Id') == 'PyGTKAllInOne'
def transform(element):
for child in element.iterchildren():
- if child.tag == 'feature':
+ if child.tag == 'Feature':
transform(child)
- elif child.tag == 'package':
+ elif child.tag == 'Package':
pi = etree.ProcessingInstruction('include', child.get('wxifile_%s' % PYTHON_VERSION))
FEATURE.addprevious(pi)
- for child in self.config.product.features.iterchildren():
+ for child in self.build.Product.Features.iterchildren():
transform(child)
def transform_features(self, element):
- #TODO: there has to be a better way to get at elements than .find + .getnext... XPath???
product = element.find('{%s}Product' % WIX_NAMESPACE)
- TARGETDIR = product.find('{%s}Directory' % WIX_NAMESPACE)
FEATURE = product.find('{%s}Feature' % WIX_NAMESPACE)
- FEATUREV = FEATURE.getnext()
- FEATUREX = FEATUREV.getnext()
+ assert FEATURE.get('Id') == 'PyGTKAllInOne'
- def transform(element, PARENT, PARENTV, PARENTX):
- if element.tag == 'feature':
- parent = etree.SubElement(PARENT,
+ def transform(element, PARENT):
+ if element.tag == 'Feature':
+ feature = etree.SubElement(PARENT,
'Feature',
- Id = element.get('id'),
- Title = element.get('title'),
- Description = element.get('description'),
- Level = PARENT.get('Level'))
- parentv = etree.SubElement(PARENTV,
- 'Feature',
- Id = '%s%s' % (element.get('id'), PYTHON_FULLVERSION),
- Title = element.get('title'),
- Description = element.get('description'),
- Level = PARENTV.get('Level'))
- parentx = etree.SubElement(PARENTX,
- 'Feature',
- Id = '%sX' % element.get('id'),
- Title = element.get('title'),
- Description = element.get('description'),
- Level = PARENTX.get('Level'))
+ Id = element.get('Id'),
+ Title = element.get('Title'),
+ Description = element.get('Description'),
+ Level = PARENT.get('Level'),
+ AllowAdvertise = 'no')
+
+ if 'Absent' in element.keys():
+ feature.set('Absent', element.get('Absent'))
+
+ if 'Display' in element.keys():
+ feature.set('Display', element.get('Display'))
+
+ if 'InstallDefault' in element.keys():
+ feature.set('InstallDefault', element.get('InstallDefault'))
+
+ if 'Level' in element.keys():
+ feature.set('Level', element.get('Level'))
+
for child in element.iterchildren():
- transform(child, parent, parentv, parentx)
+ transform(child, feature)
- elif element.tag == 'package':
+ elif element.tag == 'Package':
wxifile = element.get('wxifile_%s' % PYTHON_VERSION)
iroot = etree.parse(wxifile).getroot()
- ITARGETDIRV = iroot.find('{%s}DirectoryRef' % WIX_NAMESPACE)
- assert ITARGETDIRV.get('Id') == 'TARGETDIR%s' % PYTHON_FULLVERSION
- ITARGETDIRX = ITARGETDIRV.getnext()
- assert ITARGETDIRX.get('Id') == 'TARGETDIRX'
- ITARGETDIR = ITARGETDIRX.getnext()
+ ITARGETDIR = iroot.find('{%s}DirectoryRef' % WIX_NAMESPACE)
assert ITARGETDIR.get('Id') == 'TARGETDIR'
def traverse(child, parent):
@@ -366,28 +381,31 @@ def traverse(child, parent):
for x in child:
traverse(x, parent)
- for vchild in ITARGETDIRV.iterchildren():
- traverse(vchild, PARENTV)
-
- for xchild in ITARGETDIRX.iterchildren():
- traverse(xchild, PARENTX)
-
for ichild in ITARGETDIR.iterchildren():
traverse(ichild, PARENT)
- for child in self.config.product.features.iterchildren():
- transform(child, FEATURE, FEATUREV, FEATUREX)
+ for child in self.build.Product.Features.iterchildren():
+ transform(child, FEATURE)
def transform_reformat(self):
- xmllint_format(self.tmpwxsfile, self.wxsfile, join(self.workdir, 'xmllint.log'))
+ xmllint_format(self.tmpwxsfile, self.wxsfile, join(self.builddir, 'xmllint.log'))
+
+ def validate(self):
+ info('Validating variable transformations...', 1)
+ self.validate_variables()
+
+ def validate_variables(self):
+ #TODO: make sure the generated .wxs file no longer contains "XXX"
+ pass
def compile(self):
- info('Compiling sources...', 3)
+ info('Compiling sources...', 1)
- logfile = join(self.workdir, 'candle.log')
+ logfile = join(self.builddir, 'candle.log')
file = open(logfile, 'w')
process = Popen([WIX_CANDLE,
'-nologo',
+ '-wx',
self.wxsfile,
'-out',
self.wixobjfile],
@@ -396,17 +414,21 @@ def compile(self):
universal_newlines=True)
if process.wait() != 0:
- info('WiX "candle" reported error(s). Please review "%s".' % logfile, 4)
+ error('WiX "candle" reported error(s). Please review "%s".' % logfile, 1)
file.close()
def link(self):
- info('Linking objects...', 3)
+ info('Linking objects...', 1)
- logfile = join(self.workdir, 'light.log')
+ logfile = join(self.builddir, 'light.log')
file = open(logfile, 'w')
process = Popen([WIX_LIGHT,
'-nologo',
+ '-wx',
+ '-ext',
+ 'WixUIExtension',
+ '-cultures:en-us',
self.wixobjfile,
'-out',
self.msifile],
@@ -415,35 +437,35 @@ def link(self):
universal_newlines=True)
if process.wait() != 0:
- info('WiX "light" reported error(s). Please review "%s".' % logfile, 4)
+ error('WiX "light" reported error(s). Please review "%s".' % logfile, 1)
file.close()
class SourcePackage(object):
@staticmethod
- def from_packagetype(config, package):
- packagetype = package.get('type')
+ def from_packagetype(product, package):
+ packagetype = package.get('Type')
for subclass in SourcePackage.__subclasses__():
if subclass.__name__ == packagetype:
- return subclass(config, package)
+ return subclass(product, package)
else:
error('Unknown source package type "%s".' % packagetype)
- def __init__(self, config, package):
- self.config = config
+ def __init__(self, build, package):
+ self.build = build
self.package = package
- if not self.package.get('url').endswith('/'):
- self.package.set('url', '%s/' % self.package.get('url'))
+ if not self.package.get('Url').endswith('/'):
+ self.package.set('Url', '%s/' % self.package.get('Url'))
self.cachefile = join(CACHEDIR, self.filename)
- self.overlaydir = join(VARDIR, 'overlays', self.config.version.get('version'), self.package.get('id'))
- self.workdir = join(TMPDIR, PYTHON_FULLVERSION, self.package.get('id'))
- self.wxsfile = join(self.workdir, '%s.wxs' % self.package.get('id'))
- self.tmpwxifile = join(self.workdir, '%s.wxi.unformatted' % self.package.get('id'))
- self.wxifile = join(self.workdir, '%s.wxi' % self.package.get('id'))
+ self.overlaydir = join(WIXDIR, 'overlays', self.package.get('Id'))
+ self.builddir = join(TMPDIR, 'build', '%s-%s' % (PYTHON_FULLVERSION, WIN_PLATFORM), self.package.get('Id'))
+ self.wxsfile = join(self.builddir, '%s.wxs' % self.package.get('Id'))
+ self.tmpwxifile = join(self.builddir, '%s.wxi.unformatted' % self.package.get('Id'))
+ self.wxifile = join(self.builddir, '%s.wxi' % self.package.get('Id'))
self.package.set('wxifile_%s' % PYTHON_VERSION, self.wxifile)
@@ -470,24 +492,21 @@ def merge(self):
self.fetch()
self.unpack()
self.patch()
- self.build()
+ self.build_()
self.transform()
self.save_include()
def clean(self):
info('Cleaning build environment...', 3)
- if isdir(self.workdir):
- rmtree(self.workdir)
+ if isdir(self.builddir):
+ rmtree(self.builddir)
def prepare(self):
info('Preparing build environment...', 3)
- if not isdir(self.workdir):
- os.makedirs(self.workdir)
-
- if not isdir(CACHEDIR):
- os.makedirs(CACHEDIR)
+ if not isdir(self.builddir):
+ os.makedirs(self.builddir)
def _fetch_from_cache(self):
if isfile(self.cachefile):
@@ -505,7 +524,7 @@ def fetch(self):
info('Fetching package sources...', 3)
if not self._fetch_from_cache():
- url = self.package.get('url') + self.filename
+ url = self.package.get('Url') + self.filename
try:
info('Downloading package sources...', 4)
@@ -525,95 +544,15 @@ def unpack(self):
def patch(self):
info('Applying overlay...', 3)
- def copytree(srcdir, dstdir):
- srcnames = os.listdir(srcdir)
-
- for name in srcnames:
- srcfname = join(srcdir, name)
- dstfname = join(dstdir, name)
-
- if isdir(srcfname):
- if not isdir(dstfname):
- os.mkdir(dstfname)
-
- copytree(srcfname, dstfname)
- elif isfile(srcfname):
- sf = open(srcfname, 'rb')
- df = open(dstfname, 'wb')
- df.write(sf.read())
- df.close()
- sf.close()
-
if isdir(self.overlaydir):
- copytree(self.overlaydir, join(self.workdir, 'File'))
+ copytree(self.overlaydir, join(self.builddir, 'File'))
- def build(self):
+ def build_(self):
raise NotImplementedError
def transform(self):
raise NotImplementedError
- def transform_create_targetdirs(self, element):
- '''
- We need to create a new "Directory" "TARGETDIR$(var.PythonVersion)" and a
- new "Directory" "TARGETDIRX", where both mirror all:
- - "Directory" nodes from "TARGETDIR" with an adapted "Id"
- - "Component" nodes from "TARGETDIR" with an adapted "Id" and a newly generated "Guid"
- - "File" nodes from "TARGETDIR" into a "CopyFile" node, with an an adapted "ID"
-
- This needs to be done for .msi files generated by Python 2.6 distutils
- as they simply don't exist an all other known Python versions' distutils
- because the don't include "RemoveFile" elements...
- '''
- TARGETDIRV = etree.Element('DirectoryRef', Id='TARGETDIR%s' % PYTHON_FULLVERSION)
- TARGETDIRX = etree.Element('DirectoryRef', Id='TARGETDIRX')
-
- def transform(source, dest, suffix, directory=None):
- for child in source:
- if child.tag == '{%s}DirectoryRef' % WIX_NAMESPACE:
- transform(child, dest, suffix, child)
-
- elif child.tag == '{%s}Directory' % WIX_NAMESPACE:
- newchild = etree.SubElement(dest,
- 'Directory',
- Id = '%s%s' % (child.get('Id'), suffix),
- Name = child.get('Name'))
-
- transform(child, newchild, suffix, newchild)
-
- elif child.tag == '{%s}Component' % WIX_NAMESPACE:
- newchild = etree.SubElement(dest,
- 'Component',
- Id = '%s%s' % (child.get('Id'), suffix),
- Guid = generate_uuid())
-
- if 'KeyPath' in child.keys():
- newchild.set('KeyPath', child.get('KeyPath'))
- else:
- newchild.set('KeyPath', 'yes')
-
- transform(child, newchild, suffix, directory)
-
- elif child.tag == '{%s}File' % WIX_NAMESPACE:
- newchild = etree.SubElement(dest,
- 'CopyFile',
- Id = '%s%s' % (child.get('Id'), suffix),
- FileId = child.get('Id'),
- DestinationDirectory = directory.get('Id'))
-
- elif child.tag == '{%s}RemoveFile' % WIX_NAMESPACE:
- newchild = etree.SubElement(dest,
- 'RemoveFile',
- Id = '%s%s' % (child.get('Id'), suffix),
- Directory = '%s%s' % (child.get('Directory'), suffix),
- Name = child.get('Name'),
- On = child.get('On'))
-
- transform(element, TARGETDIRV, PYTHON_FULLVERSION)
- transform(element, TARGETDIRX, 'X')
- element.insert(0, TARGETDIRV)
- element.insert(1, TARGETDIRX)
-
def transform_id(self, element, prefix=''):
'''
Prepend Id attributes with prefix to ensure unique Id's
@@ -621,7 +560,7 @@ def transform_id(self, element, prefix=''):
FileId and DestinationDirectory.
'''
- prefix = '%s_' % self.package.get('id')
+ prefix = '%s_' % self.package.get('Id')
def transform(element):
if 'Id' in element.keys():
@@ -652,29 +591,29 @@ def save_include(self):
# Reformat saved .wxi file
info('Reformatting .wxi file...', 4)
- xmllint_format(self.tmpwxifile, self.wxifile, join(self.workdir, 'xmllint.log'))
+ xmllint_format(self.tmpwxifile, self.wxifile, join(self.builddir, 'xmllint.log'))
class MsiSourcePackage(SourcePackage):
- def __init__(self, config, package):
+ def __init__(self, product, package):
if PYTHON_FULLVERSION == '2.6':
- self.filename = package.get('msi_26')
- self.digest = package.get('digest_26')
+ self.filename = package.get('Msi_26')
+ self.digest = package.get('Digest_26')
elif PYTHON_FULLVERSION == '2.7':
- self.filename = package.get('msi_27')
- self.digest = package.get('digest_27')
+ self.filename = package.get('Msi_27')
+ self.digest = package.get('Digest_27')
- SourcePackage.__init__(self, config, package)
+ SourcePackage.__init__(self, product, package)
def unpack(self):
info('Unpacking package sources...', 3)
- logfile = join(self.workdir, 'dark.log')
+ logfile = join(self.builddir, 'dark.log')
file = open(logfile, 'w')
process = Popen([WIX_DARK,
'-nologo',
'-x', # export binaries from cabinets and embedded binaries
- self.workdir , # to our workdir
+ self.builddir , # to our workdir
self.cachefile, # decompile this .msi file
self.wxsfile], # save to this .wxs file
stdout=file,
@@ -686,7 +625,7 @@ def unpack(self):
file.close()
- def build(self):
+ def build_(self):
info('Creating .wxi include file...', 3)
# Get the Wix/Product/Directory node
@@ -708,9 +647,6 @@ def transform(self):
info('Removing "TARGETDIR%s" and "TARGETDIRX"' % PYTHON_FULLVERSION, 4)
self.transform_remove_targetdirs(self.include)
- info('Creating "TARGETDIR%s" and "TARGETDIRX"' % PYTHON_FULLVERSION, 4)
- self.transform_create_targetdirs(self.include)
-
info('Transforming "Id" attributes...', 4)
self.transform_id(self.include)
@@ -745,30 +681,38 @@ def transform(element):
class ArchiveSourcePackage(SourcePackage):
- def __init__(self, config, package):
- self.filename = package.get('archive')
- self.digest = package.get('digest')
+ def __init__(self, product, package):
+ if 'archive' in package.keys():
+ self.filename = package.get('archive')
+ self.digest = package.get('digest')
+ else:
+ if PYTHON_FULLVERSION == '2.6':
+ self.filename = package.get('Archive_26')
+ self.digest = package.get('Digest_26')
+ elif PYTHON_FULLVERSION == '2.7':
+ self.filename = package.get('Archive_27')
+ self.digest = package.get('Digest_27')
- SourcePackage.__init__(self, config, package)
+ SourcePackage.__init__(self, product, package)
def unpack(self):
info('Unpacking package sources...', 3)
zipfile = ZipFile(self.cachefile)
- zipfile.extractall(join(self.workdir, 'File'))
+ zipfile.extractall(join(self.builddir, 'File'))
zipfile.close()
- def build(self):
+ def build_(self):
info('Creating .wxi include file...', 3)
- sourcedir = 'var.%s_sourcedir' % self.package.get('id')
+ sourcedir = 'var.%s_sourcedir' % self.package.get('Id')
- logfile = join(self.workdir, 'heat.log')
+ logfile = join(self.builddir, 'heat.log')
file = open(logfile, 'w')
process = Popen([WIX_HEAT,
'dir', # harvest a directory
- join(self.workdir, 'File'), # from the directory where we extracted our source package
+ join(self.builddir, 'File'), # from the directory where we extracted our source package
'-nologo',
'-dr', # set directory reference to root directories
'TARGETDIR', # to TARGETDIR
@@ -820,9 +764,6 @@ def build(self):
self.include = newroot
def transform(self):
- info('Creating "TARGETDIR%s" and "TARGETDIRX"' % PYTHON_FULLVERSION, 4)
- self.transform_create_targetdirs(self.include)
-
info('Transforming "Id" attributes...', 4)
self.transform_id(self.include)
@@ -830,7 +771,7 @@ def transform(self):
self.transform_variables(self.include)
def transform_variables(self, element):
- pi = etree.ProcessingInstruction('define', '%s_sourcedir = "%s"' % (self.package.get('id'), join(self.workdir, 'File')))
+ pi = etree.ProcessingInstruction('define', '%s_sourcedir = "%s"' % (self.package.get('Id'), join(self.builddir, 'File')))
element.insert(0, pi)
View
526 etc/2.22.0.0-win32.template.wxs
@@ -1,526 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-
- <!-- These variables are changed by the build script -->
- <?define PythonVersion = "XXX" ?>
- <?define ProductName = "XXX" ?>
- <?define ProductVersion = "XXX" ?>
- <?define UpgradeCode = "XXX" ?>
- <?define Manufacturer = "http://www.pygtk.org/" ?>
- <?define ManufacturerContact = "XXX@XXX.XXX" ?>
-
- <!-- TODO: Uncomment the following after initial release
- <?define OriginalProductVersion = "2.26.0.0" ?> -->
-
- <Product Id="*"
- Language="1033"
- Manufacturer="$(var.Manufacturer)"
- Name="$(var.ProductName)"
- Version="$(var.ProductVersion)"
- UpgradeCode="$(var.UpgradeCode)">
-
- <Package Comments="$(var.ProductName) Windows Installer Database"
- Compressed="yes"
- Description="Python $(var.PythonVersion) $(var.ProductName)"
- InstallerVersion="200"
- Keywords="Installer,MSI,Database"
- Languages="1033"
- Manufacturer="$(var.Manufacturer)"
- Platform="x86"
- ReadOnly="yes"/>
-
- <!-- TODO: Uncomment the following after initial release
- <Upgrade Id="$(var.UpgradeCode)">
- <UpgradeVersion IncludeMinimum="no"
- Minimum='$(var.ProductVersion)'
- OnlyDetect='yes'
- Property='NEWPRODUCTFOUND' />
-
- <UpgradeVersion IncludeMinimum="yes"
- Maximum='$(var.ProductVersion)'
- Minimum='$(var.OriginalProductVersion)'
- Property='UPGRADEFOUND' />
- </Upgrade>-->
-
- <!-- TODO: Do we want a custom installer icon?
- <Icon Id="gnome.ico" SourceFile="XXX"/>
- <Property Id="ARPPRODUCTICON" Value="gnome.ico" />
- -->
-
- <Media Id="1"
- Cabinet="distfiles"
- CompressionLevel="high"
- EmbedCab="yes" />
-
- <Property Id="DistVersion" Value="$(var.ProductVersion)" />
- <Property Id="ARPCONTACT" Value="$(var.ManufacturerContact)" />
- <Property Id="ARPURLINFOABOUT" Value="$(var.Manufacturer)" />
- <Property Id="DefaultUIFont" Value="DlgFont8" />
- <Property Id="ErrorDialog" Value="ErrorDlg" />
- <Property Id="Progress1" Value="Install" />
- <Property Id="Progress2" Value="installs" />
- <Property Id="MaintenanceForm_Action" Value="Repair" />
- <Property Id="WhichUsers" Value="ALL" />
- <Property Id="PYTHON.MACHINE">
- <RegistrySearch Id="python.machine" Root="HKLM" Key="SOFTWARE\Python\PythonCore\$(var.PythonVersion)\InstallPath" Type="raw" />
- </Property>
- <Property Id="PYTHON.USER">
- <RegistrySearch Id="python.user" Root="HKCU" Key="SOFTWARE\Python\PythonCore\$(var.PythonVersion)\InstallPath" Type="raw" />
- </Property>
-
- <CustomAction Id="PreventDowngrading" Error="A newer version is already installed." />
- <CustomAction Id="PythonFromMachine" Property="TARGETDIR$(var.PythonVersion)" Value="[PYTHON.MACHINE]" Execute="firstSequence" />
- <CustomAction Id="PythonFromUser" Property="TARGETDIR$(var.PythonVersion)" Value="[PYTHON.USER]" Execute="firstSequence" />
- <CustomAction Id="PythonExe" Property="PYTHON$(var.PythonVersion)" Value="[TARGETDIR$(var.PythonVersion)]\python.exe" Execute="firstSequence" />
-
- <InstallExecuteSequence>
- <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
- <Custom Action="PythonFromMachine" Sequence="402">PYTHON.MACHINE</Custom>
- <Custom Action="PythonFromUser" Sequence="403">PYTHON.USER</Custom>
- <Custom Action="PythonExe" Sequence="404" />
- <LaunchConditions Sequence="100" />
- <FindRelatedProducts Sequence="200" />
- <AppSearch Sequence="400" />
- <CCPSearch Sequence="500">NOT Installed</CCPSearch>
- <RMCCPSearch Sequence="600">NOT Installed</RMCCPSearch>
- <ValidateProductID Sequence="700" />
- <CostInitialize Sequence="800" />
- <FileCost Sequence="900" />
- <IsolateComponents Sequence="950" />
- <CostFinalize Sequence="1000" />
- <SetODBCFolders Sequence="1100" />
- <MigrateFeatureStates Sequence="1200" />
- <InstallValidate Sequence="1400" />
- <InstallInitialize Sequence="1500" />
- <AllocateRegistrySpace Sequence="1550">NOT Installed</AllocateRegistrySpace>
- <ProcessComponents Sequence="1600" />
- <UnpublishComponents Sequence="1700" />
- <UnpublishFeatures Sequence="1800" />
- <StopServices Sequence="1900">VersionNT</StopServices>
- <DeleteServices Sequence="2000">VersionNT</DeleteServices>
- <UnregisterComPlus Sequence="2100" />
- <SelfUnregModules Sequence="2200" />
- <UnregisterTypeLibraries Sequence="2300" />
- <RemoveODBC Sequence="2400" />
- <UnregisterFonts Sequence="2500" />
- <RemoveRegistryValues Sequence="2600" />
- <UnregisterClassInfo Sequence="2700" />
- <UnregisterExtensionInfo Sequence="2800" />
- <UnregisterProgIdInfo Sequence="2900" />
- <UnregisterMIMEInfo Sequence="3000" />
- <RemoveIniValues Sequence="3100" />
- <RemoveShortcuts Sequence="3200" />
- <RemoveEnvironmentStrings Sequence="3300" />
- <RemoveDuplicateFiles Sequence="3400" />
- <RemoveFiles Sequence="3500" />
- <RemoveFolders Sequence="3600" />
- <CreateFolders Sequence="3700" />
- <MoveFiles Sequence="3800" />
- <InstallFiles Sequence="4000" />
- <DuplicateFiles Sequence="4210" />
- <PatchFiles Sequence="4090" />
- <BindImage Sequence="4300" />
- <CreateShortcuts Sequence="4500" />
- <RegisterClassInfo Sequence="4600" />
- <RegisterExtensionInfo Sequence="4700" />
- <RegisterProgIdInfo Sequence="4800" />
- <RegisterMIMEInfo Sequence="4900" />
- <WriteRegistryValues Sequence="5000" />
- <WriteIniValues Sequence="5100" />
- <WriteEnvironmentStrings Sequence="5200" />
- <RegisterFonts Sequence="5300" />
- <InstallODBC Sequence="5400" />
- <RegisterTypeLibraries Sequence="5500" />
- <SelfRegModules Sequence="5600" />
- <RegisterComPlus Sequence="5700" />
- <InstallServices Sequence="5800">VersionNT</InstallServices>
- <StartServices Sequence="5900">VersionNT</StartServices>
- <RegisterUser Sequence="6000" />
- <RegisterProduct Sequence="6100" />
- <PublishComponents Sequence="6200" />
- <PublishFeatures Sequence="6300" />
- <PublishProduct Sequence="6400" />
- <InstallFinalize Sequence="6600" />
- <RemoveExistingProducts Sequence="6700" />
- <MsiPublishAssemblies Sequence="6250" />
- <MsiUnpublishAssemblies Sequence="1750" />
- </InstallExecuteSequence>
-
- <InstallUISequence>
- <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
- <Custom Action="PythonFromMachine" Sequence="402">PYTHON.MACHINE</Custom>
- <Custom Action="PythonFromUser" Sequence="403">PYTHON.USER</Custom>
- <Custom Action="PythonExe" Sequence="404" />
- <Show Dialog="FatalError" OnExit="error" />
- <Show Dialog="UserExit" OnExit="cancel" />
- <Show Dialog="ExitDialog" OnExit="success" />
- <Show Dialog="PrepareDlg" Sequence="140">Not Privileged or Windows9x or Installed</Show>
- <Show Dialog="WhichUsersDlg" Sequence="141">Privileged and not Windows9x and not Installed</Show>
- <Show Dialog="SelectFeaturesDlg" Sequence="1230">Not Installed</Show>
- <Show Dialog="MaintenanceTypeDlg" Sequence="1250">Installed AND NOT RESUME AND NOT Preselected</Show>
- <Show Dialog="ProgressDlg" Sequence="1280" />
- <LaunchConditions Sequence="100" />
- <FindRelatedProducts Sequence="200" />
- <AppSearch Sequence="400" />
- <CCPSearch Sequence="500">NOT Installed</CCPSearch>
- <RMCCPSearch Sequence="600">NOT Installed</RMCCPSearch>
- <ValidateProductID Sequence="700" />
- <CostInitialize Sequence="800" />
- <FileCost Sequence="900" />
- <IsolateComponents Sequence="950" />
- <CostFinalize Sequence="1000" />
- <MigrateFeatureStates Sequence="1200" />
- <ExecuteAction Sequence="1300" />
- </InstallUISequence>
-
- <AdminUISequence>
- <Show Dialog="FatalError" OnExit="error" />
- <Show Dialog="UserExit" OnExit="cancel" />
- <Show Dialog="ExitDialog" OnExit="success" />
- </AdminUISequence>
-
- <UI>
- <ProgressText Action="AppSearch" Template="Property: [1], Signature: [2]">Searching for installed applications</ProgressText>
- <ProgressText Action="BindImage" Template="File: [1]">Binding executables</ProgressText>
- <ProgressText Action="CCPSearch">Searching for qualifying products</ProgressText>
- <ProgressText Action="InstallFiles" Template="File: [1], Directory: [9], Size: [6]">Copying new files</ProgressText>
- <ProgressText Action="InstallAdminPackage" Template="File: [1], Directory: [9], Size: [6]">Copying network install files</ProgressText>
- <ProgressText Action="FileCost">Computing space requirements</ProgressText>
- <ProgressText Action="CostInitialize">Computing space requirements</ProgressText>
- <ProgressText Action="CostFinalize">Computing space requirements</ProgressText>
- <ProgressText Action="InstallValidate">Validating install</ProgressText>
- <ProgressText Action="CreateShortcuts" Template="Shortcut: [1]">Creating shortcuts</ProgressText>
- <ProgressText Action="MsiPublishAssemblies" Template="Application Context:[1], Assembly Name:[2]">Publishing assembly information</ProgressText>
- <ProgressText Action="PublishComponents" Template="Component ID: [1], Qualifier: [2]">Publishing Qualified Components</ProgressText>
- <ProgressText Action="PublishFeatures" Template="Feature: [1]">Publishing Product Features</ProgressText>
- <ProgressText Action="PublishProduct">Publishing product information</ProgressText>
- <ProgressText Action="RegisterClassInfo" Template="Class Id: [1]">Registering Class servers</ProgressText>
- <ProgressText Action="RegisterExtensionInfo" Template="Extension: [1]">Registering extension servers</ProgressText>
- <ProgressText Action="RegisterMIMEInfo" Template="MIME Content Type: [1], Extension: [2]">Registering MIME info</ProgressText>
- <ProgressText Action="RegisterProgIdInfo" Template="ProgId: [1]">Registering program identifiers</ProgressText>
- <ProgressText Action="AllocateRegistrySpace" Template="Free space: [1]">Allocating registry space</ProgressText>
- <ProgressText Action="CreateFolders" Template="Folder: [1]">Creating folders</ProgressText>
- <ProgressText Action="DeleteServices" Template="Service: [1]">Deleting services</ProgressText>
- <ProgressText Action="DuplicateFiles" Template="File: [1], Directory: [9], Size: [6]">Creating duplicate files</ProgressText>
- <ProgressText Action="FindRelatedProducts" Template="Found application: [1]">Searching for related applications</ProgressText>
- <ProgressText Action="InstallODBC">Installing ODBC components</ProgressText>
- <ProgressText Action="InstallServices" Template="Service: [2]">Installing new services</ProgressText>
- <ProgressText Action="LaunchConditions">Evaluating launch conditions</ProgressText>
- <ProgressText Action="MigrateFeatureStates" Template="Application: [1]">Migrating feature states from related applications</ProgressText>
- <ProgressText Action="MoveFiles" Template="File: [1], Directory: [9], Size: [6]">Moving files</ProgressText>
- <ProgressText Action="PatchFiles" Template="File: [1], Directory: [2], Size: [3]">Patching files</ProgressText>
- <ProgressText Action="ProcessComponents">Updating component registration</ProgressText>
- <ProgressText Action="RegisterComPlus" Template="AppId: [1]{{, AppType: [2], Users: [3], RSN: [4]}}">Registering COM+ Applications and Components</ProgressText>
- <ProgressText Action="RegisterFonts" Template="Font: [1]">Registering fonts</ProgressText>
- <ProgressText Action="RegisterProduct" Template="[1]">Registering product</ProgressText>
- <ProgressText Action="RegisterTypeLibraries" Template="LibID: [1]">Registering type libraries</ProgressText>
- <ProgressText Action="RegisterUser" Template="[1]">Registering user</ProgressText>
- <ProgressText Action="RemoveDuplicateFiles" Template="File: [1], Directory: [9]">Removing duplicated files</ProgressText>
- <ProgressText Action="RemoveEnvironmentStrings" Template="Name: [1], Value: [2], Action [3]">Updating environment strings</ProgressText>
- <ProgressText Action="RemoveExistingProducts" Template="Application: [1], Command line: [2]">Removing applications</ProgressText>
- <ProgressText Action="RemoveFiles" Template="File: [1], Directory: [9]">Removing files</ProgressText>
- <ProgressText Action="RemoveFolders" Template="Folder: [1]">Removing folders</ProgressText>
- <ProgressText Action="RemoveIniValues" Template="File: [1], Section: [2], Key: [3], Value: [4]">Removing INI files entries</ProgressText>
- <ProgressText Action="RemoveODBC">Removing ODBC components</ProgressText>
- <ProgressText Action="RemoveRegistryValues" Template="Key: [1], Name: [2]">Removing system registry values</ProgressText>
- <ProgressText Action="RemoveShortcuts" Template="Shortcut: [1]">Removing shortcuts</ProgressText>
- <ProgressText Action="RMCCPSearch">Searching for qualifying products</ProgressText>
- <ProgressText Action="SelfRegModules" Template="File: [1], Folder: [2]">Registering modules</ProgressText>
- <ProgressText Action="SelfUnregModules" Template="File: [1], Folder: [2]">Unregistering modules</ProgressText>
- <ProgressText Action="SetODBCFolders">Initializing ODBC directories</ProgressText>
- <ProgressText Action="StartServices" Template="Service: [1]">Starting services</ProgressText>
- <ProgressText Action="StopServices" Template="Service: [1]">Stopping services</ProgressText>
- <ProgressText Action="MsiUnpublishAssemblies" Template="Application Context:[1], Assembly Name:[2]">Unpublishing assembly information</ProgressText>
- <ProgressText Action="UnpublishComponents" Template="Component ID: [1], Qualifier: [2]">Unpublishing Qualified Components</ProgressText>
- <ProgressText Action="UnpublishFeatures" Template="Feature: [1]">Unpublishing Product Features</ProgressText>
- <ProgressText Action="UnregisterClassInfo" Template="Class Id: [1]">Unregister Class servers</ProgressText>
- <ProgressText Action="UnregisterComPlus" Template="AppId: [1]{{, AppType: [2]}}">Unregistering COM+ Applications and Components</ProgressText>
- <ProgressText Action="UnregisterExtensionInfo" Template="Extension: [1]">Unregistering extension servers</ProgressText>
- <ProgressText Action="UnregisterFonts" Template="Font: [1]">Unregistering fonts</ProgressText>
- <ProgressText Action="UnregisterMIMEInfo" Template="MIME Content Type: [1], Extension: [2]">Unregistering MIME info</ProgressText>
- <ProgressText Action="UnregisterProgIdInfo" Template="ProgId: [1]">Unregistering program identifiers</ProgressText>
- <ProgressText Action="UnregisterTypeLibraries" Template="LibID: [1]">Unregistering type libraries</ProgressText>
- <ProgressText Action="WriteEnvironmentStrings" Template="Name: [1], Value: [2], Action [3]">Updating environment strings</ProgressText>
- <ProgressText Action="WriteIniValues" Template="File: [1], Section: [2], Key: [3], Value: [4]">Writing INI files values</ProgressText>
- <ProgressText Action="WriteRegistryValues" Template="Key: [1], Name: [2], Value: [3]">Writing system registry values</ProgressText>
- <ProgressText Action="Advertise">Advertising application</ProgressText>
- <ProgressText Action="GenerateScript" Template="[1]">Generating script operations for action:</ProgressText>
- <ProgressText Action="InstallSFPCatalogFile" Template="File: [1], Dependencies: [2]">Installing system catalog</ProgressText>
- <ProgressText Action="Rollback" Template="[1]">Rolling back action:</ProgressText>
- <ProgressText Action="RollbackCleanup" Template="File: [1]">Removing backup files</ProgressText>
- <ProgressText Action="UnmoveFiles" Template="File: [1], Directory: [9]">Removing moved files</ProgressText>
- <ProgressText Action="UnpublishProduct">Unpublishing product information</ProgressText>
- <RadioButtonGroup Property="MaintenanceForm_Action">
- <RadioButton Height="17" Text="&amp;Repair [ProductName]" Value="Repair" Width="200" X="0" Y="18" />
- <RadioButton Height="17" Text="Re&amp;move [ProductName]" Value="Remove" Width="200" X="0" Y="36" />
- </RadioButtonGroup>
- <RadioButtonGroup Property="WhichUsers">
- <RadioButton Height="20" Text="Install for all users" Value="ALL" Width="150" X="0" Y="5" />
- <RadioButton Height="20" Text="Install just for me" Value="JUSTME" Width="150" X="0" Y="25" />
- </RadioButtonGroup>
- <TextStyle Id="DlgFont8" FaceName="Tahoma" Size="9" />
- <TextStyle Id="DlgFontBold8" FaceName="Tahoma" Size="8" Bold="yes" />
- <TextStyle Id="VerdanaBold10" FaceName="Verdana" Size="10" Bold="yes" />
- <TextStyle Id="VerdanaRed9" FaceName="Verdana" Size="9" Red="255" Green="0" Blue="0" />
- <UIText Id="AbsentPath" />
- <UIText Id="bytes">bytes</UIText>
- <UIText Id="GB">GB</UIText>
- <UIText Id="KB">KB</UIText>
- <UIText Id="MB">MB</UIText>
- <UIText Id="MenuAbsent">Entire feature will be unavailable</UIText>
- <UIText Id="MenuAdvertise">Feature will be installed when required</UIText>
- <UIText Id="MenuAllCD">Entire feature will be installed to run from CD</UIText>
- <UIText Id="MenuAllLocal">Entire feature will be installed on local hard drive</UIText>
- <UIText Id="MenuAllNetwork">Entire feature will be installed to run from network</UIText>
- <UIText Id="MenuCD">Will be installed to run from CD</UIText>
- <UIText Id="MenuLocal">Will be installed on local hard drive</UIText>
- <UIText Id="MenuNetwork">Will be installed to run from network</UIText>
- <UIText Id="ScriptInProgress">Gathering required information...</UIText>
- <UIText Id="SelAbsentAbsent">This feature will remain uninstalled</UIText>
- <UIText Id="SelAbsentAdvertise">This feature will be set to be installed when required</UIText>
- <UIText Id="SelAbsentCD">This feature will be installed to run from CD</UIText>
- <UIText Id="SelAbsentLocal">This feature will be installed on the local hard drive</UIText>
- <UIText Id="SelAbsentNetwork">This feature will be installed to run from the network</UIText>
- <UIText Id="SelAdvertiseAbsent">This feature will become unavailable</UIText>
- <UIText Id="SelAdvertiseAdvertise">Will be installed when required</UIText>
- <UIText Id="SelAdvertiseCD">This feature will be available to run from CD</UIText>
- <UIText Id="SelAdvertiseLocal">This feature will be installed on your local hard drive</UIText>
- <UIText Id="SelAdvertiseNetwork">This feature will be available to run from the network</UIText>
- <UIText Id="SelCDAbsent">This feature will be uninstalled completely, you won't be able to run it from CD</UIText>
- <UIText Id="SelCDAdvertise">This feature will change from run from CD state to set to be installed when required</UIText>
- <UIText Id="SelCDCD">This feature will remain to be run from CD</UIText>
- <UIText Id="SelCDLocal">This feature will change from run from CD state to be installed on the local hard drive</UIText>
- <UIText Id="SelChildCostNeg">This feature frees up [1] on your hard drive.</UIText>
- <UIText Id="SelChildCostPos">This feature requires [1] on your hard drive.</UIText>
- <UIText Id="SelCostPending">Compiling cost for this feature...</UIText>
- <UIText Id="SelLocalAbsent">This feature will be completely removed</UIText>
- <UIText Id="SelLocalAdvertise">This feature will be removed from your local hard drive, but will be set to be installed when required</UIText>
- <UIText Id="SelLocalCD">This feature will be removed from your local hard drive, but will be still available to run from CD</UIText>
- <UIText Id="SelLocalLocal">This feature will remain on you local hard drive</UIText>
- <UIText Id="SelLocalNetwork">This feature will be removed from your local hard drive, but will be still available to run from the network</UIText>
- <UIText Id="SelNetworkAbsent">This feature will be uninstalled completely, you won't be able to run it from the network</UIText>
- <UIText Id="SelNetworkAdvertise">This feature will change from run from network state to set to be installed when required</UIText>
- <UIText Id="SelNetworkLocal">This feature will change from run from network state to be installed on the local hard drive</UIText>
- <UIText Id="SelNetworkNetwork">This feature will remain to be run from the network</UIText>
- <UIText Id="SelParentCostNegNeg">This feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.</UIText>
- <UIText Id="SelParentCostNegPos">This feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.</UIText>
- <UIText Id="SelParentCostPosNeg">This feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.</UIText>
- <UIText Id="SelParentCostPosPos">This feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.</UIText>
- <UIText Id="TimeRemaining">Time remaining: {[1] minutes }{[2] seconds}</UIText>
- <UIText Id="VolumeCostAvailable">Available</UIText>
- <UIText Id="VolumeCostDifference">Difference</UIText>
- <UIText Id="VolumeCostRequired">Required</UIText>
- <UIText Id="VolumeCostSize">Disk Size</UIText>
- <UIText Id="VolumeCostVolume">Volume</UIText>
- <Dialog Id="ExitDialog" X="50" Y="50" Width="370" Height="300" Title="[ProductName] Setup" NoMinimize="yes">
- <Control Id="Finish" Type="PushButton" X="236" Y="273" Width="56" Height="17" Text="Finish" TabSkip="no" Default="yes" Cancel="yes">
- <Publish Event="EndDialog" Value="Return">1</Publish>
- </Control>
- <Control Id="Title" Type="Text" X="15" Y="10" Width="320" Height="60" Text="{\VerdanaBold10}Completing the [ProductName] Installer" TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="Description" Type="Text" X="15" Y="235" Width="320" Height="20" Text="Click the Finish button to exit the Installer." TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="BottomLine" Type="Line" X="0" Y="264" Width="370" Height="0" TabSkip="yes" Disabled="yes" />
- <Control Id="Back" Type="PushButton" X="180" Y="273" Width="56" Height="17" Text="&lt; Back" TabSkip="no" Disabled="yes" />
- <Control Id="Cancel" Type="PushButton" X="304" Y="273" Width="56" Height="17" Text="Cancel" TabSkip="no" Disabled="yes" />
- </Dialog>
- <Dialog Id="FatalError" X="50" Y="50" Width="370" Height="300" Title="[ProductName] Setup" NoMinimize="yes">
- <Control Id="Title" Type="Text" X="15" Y="10" Width="320" Height="60" Text="{\VerdanaBold10}[ProductName] Installer ended prematurely" TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="Description1" Type="Text" X="15" Y="70" Width="320" Height="80" Text="[ProductName] setup ended prematurely because of an error. Your system has not been modified. To install this program at a later time, please run the installation again." TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="Description2" Type="Text" X="15" Y="155" Width="320" Height="20" Text="Click the Finish button to exit the Installer." TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="BottomLine" Type="Line" X="0" Y="264" Width="370" Height="0" TabSkip="yes" Disabled="yes" />
- <Control Id="Back" Type="PushButton" X="180" Y="273" Width="56" Height="17" Text="&lt; Back" TabSkip="no" Disabled="yes" />
- <Control Id="Finish" Type="PushButton" X="236" Y="273" Width="56" Height="17" Text="Finish" TabSkip="no" Default="yes" Cancel="yes">
- <Publish Event="EndDialog" Value="Exit">1</Publish>
- </Control>
- <Control Id="Cancel" Type="PushButton" X="304" Y="273" Width="56" Height="17" Text="Cancel" TabSkip="no" Disabled="yes" />
- </Dialog>
- <Dialog Id="UserExit" X="50" Y="50" Width="370" Height="300" Title="[ProductName] Setup" NoMinimize="yes">
- <Control Id="Title" Type="Text" X="15" Y="10" Width="320" Height="60" Text="{\VerdanaBold10}[ProductName] Installer was interrupted" TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="Description1" Type="Text" X="15" Y="70" Width="320" Height="80" Text="[ProductName] setup was interrupted. Your system has not been modified. To install this program at a later time, please run the installation again." TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="Description2" Type="Text" X="15" Y="155" Width="320" Height="20" Text="Click the Finish button to exit the Installer." TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="BottomLine" Type="Line" X="0" Y="264" Width="370" Height="0" TabSkip="yes" Disabled="yes" />
- <Control Id="Back" Type="PushButton" X="180" Y="273" Width="56" Height="17" Text="&lt; Back" TabSkip="no" Disabled="yes" />
- <Control Id="Finish" Type="PushButton" X="236" Y="273" Width="56" Height="17" Text="Finish" TabSkip="no" Default="yes" Cancel="yes">
- <Publish Event="EndDialog" Value="Exit">1</Publish>
- </Control>
- <Control Id="Cancel" Type="PushButton" X="304" Y="273" Width="56" Height="17" Text="Cancel" TabSkip="no" Disabled="yes" />
- </Dialog>
- <Dialog Id="ErrorDlg" X="50" Y="10" Width="330" Height="101" Title="[ProductName] Setup" ErrorDialog="yes">
- <Control Id="ErrorText" Type="Text" X="50" Y="9" Width="280" Height="48" TabSkip="no" />
- <Control Id="A" Type="PushButton" X="0" Y="72" Width="81" Height="21" Text="Abort" TabSkip="yes">
- <Publish Event="EndDialog" Value="ErrorAbort">1</Publish>
- </Control>
- <Control Id="C" Type="PushButton" X="42" Y="72" Width="81" Height="21" Text="Cancel" TabSkip="yes">
- <Publish Event="EndDialog" Value="ErrorCancel">1</Publish>
- </Control>
- <Control Id="I" Type="PushButton" X="81" Y="72" Width="81" Height="21" Text="Ignore" TabSkip="yes">
- <Publish Event="EndDialog" Value="ErrorIgnore">1</Publish>
- </Control>
- <Control Id="N" Type="PushButton" X="120" Y="72" Width="81" Height="21" Text="No" TabSkip="yes">
- <Publish Event="EndDialog" Value="ErrorNo">1</Publish>
- </Control>
- <Control Id="O" Type="PushButton" X="159" Y="72" Width="81" Height="21" Text="Ok" TabSkip="yes">
- <Publish Event="EndDialog" Value="ErrorOk">1</Publish>
- </Control>
- <Control Id="R" Type="PushButton" X="198" Y="72" Width="81" Height="21" Text="Retry" TabSkip="yes">
- <Publish Event="EndDialog" Value="ErrorRetry">1</Publish>
- </Control>
- <Control Id="Y" Type="PushButton" X="240" Y="72" Width="81" Height="21" Text="Yes" TabSkip="yes">
- <Publish Event="EndDialog" Value="ErrorYes">1</Publish>
- </Control>
- </Dialog>
- <Dialog Id="PrepareDlg" X="50" Y="50" Width="370" Height="300" Title="[ProductName] Setup" Modeless="yes" NoMinimize="yes">
- <Control Id="Title" Type="Text" X="15" Y="10" Width="320" Height="60" Text="{\VerdanaBold10}Welcome to the [ProductName] Installer" TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="Description" Type="Text" X="15" Y="70" Width="320" Height="40" Text="Please wait while the Installer prepares to guide you through the installation." TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="ActionText" Type="Text" X="15" Y="110" Width="320" Height="20" Text="Pondering..." TabSkip="yes" Transparent="yes" NoPrefix="yes">
- <Subscribe Event="ActionText" Attribute="Text" />
- </Control>
- <Control Id="ActionData" Type="Text" X="15" Y="135" Width="320" Height="30" TabSkip="yes" Transparent="yes" NoPrefix="yes">
- <Subscribe Event="ActionData" Attribute="Text" />
- </Control>
- <Control Id="BottomLine" Type="Line" X="0" Y="264" Width="370" Height="0" TabSkip="yes" Disabled="yes" />
- <Control Id="Back" Type="PushButton" X="180" Y="273" Width="56" Height="17" Text="Back" TabSkip="yes" Disabled="yes" />
- <Control Id="Next" Type="PushButton" X="236" Y="273" Width="56" Height="17" Text="Next" TabSkip="yes" Disabled="yes" />
- <Control Id="Cancel" Type="PushButton" X="304" Y="273" Width="56" Height="17" Text="Cancel" TabSkip="no" Default="yes" Cancel="yes">
- <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
- </Control>
- </Dialog>
- <Dialog Id="WhichUsersDlg" X="50" Y="50" Width="370" Height="300" Title="[ProductName] Setup" NoMinimize="yes">
- <Control Id="Title" Type="Text" X="15" Y="10" Width="320" Height="60" Text="{\VerdanaBold10}Select whether to install [ProductName] for all users of this computer." TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="AdminInstall" Type="RadioButtonGroup" X="15" Y="60" Width="260" Height="50" Property="WhichUsers" TabSkip="no" />
- <Control Id="BottomLine" Type="Line" X="0" Y="264" Width="370" Height="0" TabSkip="yes" Disabled="yes" />
- <Control Id="Back" Type="PushButton" X="180" Y="273" Width="56" Height="17" Text="Back" TabSkip="yes" Disabled="yes" />
- <Control Id="Next" Type="PushButton" X="236" Y="273" Width="56" Height="17" Text="Next &gt;" TabSkip="no" Default="yes">
- <Publish Property="ALLUSERS" Value="1">WhichUsers="ALL"</Publish>
- <Publish Event="EndDialog" Value="Return">1</Publish>
- </Control>
- <Control Id="Cancel" Type="PushButton" X="304" Y="273" Width="56" Height="17" Text="Cancel" TabSkip="no" Cancel="yes">
- <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
- </Control>
- </Dialog>
- <Dialog Id="SelectFeaturesDlg" X="50" Y="50" Width="370" Height="300" Title="[ProductName] Setup" NoMinimize="yes">
- <Control Id="Title" Type="Text" X="15" Y="10" Width="320" Height="60" Text="{\VerdanaBold10}Select Python Installations" TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="Hint" Type="Text" X="15" Y="30" Width="300" Height="40" Text="Select the Python locations where $(var.ProductName) $(var.ProductVersion) should be installed." TabSkip="yes" />
- <Control Id="Features" Type="SelectionTree" X="15" Y="70" Width="300" Height="120" Property="FEATURE" TabSkip="no">
- <Publish Property="FEATURE_SELECTED" Value="1">1</Publish>
- </Control>
- <Control Id="Other" Type="Text" X="15" Y="200" Width="300" Height="15" Text="Provide an alternate Python location" TabSkip="yes">
- <Condition Action="enable">FEATURE_SELECTED AND &amp;PythonX=3</Condition>
- <Condition Action="show">FEATURE_SELECTED AND &amp;PythonX=3</Condition>
- <Condition Action="disable">FEATURE_SELECTED AND &amp;PythonX&lt;&gt;3</Condition>
- <Condition Action="hide">FEATURE_SELECTED AND &amp;PythonX&lt;&gt;3</Condition>
- </Control>
- <Control Id="PathEdit" Type="PathEdit" X="15" Y="215" Width="300" Height="16" Property="TARGETDIRX" TabSkip="no" Disabled="yes">
- <Condition Action="enable">FEATURE_SELECTED AND &amp;PythonX=3</Condition>
- <Condition Action="show">FEATURE_SELECTED AND &amp;PythonX=3</Condition>
- <Condition Action="disable">FEATURE_SELECTED AND &amp;PythonX&lt;&gt;3</Condition>
- <Condition Action="hide">FEATURE_SELECTED AND &amp;PythonX&lt;&gt;3</Condition>
- </Control>
- <Control Id="BottomLine" Type="Line" X="0" Y="264" Width="370" Height="0" TabSkip="yes" Disabled="yes" />
- <Control Id="Back" Type="PushButton" X="180" Y="273" Width="56" Height="17" Text="&lt; Back" TabSkip="yes" Disabled="yes" />
- <Control Id="Next" Type="PushButton" X="236" Y="273" Width="56" Height="17" Text="Next &gt;" TabSkip="no" Default="yes">
- <Publish Property="TARGETDIR" Value="[SourceDir]">1</Publish>
- <Publish Property="TARGETDIR" Value="[TARGETDIR$(var.PythonVersion)]">FEATURE_SELECTED AND &amp;Python$(var.PythonVersion)=3</Publish>
- <Publish Property="TARGETDIR" Value="[TARGETDIRX]">FEATURE_SELECTED AND &amp;PythonX=3</Publish>
- <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">1</Publish>
- <Publish Event="EndDialog" Value="Return">1</Publish>
- </Control>
- <Control Id="Cancel" Type="PushButton" X="304" Y="273" Width="56" Height="17" Text="Cancel" TabSkip="no" Cancel="yes">
- <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
- </Control>
- </Dialog>
- <Dialog Id="MaintenanceTypeDlg" X="50" Y="50" Width="370" Height="300" Title="[ProductName] Setup" NoMinimize="yes">
- <Control Id="Title" Type="Text" X="15" Y="10" Width="320" Height="60" Text="{\VerdanaBold10}Welcome to the [ProductName] Setup Wizard" TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="BodyText" Type="Text" X="15" Y="63" Width="330" Height="42" Text="Select whether you want to repair or remove [ProductName]." TabSkip="yes" />
- <Control Id="RepairRadioGroup" Type="RadioButtonGroup" X="15" Y="108" Width="330" Height="60" Property="MaintenanceForm_Action" TabSkip="no" />
- <Control Id="BottomLine" Type="Line" X="0" Y="264" Width="370" Height="0" TabSkip="yes" Disabled="yes" />
- <Control Id="Back" Type="PushButton" X="180" Y="273" Width="56" Height="17" Text="&lt; Back" TabSkip="yes" Disabled="yes" />
- <Control Id="Next" Type="PushButton" X="236" Y="273" Width="56" Height="17" Text="Finish" TabSkip="no" Default="yes">
- <Publish Property="REINSTALL" Value="ALL">MaintenanceForm_Action="Repair"</Publish>
- <Publish Property="Progress1" Value="Repairing">MaintenanceForm_Action="Repair"</Publish>
- <Publish Property="Progress2" Value="repairs">MaintenanceForm_Action="Repair"</Publish>
- <Publish Event="Reinstall" Value="ALL">MaintenanceForm_Action="Repair"</Publish>
- <Publish Property="REMOVE" Value="ALL">MaintenanceForm_Action="Remove"</Publish>
- <Publish Property="Progress1" Value="Removing">MaintenanceForm_Action="Remove"</Publish>
- <Publish Property="Progress2" Value="removes">MaintenanceForm_Action="Remove"</Publish>
- <Publish Event="Remove" Value="ALL">MaintenanceForm_Action="Remove"</Publish>
- <Publish Event="EndDialog" Value="Return">MaintenanceForm_Action&lt;&gt;"Change"</Publish>
- </Control>
- <Control Id="Cancel" Type="PushButton" X="304" Y="273" Width="56" Height="17" Text="Cancel" TabSkip="no" Cancel="yes">
- <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
- </Control>
- </Dialog>
- <Dialog Id="ProgressDlg" X="50" Y="50" Width="370" Height="300" Title="[ProductName] Setup" Modeless="yes" NoMinimize="yes">
- <Control Id="Title" Type="Text" X="20" Y="15" Width="200" Height="15" Text="{\DlgFontBold8}[Progress1] [ProductName]" TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="Text" Type="Text" X="35" Y="65" Width="300" Height="30" Text="Please wait while the Installer [Progress2] [ProductName]. This may take several minutes." TabSkip="yes" />
- <Control Id="StatusLabel" Type="Text" X="35" Y="100" Width="35" Height="20" Text="Status:" TabSkip="yes" />
- <Control Id="ActionText" Type="Text" X="70" Y="100" Width="300" Height="20" Text="Pondering..." TabSkip="yes">
- <Subscribe Event="ActionText" Attribute="Text" />
- </Control>
- <Control Id="ProgressBar" Type="ProgressBar" X="35" Y="120" Width="300" Height="10" Text="Progress done" TabSkip="yes" Disabled="yes" ProgressBlocks="yes">
- <Subscribe Event="SetProgress" Attribute="Progress" />
- </Control>
- <Control Id="BottomLine" Type="Line" X="0" Y="264" Width="370" Height="0" TabSkip="yes" Disabled="yes" />
- <Control Id="Back" Type="PushButton" X="180" Y="273" Width="56" Height="17" Text="&lt; Back" TabSkip="no" Disabled="yes" />
- <Control Id="Next" Type="PushButton" X="236" Y="273" Width="56" Height="17" Text="Next &gt;" TabSkip="no" Disabled="yes" />
- <Control Id="Cancel" Type="PushButton" X="304" Y="273" Width="56" Height="17" Text="Cancel" TabSkip="no" Default="yes" Cancel="yes">
- <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
- </Control>
- </Dialog>
- <Dialog Id="FilesInUse" X="50" Y="50" Width="370" Height="300" Title="[ProductName] Setup" NoMinimize="yes" KeepModeless="yes">
- <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Text="{\DlgFontBold8}Files in Use" TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="Description" Type="Text" X="20" Y="23" Width="280" Height="20" Text="Some files that need to be updated are currently in use." TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="Text" Type="Text" X="20" Y="55" Width="330" Height="50" Text="The following applications are using files that need to be updated by this setup. Close these applications and then click Retry to continue the installation or Cancel to exit it." TabSkip="yes" />
- <Control Id="List" Type="ListBox" X="20" Y="107" Width="330" Height="130" Property="FileInUseProcess" TabSkip="yes" Sunken="yes" />
- <Control Id="BottomLine" Type="Line" X="0" Y="264" Width="370" Height="0" TabSkip="yes" Disabled="yes" />
- <Control Id="Exit" Type="PushButton" X="180" Y="273" Width="56" Height="17" Text="Exit" TabSkip="no">
- <Publish Event="EndDialog" Value="Exit">1</Publish>
- </Control>
- <Control Id="Ignore" Type="PushButton" X="236" Y="273" Width="56" Height="17" Text="Ignore" TabSkip="no">
- <Publish Event="EndDialog" Value="Ignore">1</Publish>
- </Control>
- <Control Id="Retry" Type="PushButton" X="304" Y="273" Width="56" Height="17" Text="Retry" TabSkip="no" Default="yes" Cancel="yes">
- <Publish Event="EndDialog" Value="Retry">1</Publish>
- </Control>
- </Dialog>
- <Dialog Id="CancelDlg" X="50" Y="10" Width="260" Height="85" Title="[ProductName] Setup" NoMinimize="yes">
- <Control Id="Text" Type="Text" X="48" Y="15" Width="194" Height="30" Text="Are you sure you want to cancel [ProductName] installation?" TabSkip="yes" />
- <Control Id="Yes" Type="PushButton" X="72" Y="57" Width="56" Height="17" Text="Yes" TabSkip="no">
- <Publish Event="EndDialog" Value="Exit">1</Publish>
- </Control>
- <Control Id="No" Type="PushButton" X="132" Y="57" Width="56" Height="17" Text="No" TabSkip="no" Default="yes" Cancel="yes">
- <Publish Event="EndDialog" Value="Return">1</Publish>
- </Control>
- </Dialog>
- <Dialog Id="WaitForCostingDlg" X="50" Y="10" Width="260" Height="85" Title="[ProductName] Setup" NoMinimize="yes">
- <Control Id="Text" Type="Text" X="48" Y="15" Width="194" Height="30" Text="Please wait while the installer finishes determining your disk space requirements." TabSkip="yes" />
- <Control Id="Return" Type="PushButton" X="102" Y="57" Width="56" Height="17" Text="Return" TabSkip="no" Default="yes" Cancel="yes">
- <Publish Event="EndDialog" Value="Exit">1</Publish>
- </Control>
- </Dialog>
- <Dialog Id="DiskCostDlg" X="50" Y="50" Width="370" Height="300" Title="[ProductName] Setup" NoMinimize="yes">
- <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Text="{\DlgFontBold8}Disk Space Requirements" TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="Description" Type="Text" X="20" Y="20" Width="280" Height="20" Text="The disk space required for the installation of the selected features." TabSkip="yes" Transparent="yes" NoPrefix="yes" />
- <Control Id="Text" Type="Text" X="20" Y="53" Width="330" Height="60" Text="The highlighted volumes (if any) do not have enough disk space available for the currently selected features. You can either remove some files from the highlighted volumes, or choose to install less features onto local drive(s), or select different destination drive(s)." TabSkip="yes" />
- <Control Id="VolumeList" Type="VolumeCostList" X="20" Y="100" Width="330" Height="150" Text="{120}{70}{70}{70}{70}" TabSkip="yes" Sunken="yes" Fixed="yes" Remote="yes" />
- <Control Id="BottomLine" Type="Line" X="0" Y="264" Width="370" Height="0" TabSkip="yes" Disabled="yes" />
- <Control Id="OK" Type="PushButton" X="157" Y="273" Width="56" Height="17" Text="Ok" TabSkip="no" Default="yes" Cancel="yes">
- <Publish Event="EndDialog" Value="Return">1</Publish>
- </Control>
- </Dialog>
- </UI>
-
- <Feature Id="Python" ConfigurableDirectory="TARGETDIR" Description="Everything" Display="hidden" Level="1" Title="Python" />
-
- <Feature Id="Python$(var.PythonVersion)" ConfigurableDirectory="TARGETDIR$(var.PythonVersion)" Description="Everything" Display="expand" Level="1" Title="Python $(var.PythonVersion) from registry">
- <Condition Level="0">NOT TARGETDIR$(var.PythonVersion)</Condition>
- </Feature>
-
- <Feature Id="PythonX" ConfigurableDirectory="TARGETDIRX" Description="Everything" Display="expand" Level="2" Title="Python from another location" />
-
- <Directory Id="TARGETDIR" Name="SourceDir">
- <Directory Id="TARGETDIR$(var.PythonVersion)" Name="Python$(var.PythonVersion)" />
- <Directory Id="TARGETDIRX" Name="PythonX" />
- </Directory>
- </Product>
-</Wix>
View
213 etc/2.22.0.0-win32.xml
@@ -1,213 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<build>
- <interpreters>
- <interpreter version="2.6" />
- <interpreter version="2.7" />
- </interpreters>
-
- <!-- You should NEVER AGAIN change these upgrade codes during the 2.x series,
- unless you intend to break the upgrade path.
- The day we want another version (gtk+-3.x) which should be installed
- in parallel with the 2.x series, they HAVE TO BE changed at the same
- time as the product name -->
-
- <product name = "PyGTK All-in-one"
- upgradecode_26 = "{67D26C03-D5BD-4549-9FEA-76F9B8171584}"
- upgradecode_27 = "{7E8DD188-EB7F-46FC-8E39-64A92D227927}">
-
- <features>
- <feature id = "pygtk"
- title = "PyGTK"
- description = "Installs Python bindings for GTK+, Glade, Pango, PangoCairo, GObject, GIO and Cairo">
-
- <package id = "pygtk"
- type = "MsiSourcePackage"
- url = "http://www.optionexplicit.be/projects/gnome-windows/20101109/"
- msi_26 = "pygtk-2.22.0.win32-py2.6.msi"
- digest_26 = "3e02828739852ac248c4b4c41a732659"
- msi_27 = "pygtk-2.22.0.win32-py2.7.msi"
- digest_27 = "166817569cd3a8112cbf168bae12bed0" />
-
- <package id = "pygobject"
- type = "MsiSourcePackage"
- url = "http://www.optionexplicit.be/projects/gnome-windows/20101102/"
- msi_26 = "pygobject-2.26.0.win32-py2.6.msi"
- digest_26 = "f3b609fa9fb8b0a6916d76112a83feb8"
- msi_27 = "pygobject-2.26.0.win32-py2.7.msi"
- digest_27 = "0ca3515aa20e0d568a6793444b721dc5" />
-
- <package id = "pycairo"
- type = "MsiSourcePackage"
- url = "http://www.optionexplicit.be/projects/gnome-windows/20101102/"
- msi_26 = "pycairo-1.8.10.win32-py2.6.msi"
- digest_26 = "a801b870f4a5a4759ad4642c68b737d7"
- msi_27 = "pycairo-1.8.10.win32-py2.7.msi"
- digest_27 = "3121a49d85759958e8db100f604115dc" />
-
- <feature id = "gtk_runtime"
- title = "GTK+ Runtime"
- description = "Installs the GTK+ runtime">
-
- <package id = "gtk_runtime"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/gtk+/2.22/"
- archive = "gtk+-bundle_2.22.0-20101016_win32.zip"
- digest = "b0a879b50e5c86190c6fed4d7377aa5d" />
-
- <package id = "libxml2"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/dependencies/"
- archive = "libxml2_2.7.7-1_win32.zip"
- digest = "bd6b3d8c35e06a00937db65887c6e287" />
-
- <package id = "libxml2_dev"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/dependencies/"
- archive = "libxml2-dev_2.7.7-1_win32.zip"
- digest = "b6f59b70eef0992df37f8db891d4b283" />
-
- <package id = "librsvg"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/librsvg/2.26/"
- archive = "librsvg_2.26.2-1_win32.zip"
- digest = "aec21e5a389fb9c65110f28a57f2bede" />
-
- <package id = "librsvg_dev"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/librsvg/2.26/"
- archive = "librsvg-dev_2.26.2-1_win32.zip"
- digest = "871870ba95d998a3713790c455ea8e35" />
-
- <package id = "svg_gdk_pixbuf_loader"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/librsvg/2.26/"
- archive = "svg-gdk-pixbuf-loader_2.26.2-1_win32.zip"
- digest = "c30dac5d0f9965fcbfb29d7eb282f86b" /> -->
-
- <package id = "svg_gtk_engine"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/librsvg/2.26/"
- archive = "svg-gtk-engine_2.26.2-1_win32.zip"
- digest = "92f23be86fbfd617c3552a6f17d4b880" />
-
- <package id = "libcroco"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/libcroco/0.6/"
- archive = "libcroco_0.6.2-1_win32.zip"
- digest = "2d90c71404be0de4e5f3259f63a3e278" />
-
- <package id = "libcroco_dev"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/libcroco/0.6/"
- archive = "libcroco-dev_0.6.2-1_win32.zip"
- digest = "bcaa8808e6dbee95b142b36a446718b3" />
-
- <package id = "libgsf"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/libgsf/1.14/"
- archive = "libgsf_1.14.17-1_win32.zip"
- digest = "d23456b89c7f0c156889e9ddd6c5d96c" />
-
- <package id = "libgsf_dev"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/libgsf/1.14/"
- archive = "libgsf-dev_1.14.17-1_win32.zip"
- digest = "03c44275fc3097568b4b0466ba81b262" />
-
- <package id = "icon_nameing_utils"
- type = "ArchiveSourcePackage"
- url = "http://www.optionexplicit.be/projects/gnome-windows/20100401/"
- archive = "icon-nameing-utils-0.8.90.zip"
- digest = "2a9f74579b3b222e8664345a93eb40b3" />
-
- <package id = "tango_icon_theme"
- type = "ArchiveSourcePackage"
- url = "http://www.optionexplicit.be/projects/gnome-windows/20100401/"
- archive = "tango-icon-theme-0.8.90.zip"
- digest = "93286826b9cd53b588f3a500afb3b8ad" />
- </feature>
-
- <feature id = "libglade"
- title = "GTK+ Runtime libglade support"
- description = "Installs libglade into the GTK+ runtime. Select this if you want to import gtk.glade">
-
- <package id = "libglade"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/libglade/2.6/"
- archive = "libglade_2.6.4-1_win32.zip"
- digest = "268cc2332841f2a540ba4e1cb068a4dc" />
-
- <package id = "libglade_dev"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/libglade/2.6/"
- archive = "libglade-dev_2.6.4-1_win32.zip"
- digest = "261d57fc31e5e4ddc6758bbd9d54625b" />
- </feature>
- </feature>
-
- <feature id = "pygtksourceview2"
- title = "PyGtkSourceView2"
- description = "Installs Python bindings for GtkSourceView2.">
-
- <package id = "pygtksourceview2"
- type = "MsiSourcePackage"
- url = "http://www.optionexplicit.be/projects/gnome-windows/20101102/"
- msi_26 = "pygtksourceview-2.10.1.win32-py2.6.msi"
- msi_27 = "pygtksourceview-2.10.1.win32-py2.7.msi"
- digest_26 = "123d751255edd7cb4d0f8e8253574058"
- digest_27 = "c5c017fbf1ac99929a6d7a2be4f2b514" />
-
- <package id = "libgtksourceview"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/gtksourceview/2.10/"
- archive = "gtksourceview-2.10.0.zip"
- digest = "246460cc82a233f0aaffe2075b4455ef" />
-
- <package id = "libgtksourceview_dev"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/gtksourceview/2.10/"
- archive = "gtksourceview-dev-2.10.0.zip"
- digest = "4510027ea0ab4fcb0e0d68fa596bccb5" />
- </feature>
-
- <feature id = "pygoocanvas"
- title = "PyGooCanvas"
- description = "Installs Python bindings for GooCanvas.">
-
- <package id = "pygoocanvas"
- type = "MsiSourcePackage"
- url = "http://www.optionexplicit.be/projects/gnome-windows/20101102/"
- msi_26 = "pygoocanvas-0.14.2.win32-py2.6.msi"
- msi_27 = "pygoocanvas-0.14.2.win32-py2.7.msi"
- digest_26 = "c33db1b3332331b674a98cc3a6c88232"
- digest_27 = "0a373713e14440a5261da1bc9e4026f8" />
-
- <package id = "libgoocanvas"
- type = "ArchiveSourcePackage"
- url = "http://ftp.gnome.org/pub/GNOME/binaries/win32/goocanvas/0.15/"
- archive = "goocanvas-0.15-win32.zip"
- digest = "18117c424950b6c014780af849508838" />
-