summaryrefslogtreecommitdiff
path: root/src/mongo/installer/msi/SConscript
blob: e62370f76df7ea4d8297f1d4c67237ecc8ba77a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# -*- mode: python; -*-

import os

Import("env")
Import("has_option")

env = env.Clone()

env['WIX'] = os.environ.get('WIX')
env['WIXPATH'] = r'$WIX\bin'
env['WIXHEAT'] = r'$WIXPATH\heat.exe'
env['WIXCANDLE'] = r'$WIXPATH\candle.exe'
env['WIXLIGHT'] = r'$WIXPATH\light.exe'
env['WIXUIEXT'] = r'$WIXPATH\WixUIExtension.dll'
env['WIXUTILEXT'] = r'$WIXPATH\WixUtilExtension.dll'
env['MERGEMODULESBASEPATH'] = os.environ.get('MERGEMODULESBASEPATH')
if env['MERGEMODULESBASEPATH'] == None and os.environ.get('ProgramFiles(x86)') != None:
    env['MERGEMODULESBASEPATH'] = (os.environ.get('ProgramFiles(x86)') +
            r"\Common Files\Merge Modules")

sourcesList = [ "BinaryFragment.wxs",
            "FeatureFragment.wxs",
            "LicensingFragment.wxs",
            "UIFragment.wxs",
            ]

# Need to do this in order to get scons to translate path separators into native format
buildDir = env.Dir("$BUILD_DIR").path
if has_option("use-new-tools"):
	toolBuildDir = "src\mongo-tools"
else:
	toolBuildDir = buildDir + r'\mongo'

enterprisebase = 'src\mongo\db\modules\enterprise'
enterpriseToolBuildDir = buildDir + r'\mongo\db\modules\enterprise'

# Set up parameters to pass to wix -
#
# msi_edition - "Enterprise" or "Standard"
# msi_platform - "x64" or "x86"
# msi_flavor - "2008R2Plus" or ""
#

msi_flavor = '2008R2Plus'
msi_platform = 'x64'

# Enterprise
if 'enterprise' in env['MONGO_MODULES']:
  msi_edition = 'Enterprise'
  upgrade_code = '822C75A4-40BA-456B-91D3-C339155F0F90'
# Community
else:
  if has_option('ssl'):
    msi_edition = 'SSL'
    upgrade_code = 'FDAA2775-060E-4C54-9C19-A84197F3070D'
  else:
    msi_edition = 'Standard'
    upgrade_code = '7BCCBD4E-AC8A-48BC-9922-E9EBB158A060'

sourcesList.append("Installer_64.wxs")

sources = ["wxs/" + file for file in sourcesList]
objects = ["$BUILD_DIR/msi/" + file.replace(".wxs", ".wixobj") for file in sourcesList]

full_version = env['MONGO_VERSION'].partition('-')[0]

# major version is the x.y, not the x.y.z
major_version = full_version
mv = major_version.split('.')
major_version = "%s.%s" % (mv[0], mv[1])

# We must regenerate the upgrade codes for each major release.
# i.e., 3.0, 3.2, 3.4 need new codes but not 3.2.1, 3.2.2, etc
# The build will now fail when the major version is bumped to prevent mistakes.
# When the upgrade codes are bumped, remember to raise the version number to the next major version.
# On each update to the upgrade codes:
# 1. Generate new GUIDs
# 2. Ensure each MSI gets a different GUID. This is used to identify products.
#    It allows upgrade from 3.2.0 to 3.2.1 in place instead of side-by-side.
# 3. Update the check for the next major release below so we bump the GUIDs in the future.
#
if float(major_version) > 3.6:
    # If you are troubleshooting this error, see the comment above
    env.FatalError("The upgrade codes are out of date for this release. Please \n" +
    "replace the existing GUIDs listed in this file with new GUIDs so " +
    "side-by-side installation of major versions (i.e. 3.2, and 3.4) is " +
    "supported.")

