Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Side by Side Diff: chrome/tools/build/win/create_installer_archive.py

Issue 8589029: Start of mini_installer build config refactoring. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Script to create Chrome Installer archive. 6 """Script to create Chrome Installer archive.
7 7
8 This script is used to create an archive of all the files required for a 8 This script is used to create an archive of all the files required for a
9 Chrome install in appropriate directory structure. It reads chrome.release 9 Chrome install in appropriate directory structure. It reads chrome.release
10 file as input, creates chrome.7z archive, compresses setup.exe and 10 file as input, creates chrome.7z archive, compresses setup.exe and
11 generates packed_files.txt for mini_installer project. 11 generates packed_files.txt for mini_installer project.
12 12
13 """ 13 """
14 14
15 import ConfigParser 15 import ConfigParser
16 import glob 16 import glob
17 import md5
18 import optparse 17 import optparse
19 import os 18 import os
20 import shutil 19 import shutil
20 import subprocess
21 import sys 21 import sys
22 22
23 23
24 ARCHIVE_DIR = "installer_archive" 24 ARCHIVE_DIR = "installer_archive"
25 25
26 # suffix to uncompresed full archive file, appended to options.output_name 26 # suffix to uncompresed full archive file, appended to options.output_name
27 ARCHIVE_SUFFIX = ".7z" 27 ARCHIVE_SUFFIX = ".7z"
28 BSDIFF_EXEC = "bsdiff.exe" 28 BSDIFF_EXEC = "bsdiff.exe"
29 CHROME_DIR = "Chrome-bin" 29 CHROME_DIR = "Chrome-bin"
30 CHROME_PATCH_FILE_SUFFIX = "_patch" # prefixed by options.output_name 30 CHROME_PATCH_FILE_SUFFIX = "_patch" # prefixed by options.output_name
31 31
32 # compressed full archive suffix, will be prefixed by options.output_name 32 # compressed full archive suffix, will be prefixed by options.output_name
33 COMPRESSED_ARCHIVE_SUFFIX = ".packed.7z" 33 COMPRESSED_ARCHIVE_SUFFIX = ".packed.7z"
34 34
35 COMPRESSED_FILE_EXT = ".packed.7z" # extension of patch archive file 35 COMPRESSED_FILE_EXT = ".packed.7z" # extension of patch archive file
36 COURGETTE_EXEC = "courgette.exe" 36 COURGETTE_EXEC = "courgette.exe"
37 MINI_INSTALLER_INPUT_FILE = "packed_files.txt" 37 MINI_INSTALLER_INPUT_FILE = "packed_files.txt"
38 PACKED_FILE_COMMENTS = """
39 // This file is automatically generated by create_installer_archive.py.
40 // It contains the resource entries that are going to be linked inside
41 // mini_installer.exe. For each file to be linked there should be two
42 // lines:
43 // - The first line contains the output filename (without path) and the
44 // type of the resource ('BN' - not compressed , 'BL' - LZ compressed,
45 // 'B7' - LZMA compressed)
46 // - The second line contains the path to the input file. Uses '/' to
47 // separate path components.
48 """
49 PATCH_FILE_EXT = '.diff' 38 PATCH_FILE_EXT = '.diff'
50 SETUP_EXEC = "setup.exe" 39 SETUP_EXEC = "setup.exe"
51 SETUP_PATCH_FILE_PREFIX = "setup_patch" 40 SETUP_PATCH_FILE_PREFIX = "setup_patch"
52 TEMP_ARCHIVE_DIR = "temp_installer_archive" 41 TEMP_ARCHIVE_DIR = "temp_installer_archive"
53 VERSION_FILE = "VERSION" 42 VERSION_FILE = "VERSION"
54 43
55 def BuildVersion(output_dir): 44
45 def BuildVersion(build_dir):
56 """Returns the full build version string constructed from information in 46 """Returns the full build version string constructed from information in
57 VERSION_FILE. Any segment not found in that file will default to '0'. 47 VERSION_FILE. Any segment not found in that file will default to '0'.
58 """ 48 """
59 major = 0 49 major = 0
60 minor = 0 50 minor = 0
61 build = 0 51 build = 0
62 patch = 0 52 patch = 0
63 for line in open(os.path.join(output_dir, "..", "..", "chrome", VERSION_FILE), 'r'): 53 for line in open(os.path.join(build_dir, '../../chrome', VERSION_FILE), 'r'):
64 line = line.rstrip() 54 line = line.rstrip()
65 if line.startswith('MAJOR='): 55 if line.startswith('MAJOR='):
66 major = line[6:] 56 major = line[6:]
67 elif line.startswith('MINOR='): 57 elif line.startswith('MINOR='):
68 minor = line[6:] 58 minor = line[6:]
69 elif line.startswith('BUILD='): 59 elif line.startswith('BUILD='):
70 build = line[6:] 60 build = line[6:]
71 elif line.startswith('PATCH='): 61 elif line.startswith('PATCH='):
72 patch = line[6:] 62 patch = line[6:]
73 return '%s.%s.%s.%s' % (major, minor, build, patch) 63 return '%s.%s.%s.%s' % (major, minor, build, patch)
74 64
75 def CompressUsingLZMA(output_dir, compressed_file, input_file): 65
76 lzma_exec = GetLZMAExec(output_dir) 66 def CompressUsingLZMA(build_dir, compressed_file, input_file):
77 cmd = ('%s a -t7z ' 67 lzma_exec = GetLZMAExec(build_dir)
68 cmd = [lzma_exec,
69 'a', '-t7z',
78 # Flags equivalent to -mx9 (ultra) but with the bcj2 turned on (exe 70 # Flags equivalent to -mx9 (ultra) but with the bcj2 turned on (exe
79 # pre-filter). This results in a ~2.3MB decrease in installer size on 71 # pre-filter). This results in a ~2.3MB decrease in installer size on
80 # a 24MB installer. 72 # a 24MB installer.
81 # Additionally, these settings reflect a 7zip 4.42 and up change in 73 # Additionally, these settings reflect a 7zip 4.42 and up change in
82 # the definition of -mx9, increasting the dicionary size moving to 74 # the definition of -mx9, increasting the dicionary size moving to
83 # 26bit = 64MB. This results in an additional ~3.5MB decrease. 75 # 26bit = 64MB. This results in an additional ~3.5MB decrease.
84 # Older 7zip versions can support these settings, as these changes 76 # Older 7zip versions can support these settings, as these changes
85 # rely on existing functionality in the lzma format. 77 # rely on existing functionality in the lzma format.
86 '-m0=BCJ2 ' 78 '-m0=BCJ2',
87 '-m1=LZMA:d26:fb64 ' 79 '-m1=LZMA:d26:fb64',
88 '-m2=LZMA:d20:fb64:mf=bt2 ' 80 '-m2=LZMA:d20:fb64:mf=bt2',
89 '-m3=LZMA:d20:fb64:mf=bt2 ' 81 '-m3=LZMA:d20:fb64:mf=bt2',
90 '-mb0:1 -mb0s1:2 ' 82 '-mb0:1',
91 '-mb0s2:3 ' 83 '-mb0s1:2',
92 '"%s" "%s"') % (lzma_exec, compressed_file, input_file) 84 '-mb0s2:3',
85 compressed_file,
86 input_file]
grt (UTC plus 2) 2011/11/17 20:28:14 some (but not all) of these lists you've added hav
Sigurður Ásgeirsson 2011/11/17 22:14:46 Done.
93 if os.path.exists(compressed_file): 87 if os.path.exists(compressed_file):
94 os.remove(compressed_file) 88 os.remove(compressed_file)
95 RunSystemCommand(cmd) 89 RunSystemCommand(cmd)
96 90
97 def CopyAllFilesToStagingDir(config, distribution, staging_dir, output_dir): 91
92 def CopyAllFilesToStagingDir(config, distribution, staging_dir, build_dir):
98 """Copies the files required for installer archive. 93 """Copies the files required for installer archive.
99 Copies all common files required for various distributions of Chromium and 94 Copies all common files required for various distributions of Chromium and
100 also files for the specific Chromium build specified by distribution. 95 also files for the specific Chromium build specified by distribution.
101 """ 96 """
102 CopySectionFilesToStagingDir(config, 'GENERAL', staging_dir, output_dir) 97 CopySectionFilesToStagingDir(config, 'GENERAL', staging_dir, build_dir)
103 if distribution: 98 if distribution:
104 if len(distribution) > 1 and distribution[0] == '_': 99 if len(distribution) > 1 and distribution[0] == '_':
105 distribution = distribution[1:] 100 distribution = distribution[1:]
106 CopySectionFilesToStagingDir(config, distribution.upper(), 101 CopySectionFilesToStagingDir(config, distribution.upper(),
107 staging_dir, output_dir) 102 staging_dir, build_dir)
108 103
109 def IsChromeFrameFile(file):
robertshield 2011/11/17 20:19:08 Thanks for deleting this :)
Sigurður Ásgeirsson 2011/11/17 22:14:46 NP.
110 for cf_file in ['npchrome_frame', 'chrome_launcher']:
111 if file.lower().find(cf_file) != -1:
112 return True
113 return False
114 104
115 def CopySectionFilesToStagingDir(config, section, staging_dir, output_dir): 105 def CopySectionFilesToStagingDir(config, section, staging_dir, build_dir):
116 """Copies installer archive files specified in section to staging dir. 106 """Copies installer archive files specified in section to staging dir.
117 This method copies reads section from config file and copies all the files 107 This method copies reads section from config file and copies all the files
118 specified to staging dir. 108 specified to staging dir.
119 """ 109 """
120 for option in config.options(section): 110 for option in config.options(section):
121 if option.endswith('dir'): 111 if option.endswith('dir'):
122 continue 112 continue
123 113
124 dst = os.path.join(staging_dir, config.get(section, option)) 114 dst = os.path.join(staging_dir, config.get(section, option))
125 if not os.path.exists(dst): 115 if not os.path.exists(dst):
126 os.makedirs(dst) 116 os.makedirs(dst)
127 for file in glob.glob(os.path.join(output_dir, option)): 117 for file in glob.glob(os.path.join(build_dir, option)):
128 if IsChromeFrameFile(file): 118 shutil.copy(file, dst)
129 try:
130 shutil.copy(file, dst)
131 except IOError:
132 # TODO(robertshield): Temporary hack to work around problems building
133 # Chrome Frame binaries on non-Chrome Frame builders. Remove this
134 # asap.
135 print 'Error attempting to copy ' + file + ' to ' + dst
136 else:
137 shutil.copy(file, dst)
138 119
139 def GenerateDiffPatch(options, orig_file, new_file, patch_file): 120 def GenerateDiffPatch(options, orig_file, new_file, patch_file):
140 if (options.diff_algorithm == "COURGETTE"): 121 if (options.diff_algorithm == "COURGETTE"):
141 exe_file = os.path.join(options.last_chrome_installer, COURGETTE_EXEC) 122 exe_file = os.path.join(options.last_chrome_installer, COURGETTE_EXEC)
142 cmd = '%s -gen "%s" "%s" "%s"' % (exe_file, orig_file, new_file, patch_file) 123 cmd = '%s -gen "%s" "%s" "%s"' % (exe_file, orig_file, new_file, patch_file)
143 else: 124 else:
144 exe_file = os.path.join(options.output_dir, BSDIFF_EXEC) 125 exe_file = os.path.join(options.build_dir, BSDIFF_EXEC)
145 cmd = '%s "%s" "%s" "%s"' % (exe_file, orig_file, new_file, patch_file) 126 cmd = [exe_file, orig_file, new_file, patch_file]
146 RunSystemCommand(cmd) 127 RunSystemCommand(cmd)
147 128
148 def GetLZMAExec(output_dir): 129 def GetLZMAExec(build_dir):
149 lzma_exec = os.path.join(output_dir, "..", "..", "third_party", 130 lzma_exec = os.path.join(build_dir, "..", "..", "third_party",
150 "lzma_sdk", "Executable", "7za.exe") 131 "lzma_sdk", "Executable", "7za.exe")
151 return lzma_exec 132 return lzma_exec
152 133
153 def GetPrevVersion(output_dir, temp_dir, last_chrome_installer): 134 def GetPrevVersion(build_dir, temp_dir, last_chrome_installer):
154 if not last_chrome_installer: 135 if not last_chrome_installer:
155 return '' 136 return ''
156 137
157 lzma_exec = GetLZMAExec(options.output_dir) 138 lzma_exec = GetLZMAExec(options.build_dir)
158 prev_archive_file = os.path.join(options.last_chrome_installer, 139 prev_archive_file = os.path.join(options.last_chrome_installer,
159 options.output_name + ARCHIVE_SUFFIX) 140 options.output_name + ARCHIVE_SUFFIX)
160 cmd = '%s x -o"%s" "%s" Chrome-bin/*/chrome.dll' % (lzma_exec, temp_dir, 141 cmd = [lzma_exec,
161 prev_archive_file) 142 'x',
143 '-o"%s"' % temp_dir,
144 prev_archive_file,
145 'Chrome-bin/*/chrome.dll',]
162 RunSystemCommand(cmd) 146 RunSystemCommand(cmd)
163 dll_path = glob.glob(os.path.join(temp_dir, 'Chrome-bin', '*', 'chrome.dll')) 147 dll_path = glob.glob(os.path.join(temp_dir, 'Chrome-bin', '*', 'chrome.dll'))
164 return os.path.split(os.path.split(dll_path[0])[0])[1] 148 return os.path.split(os.path.split(dll_path[0])[0])[1]
165 149
166 def MakeStagingDirectories(output_dir): 150 def MakeStagingDirectories(staging_dir):
167 """Creates a staging path for installer archive. If directory exists already, 151 """Creates a staging path for installer archive. If directory exists already,
168 deletes the existing directory. 152 deletes the existing directory.
169 """ 153 """
170 prefixed_archive_dir = (options.archive_prefix or "") + ARCHIVE_DIR 154 file_path = os.path.join(staging_dir, TEMP_ARCHIVE_DIR)
171 file_path = os.path.join(output_dir, prefixed_archive_dir)
172 if os.path.exists(file_path): 155 if os.path.exists(file_path):
173 shutil.rmtree(file_path) 156 shutil.rmtree(file_path)
174 os.makedirs(file_path) 157 os.makedirs(file_path)
175 158
176 prefixed_temp_archive_dir = (options.archive_prefix or "") + TEMP_ARCHIVE_DIR 159 temp_file_path = os.path.join(staging_dir, TEMP_ARCHIVE_DIR)
177 temp_file_path = os.path.join(output_dir, prefixed_temp_archive_dir)
178 if os.path.exists(temp_file_path): 160 if os.path.exists(temp_file_path):
179 shutil.rmtree(temp_file_path) 161 shutil.rmtree(temp_file_path)
180 os.makedirs(temp_file_path) 162 os.makedirs(temp_file_path)
181 return (file_path, temp_file_path) 163 return (file_path, temp_file_path)
182 164
183 def Readconfig(output_dir, input_file, current_version): 165 def Readconfig(build_dir, input_file, current_version):
184 """Reads config information from input file after setting default value of 166 """Reads config information from input file after setting default value of
185 global variabes. 167 global variabes.
186 """ 168 """
187 variables = {} 169 variables = {}
188 variables['ChromeDir'] = CHROME_DIR 170 variables['ChromeDir'] = CHROME_DIR
189 variables['VersionDir'] = os.path.join(variables['ChromeDir'], 171 variables['VersionDir'] = os.path.join(variables['ChromeDir'],
190 current_version) 172 current_version)
191 config = ConfigParser.SafeConfigParser(variables) 173 config = ConfigParser.SafeConfigParser(variables)
192 config.read(input_file) 174 config.read(input_file)
193 return config 175 return config
194 176
195 def RunSystemCommand(cmd): 177 def RunSystemCommand(cmd):
196 print 'Running [' + cmd + ']' 178 print 'Running', cmd
197 exit_code = os.system(cmd) 179 exit_code = subprocess.call(cmd)
198 if (exit_code != 0): 180 if (exit_code != 0):
199 raise Exception("Error while running cmd: %s, exit_code: %s" % 181 raise Exception("Error while running cmd: %s, exit_code: %s" %
200 (cmd, exit_code)) 182 (cmd, exit_code))
201 183
202 def CreateArchiveFile(options, staging_dir, current_version, prev_version): 184 def CreateArchiveFile(options, staging_dir, current_version, prev_version):
203 """Creates a new installer archive file after deleting any existing old file. 185 """Creates a new installer archive file after deleting any existing old file.
204 """ 186 """
205 # First create an uncompressed archive file for the current build (chrome.7z) 187 # First create an uncompressed archive file for the current build (chrome.7z)
206 lzma_exec = GetLZMAExec(options.output_dir) 188 lzma_exec = GetLZMAExec(options.build_dir)
207 archive_file = os.path.join(options.output_dir, 189 archive_file = os.path.join(options.build_dir,
208 options.output_name + ARCHIVE_SUFFIX) 190 options.output_name + ARCHIVE_SUFFIX)
209 cmd = '%s a -t7z "%s" "%s" -mx0' % (lzma_exec, archive_file, 191 cmd = [lzma_exec,
210 os.path.join(staging_dir, CHROME_DIR)) 192 'a',
193 '-t7z',
194 archive_file,
195 os.path.join(staging_dir, CHROME_DIR),
196 '-mx0',]
211 # There doesnt seem to be any way in 7za.exe to override existing file so 197 # There doesnt seem to be any way in 7za.exe to override existing file so
212 # we always delete before creating a new one. 198 # we always delete before creating a new one.
213 if not os.path.exists(archive_file): 199 if not os.path.exists(archive_file):
214 RunSystemCommand(cmd) 200 RunSystemCommand(cmd)
215 elif options.skip_rebuild_archive != "true": 201 elif options.skip_rebuild_archive != "true":
216 os.remove(archive_file) 202 os.remove(archive_file)
217 RunSystemCommand(cmd) 203 RunSystemCommand(cmd)
218 204
219 # If we are generating a patch, run bsdiff against previous build and 205 # If we are generating a patch, run bsdiff against previous build and
220 # compress the resulting patch file. If this is not a patch just compress the 206 # compress the resulting patch file. If this is not a patch just compress the
221 # uncompressed archive file. 207 # uncompressed archive file.
222 patch_name_prefix = options.output_name + CHROME_PATCH_FILE_SUFFIX 208 patch_name_prefix = options.output_name + CHROME_PATCH_FILE_SUFFIX
223 if options.last_chrome_installer: 209 if options.last_chrome_installer:
224 prev_archive_file = os.path.join(options.last_chrome_installer, 210 prev_archive_file = os.path.join(options.last_chrome_installer,
225 options.output_name + ARCHIVE_SUFFIX) 211 options.output_name + ARCHIVE_SUFFIX)
226 patch_file = os.path.join(options.output_dir, patch_name_prefix + 212 patch_file = os.path.join(options.build_dir, patch_name_prefix +
227 PATCH_FILE_EXT) 213 PATCH_FILE_EXT)
228 GenerateDiffPatch(options, prev_archive_file, archive_file, patch_file) 214 GenerateDiffPatch(options, prev_archive_file, archive_file, patch_file)
229 compressed_archive_file = patch_name_prefix + '_' + \ 215 compressed_archive_file = patch_name_prefix + '_' + \
230 current_version + '_from_' + prev_version + \ 216 current_version + '_from_' + prev_version + \
231 COMPRESSED_FILE_EXT 217 COMPRESSED_FILE_EXT
232 orig_file = patch_file 218 orig_file = patch_file
233 else: 219 else:
234 compressed_archive_file = options.output_name + COMPRESSED_ARCHIVE_SUFFIX 220 compressed_archive_file = options.output_name + COMPRESSED_ARCHIVE_SUFFIX
235 orig_file = archive_file 221 orig_file = archive_file
236 222
237 compressed_archive_file_path = os.path.join(options.output_dir, 223 compressed_archive_file_path = os.path.join(options.build_dir,
238 compressed_archive_file) 224 compressed_archive_file)
239 CompressUsingLZMA(options.output_dir, compressed_archive_file_path, orig_file) 225 CompressUsingLZMA(options.build_dir, compressed_archive_file_path, orig_file)
240 226
241 return compressed_archive_file 227 return compressed_archive_file
242 228
243 229
244 def PrepareSetupExec(options, staging_dir, current_version, prev_version): 230 def PrepareSetupExec(options, staging_dir, current_version, prev_version):
245 """Prepares setup.exe for bundling in mini_installer based on options.""" 231 """Prepares setup.exe for bundling in mini_installer based on options."""
246 if options.setup_exe_format == "FULL": 232 if options.setup_exe_format == "FULL":
247 setup_file = SETUP_EXEC 233 setup_file = SETUP_EXEC
248 elif options.setup_exe_format == "DIFF": 234 elif options.setup_exe_format == "DIFF":
249 if not options.last_chrome_installer: 235 if not options.last_chrome_installer:
250 raise Exception( 236 raise Exception(
251 "To use DIFF for setup.exe, --last_chrome_installer is needed.") 237 "To use DIFF for setup.exe, --last_chrome_installer is needed.")
252 prev_setup_file = os.path.join(options.last_chrome_installer, SETUP_EXEC) 238 prev_setup_file = os.path.join(options.last_chrome_installer, SETUP_EXEC)
253 new_setup_file = os.path.join(options.output_dir, SETUP_EXEC) 239 new_setup_file = os.path.join(options.build_dir, SETUP_EXEC)
254 patch_file = os.path.join(options.output_dir, SETUP_PATCH_FILE_PREFIX + 240 patch_file = os.path.join(options.build_dir, SETUP_PATCH_FILE_PREFIX +
255 PATCH_FILE_EXT) 241 PATCH_FILE_EXT)
256 GenerateDiffPatch(options, prev_setup_file, new_setup_file, patch_file) 242 GenerateDiffPatch(options, prev_setup_file, new_setup_file, patch_file)
257 setup_file = SETUP_PATCH_FILE_PREFIX + '_' + current_version + \ 243 setup_file = SETUP_PATCH_FILE_PREFIX + '_' + current_version + \
258 '_from_' + prev_version + COMPRESSED_FILE_EXT 244 '_from_' + prev_version + COMPRESSED_FILE_EXT
259 setup_file_path = os.path.join(options.output_dir, setup_file) 245 setup_file_path = os.path.join(options.build_dir, setup_file)
260 CompressUsingLZMA(options.output_dir, setup_file_path, patch_file) 246 CompressUsingLZMA(options.build_dir, setup_file_path, patch_file)
261 else: 247 else:
262 cmd = 'makecab.exe /D CompressionType=LZX /V1 /L "%s" "%s"' % ( 248 cmd = ['makecab.exe',
263 options.output_dir, os.path.join(options.output_dir, SETUP_EXEC)) 249 '/D',
250 'CompressionType=LZX',
251 '/V1',
252 '/L',
253 options.build_dir,
254 os.path.join(options.build_dir, SETUP_EXEC),]
264 RunSystemCommand(cmd) 255 RunSystemCommand(cmd)
265 setup_file = SETUP_EXEC[:len(SETUP_EXEC) - 1] + "_" 256 setup_file = SETUP_EXEC[:-1] + "_"
266 return setup_file 257 return setup_file
267 258
268 259
269 def CreateResourceInputFile(output_dir, setup_format, archive_file, setup_file): 260 _RESOURCE_FILE_TEMPLATE = """
261 // This file is automatically generated by create_installer_archive.py.
262 // It contains the resource entries that are going to be linked inside
263 // mini_installer.exe. For each file to be linked there should be two
264 // lines:
265 // - The first line contains the output filename (without path) and the
266 // type of the resource ('BN' - not compressed , 'BL' - LZ compressed,
267 // 'B7' - LZMA compressed)
268 // - The second line contains the path to the input file. Uses '/' to
269 // separate path components.
270
271 %(setup_file)s %(setup_file_resource_type)s
272 %(setup_file_path)s
273
274 %(archive_file)s B7
275 %(archive_file_path)s
276 """
277
278
279 def CreateResourceInputFile(
280 build_dir, setup_format, archive_file, setup_file, resource_file_path):
270 """Creates resource input file (packed_files.txt) for mini_installer project. 281 """Creates resource input file (packed_files.txt) for mini_installer project.
271 282
272 This method checks the format of setup.exe being used and according sets 283 This method checks the format of setup.exe being used and according sets
273 its resource type. 284 its resource type.
274 """ 285 """
275 setup_resource_type = "BL" 286 setup_resource_type = "BL"
276 if (options.setup_exe_format == "FULL"): 287 if (setup_format == "FULL"):
277 setup_resource_type = "BN" 288 setup_resource_type = "BN"
278 elif (options.setup_exe_format == "DIFF"): 289 elif (setup_format == "DIFF"):
279 setup_resource_type = "B7" 290 setup_resource_type = "B7"
280 setup_file_entry = "%s\t\t%s\n\"%s\"" % (setup_file, setup_resource_type,
281 os.path.join(output_dir, setup_file).replace("\\","/"))
282 291
283 archive_file_entry = "\n%s\t\tB7\n\"%s\"\n" % (archive_file, 292 # Expand the resource file template.
284 os.path.join(output_dir, archive_file).replace("\\","/")) 293 args = {
285 output_file = os.path.join(output_dir, MINI_INSTALLER_INPUT_FILE) 294 'setup_file': setup_file,
286 f = open(output_file, 'w') 295 'setup_file_resource_type': setup_resource_type,
287 try: 296 'setup_file_path':
288 f.write(PACKED_FILE_COMMENTS) 297 os.path.join(build_dir, setup_file).replace("\\","/"),
robertshield 2011/11/17 20:19:08 replace() -> os.path.normpath()?
Sigurður Ásgeirsson 2011/11/17 22:14:46 I think forward slashes are wanted here because ba
289 f.write(setup_file_entry) 298 'archive_file': archive_file,
290 f.write(archive_file_entry) 299 'archive_file_path':
291 finally: 300 os.path.join(build_dir, archive_file).replace("\\","/"),
robertshield 2011/11/17 20:19:08 ditto
Sigurður Ásgeirsson 2011/11/17 22:14:46 ditto
292 f.close() 301 }
302 resource_file = _RESOURCE_FILE_TEMPLATE % args
303
304 with open(resource_file_path, 'w') as f:
305 f.write(resource_file)
293 306
294 307
295 def main(options): 308 def main(options):
296 """Main method that reads input file, creates archive file and write 309 """Main method that reads input file, creates archive file and write
297 resource input file. 310 resource input file.
298 """ 311 """
299 current_version = BuildVersion(options.output_dir) 312 current_version = BuildVersion(options.build_dir)
300 313
301 config = Readconfig(options.output_dir, options.input_file, current_version) 314 config = Readconfig(options.build_dir, options.input_file, current_version)
302 315
303 (staging_dir, temp_dir) = MakeStagingDirectories(options.output_dir) 316 (staging_dir, temp_dir) = MakeStagingDirectories(options.staging_dir)
304 317
305 prev_version = GetPrevVersion(options.output_dir, temp_dir, 318 prev_version = GetPrevVersion(options.build_dir, temp_dir,
306 options.last_chrome_installer) 319 options.last_chrome_installer)
307 320
308 CopyAllFilesToStagingDir(config, options.distribution, 321 CopyAllFilesToStagingDir(config, options.distribution,
309 staging_dir, options.output_dir) 322 staging_dir, options.build_dir)
310 323
311 version_numbers = current_version.split('.') 324 version_numbers = current_version.split('.')
312 current_build_number = version_numbers[2] + '.' + version_numbers[3] 325 current_build_number = version_numbers[2] + '.' + version_numbers[3]
313 prev_build_number = '' 326 prev_build_number = ''
314 if prev_version: 327 if prev_version:
315 version_numbers = prev_version.split('.') 328 version_numbers = prev_version.split('.')
316 prev_build_number = version_numbers[2] + '.' + version_numbers[3] 329 prev_build_number = version_numbers[2] + '.' + version_numbers[3]
317 330
318 # Name of the archive file built (for example - chrome.7z or 331 # Name of the archive file built (for example - chrome.7z or
319 # patch-<old_version>-<new_version>.7z or patch-<new_version>.7z 332 # patch-<old_version>-<new_version>.7z or patch-<new_version>.7z
320 archive_file = CreateArchiveFile(options, staging_dir, 333 archive_file = CreateArchiveFile(options, staging_dir,
321 current_build_number, prev_build_number) 334 current_build_number, prev_build_number)
322 335
323 setup_file = PrepareSetupExec(options, staging_dir, 336 setup_file = PrepareSetupExec(options, staging_dir,
324 current_build_number, prev_build_number) 337 current_build_number, prev_build_number)
325 338
326 CreateResourceInputFile(options.output_dir, options.setup_exe_format, 339 CreateResourceInputFile(options.build_dir, options.setup_exe_format,
327 archive_file, setup_file) 340 archive_file, setup_file, options.resource_file_path)
341
342 def _ParseOptions():
343 parser = optparse.OptionParser()
344 parser.add_option('-i', '--input_file',
345 help='Input file describing which files to archive.')
346 parser.add_option('-o', '--build_dir',
347 help='Build directory. The paths in input_file are relative to this.')
348 parser.add_option('--staging_dir',
349 help='Staging directory where intermediate files and directories '
350 'will be created'),
351 parser.add_option('--resource_file_path',
352 help='The path where the resource file will be output. '
353 'Defaults to %s in the build directory.' %
354 MINI_INSTALLER_INPUT_FILE),
355 parser.add_option('-d', '--distribution',
356 help='Name of Chromium Distribution. Optional.')
357 parser.add_option('-s', '--skip_rebuild_archive',
358 default="False", help='Skip re-building Chrome.7z archive if it exists.')
359 parser.add_option('-l', '--last_chrome_installer',
360 help='Generate differential installer. The value of this parameter '
361 'specifies the directory that contains base versions of '
362 'setup.exe, courgette.exe (if --diff_algorithm is COURGETTE) '
363 '& chrome.7z.')
364 parser.add_option('-f', '--setup_exe_format', default='COMPRESSED',
365 help='How setup.exe should be included {COMPRESSED|DIFF|FULL}.')
366 parser.add_option('-a', '--diff_algorithm', default='BSDIFF',
367 help='Diff algorithm to use when generating differential patches '
368 '{BSDIFF|COURGETTE}.')
369 parser.add_option('-n', '--output_name', default='chrome',
370 help='Name used to prefix names of generated archives.')
371
372 options, args = parser.parse_args()
373
374 if not options.build_dir:
375 parser.error('You must provide a build dir.')
376
377 if not options.staging_dir:
378 parser.error('You must provide a staging dir.')
379
380 if not options.resource_file_path:
381 options.options.resource_file_path = os.path.join(options.build_dir,
382 MINI_INSTALLER_INPUT_FILE)
383
384 print sys.argv
385 return options
328 386
329 387
330 if '__main__' == __name__: 388 if '__main__' == __name__:
331 option_parser = optparse.OptionParser() 389 sys.exit(main(_ParseOptions()))
332 option_parser.add_option('-o', '--output_dir', help='Output directory')
333 option_parser.add_option('-i', '--input_file', help='Input file')
334 option_parser.add_option('-d', '--distribution',
335 help='Name of Chromium Distribution. Optional.')
336 option_parser.add_option('-s', '--skip_rebuild_archive',
337 default="False", help='Skip re-building Chrome.7z archive if it exists.')
338 option_parser.add_option('-l', '--last_chrome_installer',
339 help='Generate differential installer. The value of this parameter ' +
340 'specifies the directory that contains base versions of ' +
341 'setup.exe, courgette.exe (if --diff_algorithm is COURGETTE) ' +
342 '& chrome.7z.')
343 option_parser.add_option('-p', '--archive_prefix',
344 help='Specifies a prefix to the archive path. Useful if building ' +
345 'multiple installer archives.')
346 option_parser.add_option('-f', '--setup_exe_format', default='COMPRESSED',
347 help='How setup.exe should be included {COMPRESSED|DIFF|FULL}.')
348 option_parser.add_option('-a', '--diff_algorithm', default='BSDIFF',
349 help='Diff algorithm to use when generating differential patches ' +
350 '{BSDIFF|COURGETTE}.')
351 option_parser.add_option('-n', '--output_name', default='chrome',
352 help='Name used to prefix names of generated archives.')
353
354 options, args = option_parser.parse_args()
355 print sys.argv
356 sys.exit(main(options))
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698