summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Tools/msi/msi.py92
1 files changed, 57 insertions, 35 deletions
diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py
index 2288000..da25222 100644
--- a/Tools/msi/msi.py
+++ b/Tools/msi/msi.py
@@ -22,6 +22,8 @@ srcdir = os.path.abspath("../..")
# goes into file name and ProductCode. Defaults to
# current_version.day for Snapshot, current_version otherwise
full_current_version = None
+# Is Tcl available at all?
+have_tcl = True
try:
from config import *
@@ -762,7 +764,8 @@ def add_features(db):
ext_feature = Feature(db, "Extensions", "Register Extensions",
"Make this Python installation the default Python installation", 3,
parent = default_feature)
- tcltk = Feature(db, "TclTk", "Tcl/Tk", "Tkinter, IDLE, pydoc", 5,
+ if have_tcl:
+ tcltk = Feature(db, "TclTk", "Tcl/Tk", "Tkinter, IDLE, pydoc", 5,
parent = default_feature, attributes=2)
htmlfiles = Feature(db, "Documentation", "Documentation",
"Python HTMLHelp File", 7, parent = default_feature)
@@ -811,7 +814,8 @@ def add_files(db):
# Add all executables, icons, text files into the TARGETDIR component
root = PyDirectory(db, cab, None, srcdir, "TARGETDIR", "SourceDir")
default_feature.set_current()
- root.add_file("PCBuild/w9xpopen.exe")
+ if not msilib.Win64:
+ root.add_file("PCBuild/w9xpopen.exe")
root.add_file("PC/py.ico")
root.add_file("PC/pyc.ico")
root.add_file("README.txt", src="README")
@@ -851,6 +855,8 @@ def add_files(db):
if dir == "CVS" or dir.startswith("plat-"):
continue
elif dir in ["lib-tk", "idlelib", "Icons"]:
+ if not have_tcl:
+ continue
tcltk.set_current()
elif dir in ['test', 'output']:
testsuite.set_current()
@@ -913,15 +919,16 @@ def add_files(db):
continue
dlls.append(f)
lib.add_file(f)
- if not os.path.exists(srcdir+"/PCBuild/_tkinter.pyd"):
- print "WARNING: Missing _tkinter.pyd"
- else:
- lib.start_component("TkDLLs", tcltk)
- lib.add_file("_tkinter.pyd")
- dlls.append("_tkinter.pyd")
- tcldir = os.path.normpath(srcdir+"/../tcltk/bin")
- for f in glob.glob1(tcldir, "*.dll"):
- lib.add_file(f, src=os.path.join(tcldir, f))
+ if have_tcl:
+ if not os.path.exists(srcdir+"/PCBuild/_tkinter.pyd"):
+ print "WARNING: Missing _tkinter.pyd"
+ else:
+ lib.start_component("TkDLLs", tcltk)
+ lib.add_file("_tkinter.pyd")
+ dlls.append("_tkinter.pyd")
+ tcldir = os.path.normpath(srcdir+"/../tcltk/bin")
+ for f in glob.glob1(tcldir, "*.dll"):
+ lib.add_file(f, src=os.path.join(tcldir, f))
# check whether there are any unknown extensions
for f in glob.glob1(srcdir+"/PCBuild", "*.pyd"):
if f.endswith("_d.pyd"): continue # debug version
@@ -938,19 +945,20 @@ def add_files(db):
for f in dlls:
lib.add_file(f.replace('pyd','lib'))
lib.add_file('python%s%s.lib' % (major, minor))
- # Add Tcl/Tk
- tcldirs = [(root, '../tcltk/lib', 'tcl')]
- tcltk.set_current()
- while tcldirs:
- parent, phys, dir = tcldirs.pop()
- lib = PyDirectory(db, cab, parent, phys, dir, "%s|%s" % (parent.make_short(dir), dir))
- if not os.path.exists(lib.absolute):
- continue
- for f in os.listdir(lib.absolute):
- if os.path.isdir(os.path.join(lib.absolute, f)):
- tcldirs.append((lib, f, f))
- else:
- lib.add_file(f)
+ if have_tcl:
+ # Add Tcl/Tk
+ tcldirs = [(root, '../tcltk/lib', 'tcl')]
+ tcltk.set_current()
+ while tcldirs:
+ parent, phys, dir = tcldirs.pop()
+ lib = PyDirectory(db, cab, parent, phys, dir, "%s|%s" % (parent.make_short(dir), dir))
+ if not os.path.exists(lib.absolute):
+ continue
+ for f in os.listdir(lib.absolute):
+ if os.path.isdir(os.path.join(lib.absolute, f)):
+ tcldirs.append((lib, f, f))
+ else:
+ lib.add_file(f)
# Add tools
tools.set_current()
tooldir = PyDirectory(db, cab, root, "Tools", "Tools", "TOOLS|Tools")
@@ -965,8 +973,9 @@ def add_files(db):
x.glob("*.txt")
if f == 'Scripts':
lib.add_file("README.txt", src="README")
- lib.start_component("pydocgui.pyw", tcltk, keyfile="pydocgui.pyw")
- lib.add_file("pydocgui.pyw")
+ if have_tcl:
+ lib.start_component("pydocgui.pyw", tcltk, keyfile="pydocgui.pyw")
+ lib.add_file("pydocgui.pyw")
# Add documentation
htmlfiles.set_current()
lib = PyDirectory(db, cab, root, "Doc", "Doc", "DOC|Doc")
@@ -984,25 +993,32 @@ def add_registry(db):
# IDLE verbs depend on the tcltk feature.
# msidbComponentAttributesRegistryKeyPath = 4
# -1 for Root specifies "dependent on ALLUSERS property"
+ tcldata = []
+ if have_tcl:
+ tcldata = [
+ ("REGISTRY.tcl", msilib.gen_uuid(), "TARGETDIR", 4,
+ "&%s <> 2" % ext_feature.id, "py.IDLE")]
add_data(db, "Component",
# msidbComponentAttributesRegistryKeyPath = 4
[("REGISTRY", msilib.gen_uuid(), "TARGETDIR", 4, None,
"InstallPath"),
("REGISTRY.def", msilib.gen_uuid(), "TARGETDIR", 4,
- None, None),
- ("REGISTRY.tcl", msilib.gen_uuid(), "TARGETDIR", 4,
- "&%s <> 2" % ext_feature.id, "py.IDLE")])
+ None, None)] + tcldata)
# See "FeatureComponents Table".
# The association between TclTk and pythonw.exe is necessary to make ICE59
# happy, because the installer otherwise believes that the IDLE and PyDoc
# shortcuts might get installed without pythonw.exe being install. This
# is not true, since installing TclTk will install the default feature, which
# will cause pythonw.exe to be installed.
+ tcldata = []
+ if have_tcl:
+ tcltkdata = [(tcltk.id, "REGISTRY.tcl"),
+ (tcltk.id, "pythonw.exe")]
add_data(db, "FeatureComponents",
[(default_feature.id, "REGISTRY"),
- (ext_feature.id, "REGISTRY.def"),
- (tcltk.id, "REGISTRY.tcl"),
- (tcltk.id, "pythonw.exe")])
+ (ext_feature.id, "REGISTRY.def")] +
+ tcldata
+ )
pat = r"Software\Classes\%sPython.%sFile\shell\%s\command"
ewi = "Edit with IDLE"
@@ -1028,7 +1044,8 @@ def add_registry(db):
# Non-advertised verbs: for advertised verbs, we would need to invoke the same
# executable for both open and "Edit with IDLE". This cannot work, as we want
# to use pythonw.exe in either case
- add_data(db, "Registry",
+ if have_tcl:
+ add_data(db, "Registry",
[#Verbs
("py.IDLE", -1, pat % (testprefix, "", ewi), "",
r'"[TARGETDIR]pythonw.exe" "[TARGETDIR]Lib\idlelib\idle.pyw" -n -e "%1"',
@@ -1058,12 +1075,17 @@ def add_registry(db):
("MenuDir", "ProgramMenuFolder", "PY%s%s|%sPython %s.%s" % (major,minor,testprefix,major,minor))])
add_data(db, "RemoveFile",
[("MenuDir", "TARGETDIR", None, "MenuDir", 2)])
- add_data(db, "Shortcut",
- [# Advertised shortcuts: targets are features, not files
+ tcltkshortcuts = []
+ if have_tcl:
+ tcltkshortcuts = [
("IDLE", "MenuDir", "IDLE|IDLE (Python GUI)", "pythonw.exe",
tcltk.id, r"[TARGETDIR]Lib\idlelib\idle.pyw", None, None, "python_icon.exe", 0, None, "TARGETDIR"),
("PyDoc", "MenuDir", "MODDOCS|Module Docs", "pythonw.exe",
tcltk.id, r"[TARGETDIR]Tools\scripts\pydocgui.pyw", None, None, "python_icon.exe", 0, None, "TARGETDIR"),
+ ]
+ add_data(db, "Shortcut",
+ tcltkshortcuts +
+ [# Advertised shortcuts: targets are features, not files
("Python", "MenuDir", "PYTHON|Python (command line)", "python.exe",
default_feature.id, None, None, None, "python_icon.exe", 2, None, "TARGETDIR"),
("Manual", "MenuDir", "MANUAL|Python Manuals", "documentation",