# Currently, we are planning to key the same upgrade code for each
# (msi_edition, msi_platform, msi_flavor) combination
# and change MSI ProductId on minor updates, 2.6.0 -> 2.6.1, we let Wix do automatic
# GUID generation for us rather then build a database of GUIDs in our build system
# For major updates, we are going to create a new directory/productid/upgrade_code ie, 2.6 -> 3.0


# candle: compile .wxs files into .wixobjs
env.Command(objects,
            sources,
            '"$WIXCANDLE" -wx'
            # cannot have anything other than x.x.x.x in version string.
            # we should choose a fourth version number that reflects pre-ness.
            ' -dMongoDBMajorVersion=' + major_version +
            ' -dMongoDBVersion=' + full_version +
            ' -dLicenseSource=distsrc'
            r' -dEnterpriseBase=' + enterprisebase + '\\'
            ' -dBinarySource=' + buildDir + r'\mongo'
            ' -dToolBinarySource=' + toolBuildDir +
            ' -dEnterpriseToolBinarySource=' + enterpriseToolBuildDir +
            ' -dMergeModulesBasePath="$MERGEMODULESBASEPATH"'
            ' -dEdition=' + msi_edition +
            ' -d"ProductId=*\"'
            ' -dUpgradeCode=' + upgrade_code +
            ' -dClientSource=' + buildDir + r'\client_build'
            r' -dClientHeaderSource=${INSTALL_DIR}\include\mongo'
            ' -dConfiguration=Release'
            ' -dOutDir=' + buildDir + r'\msi'
            ' -dPlatform=' + msi_platform +
            ' -dFlavor=' + msi_flavor +
            r' -dProjectDir=buildscripts\packaging\msi\\'
            ' -dProjectName=MongoDB'
            ' -dTargetDir=' + buildDir + r'\msi'
            ' -dTargetExt=.msi'
            ' -dTargetFileName=${SERVER_ARCHIVE}'
            r' -dSaslSource=c:\sasl\bin'
            r' -dSnmpSource=c:\snmp\bin'
            r' -dSslSource=' + env['WINDOWS_OPENSSL_BIN'] +
            ' -out ' + buildDir + r'\msi\\'
            ' -arch ' + msi_platform +
            ' -ext "$WIXUIEXT"'
            ' $SOURCES')

#light: link .objs into an msi
pre_msi = "$BUILD_DIR/msi/${SERVER_DIST_BASENAME}.pre.msi"

# Suppress VC140_CRT_CRT.MSM Internal Consistency Errors
# ICE03 - Supress "String overflow"
# -- https://msdn.microsoft.com/en-us/library/windows/desktop/aa369037(v=vs.85).aspx
# ICE82 - Suppress "duplicate sequence number"
# -- https://msdn.microsoft.com/en-us/library/windows/desktop/aa368798(v=vs.85).aspx
#

pre_msi_cmd = env.Command(pre_msi,
            objects,
            '"$WIXLIGHT" -out ${TARGET} -wx -cultures:null -sice:ICE82 -sice:ICE03'
            ' -ext "$WIXUIEXT" -ext "$WIXUTILEXT"'
            ' ${SOURCES}')

env.Depends(pre_msi_cmd, '$BUILD_DIR/mongo/mongo.exe')
env.Depends(pre_msi_cmd, '$BUILD_DIR/mongo/mongod.exe')
env.Depends(pre_msi_cmd, '$BUILD_DIR/mongo/mongos.exe')
env.Depends(pre_msi_cmd, '$BUILD_DIR/mongo/mongoperf.exe')

if 'enterprise' in env['MONGO_MODULES']:
    env.Depends(pre_msi_cmd, "#" + enterpriseToolBuildDir + "/mongodecrypt.exe")
    env.Depends(pre_msi_cmd, "#" + enterpriseToolBuildDir + "/mongoldap.exe")

msi = "$BUILD_DIR/msi/${SERVER_DIST_BASENAME}.msi"
env.Command(msi,
            pre_msi,
            r'$PYTHON buildscripts\msitrim.py ${SOURCES} ${TARGET}')
env.AlwaysBuild(msi)

env.Alias( "msi" , msi )