1 import msilib
,os
,win32com
,tempfile
,sys
6 Win64
= "amd64" in PCBUILD
8 mod_dir
= os
.path
.join(os
.environ
["ProgramFiles"], "Common Files", "Merge Modules")
13 modules
= ["Microsoft_VC90_CRT_x86_x64.msm", "policy_9_0_Microsoft_VC90_CRT_x86_x64.msm"]
14 if not msi
: msi
= "python-%s.amd64.msi" % full_current_version
16 modules
= ["Microsoft_VC90_CRT_x86.msm","policy_9_0_Microsoft_VC90_CRT_x86.msm"]
17 if not msi
: msi
= "python-%s.msi" % full_current_version
18 for i
, n
in enumerate(modules
):
19 modules
[i
] = os
.path
.join(mod_dir
, n
)
21 def merge(msi
, feature
, rootdir
, modules
):
22 cab_and_filecount
= []
23 # Step 1: Merge databases, extract cabfiles
24 m
= msilib
.MakeMerge2()
25 m
.OpenLog("merge.log")
29 for module
in modules
:
31 m
.OpenModule(module
,0)
32 print "Opened Module",module
33 m
.Merge(feature
, rootdir
)
36 print e
.Type
, e
.ModuleTable
, e
.DatabaseTable
38 for s
in e
.ModuleKeys
: print s
,
41 for s
in e
.DatabaseKeys
: print s
,
43 cabname
= tempfile
.mktemp(suffix
=".cab")
45 cab_and_filecount
.append((cabname
, len(m
.ModuleFiles
)))
50 # Step 2: Add CAB files
51 i
= msilib
.MakeInstaller()
52 db
= i
.OpenDatabase(msi
, win32com
.client
.constants
.msiOpenDatabaseModeTransact
)
54 v
= db
.OpenView("SELECT LastSequence FROM Media")
60 seq
= r
.IntegerData(1)
63 print "Start of Media", maxmedia
65 for cabname
, count
in cab_and_filecount
:
66 stream
= "merged%d" % maxmedia
67 msilib
.add_data(db
, "Media",
68 [(maxmedia
+1, maxmedia
+count
, None, "#"+stream
, None, None)])
69 msilib
.add_stream(db
, stream
, cabname
)
72 # The merge module sets ALLUSERS to 1 in the property table.
73 # This is undesired; delete that
74 v
= db
.OpenView("DELETE FROM Property WHERE Property='ALLUSERS'")
79 merge(msi
, "SharedCRT", "TARGETDIR", modules
)
81 # certname (from config.py) should be (a substring of)
82 # the certificate subject, e.g. "Python Software Foundation"
84 os
.system('signtool sign /n "%s" /t http://timestamp.verisign.com/scripts/timestamp.dll %s' % (certname
, msi
))