diff options
author | siggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-21 16:28:10 +0000 |
---|---|---|
committer | siggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-21 16:28:10 +0000 |
commit | 4735d2ba549d8b45afd4e9ba0bb1b9c5aea05627 (patch) | |
tree | 0574cee1c6ecc023187c9082454efb46540640d5 /chrome | |
parent | 12233c36eee3a1c047746aedb6d94ca49051d73d (diff) | |
download | chromium_src-4735d2ba549d8b45afd4e9ba0bb1b9c5aea05627.zip chromium_src-4735d2ba549d8b45afd4e9ba0bb1b9c5aea05627.tar.gz chromium_src-4735d2ba549d8b45afd4e9ba0bb1b9c5aea05627.tar.bz2 |
Revert 110934 - Retry of http://codereview.chromium.org/8589029.
Start of mini_installer build config refactoring.
Baby step one:
- All intermediate files go into the intermediate directory.
- The packed_files.txt file is gone, and instead the mini_installer
is baked from a resource file output into the intermediate dir.
- Cleanup use of implict global "options" in the python script.
- Use subprocess.call with a list instead of os.system.
R=robertshield@chromium.org,grt@chromium.org
BUG=102115
Review URL: http://codereview.chromium.org/8600008
TBR=siggi@chromium.org
Review URL: http://codereview.chromium.org/8575019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110936 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/installer/mini_installer.gyp | 10 | ||||
-rw-r--r-- | chrome/installer/mini_installer/mini_installer.rc | 21 | ||||
-rw-r--r-- | chrome/installer/mini_installer/mini_installer_exe_version.rc.version | 1 | ||||
-rwxr-xr-x | chrome/tools/build/win/create_installer_archive.py | 265 |
4 files changed, 142 insertions, 155 deletions
diff --git a/chrome/installer/mini_installer.gyp b/chrome/installer/mini_installer.gyp index 822a085c..4f73b98 100644 --- a/chrome/installer/mini_installer.gyp +++ b/chrome/installer/mini_installer.gyp @@ -22,6 +22,7 @@ ], 'include_dirs': [ '../..', + '<(PRODUCT_DIR)', '<(INTERMEDIATE_DIR)', '<(SHARED_INTERMEDIATE_DIR)/chrome', ], @@ -41,7 +42,6 @@ 'mini_installer/mini_string.h', 'mini_installer/pe_resource.cc', 'mini_installer/pe_resource.h', - '<(INTERMEDIATE_DIR)/packed_files.rc', ], 'msvs_settings': { 'VCCLCompilerTool': { @@ -209,15 +209,13 @@ '<(PRODUCT_DIR)/<(RULE_INPUT_NAME).7z', '<(PRODUCT_DIR)/<(RULE_INPUT_NAME).packed.7z', '<(PRODUCT_DIR)/setup.ex_', - '<(INTERMEDIATE_DIR)/packed_files.rc', + '<(PRODUCT_DIR)/packed_files.txt', ], 'action': [ 'python', '<(create_installer_archive_py_path)', - '--build_dir', '<(PRODUCT_DIR)', - '--staging_dir', '<(INTERMEDIATE_DIR)', - '--input_file', '<(RULE_INPUT_PATH)', - '--resource_file_path', '<(INTERMEDIATE_DIR)/packed_files.rc', + '--output_dir=<(PRODUCT_DIR)', + '--input_file=<(RULE_INPUT_PATH)', # TODO(sgk): may just use environment variables #'--distribution=$(CHROMIUM_BUILD)', '--distribution=_google_chrome', diff --git a/chrome/installer/mini_installer/mini_installer.rc b/chrome/installer/mini_installer/mini_installer.rc index fff6a53..420dea9 100644 --- a/chrome/installer/mini_installer/mini_installer.rc +++ b/chrome/installer/mini_installer/mini_installer.rc @@ -49,7 +49,28 @@ BEGIN "#undef APSTUDIO_HIDDEN_SYMBOL\0" END +3 TEXTINCLUDE +BEGIN + "#include ""mini_installer_exe_version.rc""\r\0" +END + #endif // APSTUDIO_INVOKED +// This file lists the resources that are going to be packed with the exe. +#include "packed_files.txt" + #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#include "mini_installer_exe_version.rc" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/chrome/installer/mini_installer/mini_installer_exe_version.rc.version b/chrome/installer/mini_installer/mini_installer_exe_version.rc.version index c15cfc3..3b024d1 100644 --- a/chrome/installer/mini_installer/mini_installer_exe_version.rc.version +++ b/chrome/installer/mini_installer/mini_installer_exe_version.rc.version @@ -2,7 +2,6 @@ // // Version // -#include "verrsrc.h" VS_VERSION_INFO VERSIONINFO FILEVERSION @MAJOR@,@MINOR@,@BUILD@,@PATCH@ diff --git a/chrome/tools/build/win/create_installer_archive.py b/chrome/tools/build/win/create_installer_archive.py index 233aadc..7cec0d6 100755 --- a/chrome/tools/build/win/create_installer_archive.py +++ b/chrome/tools/build/win/create_installer_archive.py @@ -14,10 +14,10 @@ import ConfigParser import glob +import md5 import optparse import os import shutil -import subprocess import sys @@ -35,14 +35,24 @@ COMPRESSED_ARCHIVE_SUFFIX = ".packed.7z" COMPRESSED_FILE_EXT = ".packed.7z" # extension of patch archive file COURGETTE_EXEC = "courgette.exe" MINI_INSTALLER_INPUT_FILE = "packed_files.txt" +PACKED_FILE_COMMENTS = """ +// This file is automatically generated by create_installer_archive.py. +// It contains the resource entries that are going to be linked inside +// mini_installer.exe. For each file to be linked there should be two +// lines: +// - The first line contains the output filename (without path) and the +// type of the resource ('BN' - not compressed , 'BL' - LZ compressed, +// 'B7' - LZMA compressed) +// - The second line contains the path to the input file. Uses '/' to +// separate path components. +""" PATCH_FILE_EXT = '.diff' SETUP_EXEC = "setup.exe" SETUP_PATCH_FILE_PREFIX = "setup_patch" TEMP_ARCHIVE_DIR = "temp_installer_archive" VERSION_FILE = "VERSION" - -def BuildVersion(build_dir): +def BuildVersion(output_dir): """Returns the full build version string constructed from information in VERSION_FILE. Any segment not found in that file will default to '0'. """ @@ -50,7 +60,7 @@ def BuildVersion(build_dir): minor = 0 build = 0 patch = 0 - for line in open(os.path.join(build_dir, '../../chrome', VERSION_FILE), 'r'): + for line in open(os.path.join(output_dir, "..", "..", "chrome", VERSION_FILE), 'r'): line = line.rstrip() if line.startswith('MAJOR='): major = line[6:] @@ -62,11 +72,9 @@ def BuildVersion(build_dir): patch = line[6:] return '%s.%s.%s.%s' % (major, minor, build, patch) - -def CompressUsingLZMA(build_dir, compressed_file, input_file): - lzma_exec = GetLZMAExec(build_dir) - cmd = [lzma_exec, - 'a', '-t7z', +def CompressUsingLZMA(output_dir, compressed_file, input_file): + lzma_exec = GetLZMAExec(output_dir) + cmd = ('%s a -t7z ' # Flags equivalent to -mx9 (ultra) but with the bcj2 turned on (exe # pre-filter). This results in a ~2.3MB decrease in installer size on # a 24MB installer. @@ -75,34 +83,36 @@ def CompressUsingLZMA(build_dir, compressed_file, input_file): # 26bit = 64MB. This results in an additional ~3.5MB decrease. # Older 7zip versions can support these settings, as these changes # rely on existing functionality in the lzma format. - '-m0=BCJ2', - '-m1=LZMA:d26:fb64', - '-m2=LZMA:d20:fb64:mf=bt2', - '-m3=LZMA:d20:fb64:mf=bt2', - '-mb0:1', - '-mb0s1:2', - '-mb0s2:3', - compressed_file, - input_file,] + '-m0=BCJ2 ' + '-m1=LZMA:d26:fb64 ' + '-m2=LZMA:d20:fb64:mf=bt2 ' + '-m3=LZMA:d20:fb64:mf=bt2 ' + '-mb0:1 -mb0s1:2 ' + '-mb0s2:3 ' + '"%s" "%s"') % (lzma_exec, compressed_file, input_file) if os.path.exists(compressed_file): os.remove(compressed_file) RunSystemCommand(cmd) - -def CopyAllFilesToStagingDir(config, distribution, staging_dir, build_dir): +def CopyAllFilesToStagingDir(config, distribution, staging_dir, output_dir): """Copies the files required for installer archive. Copies all common files required for various distributions of Chromium and also files for the specific Chromium build specified by distribution. """ - CopySectionFilesToStagingDir(config, 'GENERAL', staging_dir, build_dir) + CopySectionFilesToStagingDir(config, 'GENERAL', staging_dir, output_dir) if distribution: if len(distribution) > 1 and distribution[0] == '_': distribution = distribution[1:] CopySectionFilesToStagingDir(config, distribution.upper(), - staging_dir, build_dir) + staging_dir, output_dir) +def IsChromeFrameFile(file): + for cf_file in ['npchrome_frame', 'chrome_launcher']: + if file.lower().find(cf_file) != -1: + return True + return False -def CopySectionFilesToStagingDir(config, section, staging_dir, build_dir): +def CopySectionFilesToStagingDir(config, section, staging_dir, output_dir): """Copies installer archive files specified in section to staging dir. This method copies reads section from config file and copies all the files specified to staging dir. @@ -114,55 +124,63 @@ def CopySectionFilesToStagingDir(config, section, staging_dir, build_dir): dst = os.path.join(staging_dir, config.get(section, option)) if not os.path.exists(dst): os.makedirs(dst) - for file in glob.glob(os.path.join(build_dir, option)): - shutil.copy(file, dst) + for file in glob.glob(os.path.join(output_dir, option)): + if IsChromeFrameFile(file): + try: + shutil.copy(file, dst) + except IOError: + # TODO(robertshield): Temporary hack to work around problems building + # Chrome Frame binaries on non-Chrome Frame builders. Remove this + # asap. + print 'Error attempting to copy ' + file + ' to ' + dst + else: + shutil.copy(file, dst) def GenerateDiffPatch(options, orig_file, new_file, patch_file): if (options.diff_algorithm == "COURGETTE"): exe_file = os.path.join(options.last_chrome_installer, COURGETTE_EXEC) cmd = '%s -gen "%s" "%s" "%s"' % (exe_file, orig_file, new_file, patch_file) else: - exe_file = os.path.join(options.build_dir, BSDIFF_EXEC) - cmd = [exe_file, orig_file, new_file, patch_file,] + exe_file = os.path.join(options.output_dir, BSDIFF_EXEC) + cmd = '%s "%s" "%s" "%s"' % (exe_file, orig_file, new_file, patch_file) RunSystemCommand(cmd) -def GetLZMAExec(build_dir): - lzma_exec = os.path.join(build_dir, "..", "..", "third_party", +def GetLZMAExec(output_dir): + lzma_exec = os.path.join(output_dir, "..", "..", "third_party", "lzma_sdk", "Executable", "7za.exe") return lzma_exec -def GetPrevVersion(build_dir, temp_dir, last_chrome_installer): +def GetPrevVersion(output_dir, temp_dir, last_chrome_installer): if not last_chrome_installer: return '' - lzma_exec = GetLZMAExec(options.build_dir) + lzma_exec = GetLZMAExec(options.output_dir) prev_archive_file = os.path.join(options.last_chrome_installer, options.output_name + ARCHIVE_SUFFIX) - cmd = [lzma_exec, - 'x', - '-o"%s"' % temp_dir, - prev_archive_file, - 'Chrome-bin/*/chrome.dll',] + cmd = '%s x -o"%s" "%s" Chrome-bin/*/chrome.dll' % (lzma_exec, temp_dir, + prev_archive_file) RunSystemCommand(cmd) dll_path = glob.glob(os.path.join(temp_dir, 'Chrome-bin', '*', 'chrome.dll')) return os.path.split(os.path.split(dll_path[0])[0])[1] -def MakeStagingDirectories(staging_dir): +def MakeStagingDirectories(output_dir): """Creates a staging path for installer archive. If directory exists already, deletes the existing directory. """ - file_path = os.path.join(staging_dir, TEMP_ARCHIVE_DIR) + prefixed_archive_dir = (options.archive_prefix or "") + ARCHIVE_DIR + file_path = os.path.join(output_dir, prefixed_archive_dir) if os.path.exists(file_path): shutil.rmtree(file_path) os.makedirs(file_path) - temp_file_path = os.path.join(staging_dir, TEMP_ARCHIVE_DIR) + prefixed_temp_archive_dir = (options.archive_prefix or "") + TEMP_ARCHIVE_DIR + temp_file_path = os.path.join(output_dir, prefixed_temp_archive_dir) if os.path.exists(temp_file_path): shutil.rmtree(temp_file_path) os.makedirs(temp_file_path) return (file_path, temp_file_path) -def Readconfig(build_dir, input_file, current_version): +def Readconfig(output_dir, input_file, current_version): """Reads config information from input file after setting default value of global variabes. """ @@ -175,8 +193,8 @@ def Readconfig(build_dir, input_file, current_version): return config def RunSystemCommand(cmd): - print 'Running', cmd - exit_code = subprocess.call(cmd) + print 'Running [' + cmd + ']' + exit_code = os.system(cmd) if (exit_code != 0): raise Exception("Error while running cmd: %s, exit_code: %s" % (cmd, exit_code)) @@ -185,15 +203,11 @@ def CreateArchiveFile(options, staging_dir, current_version, prev_version): """Creates a new installer archive file after deleting any existing old file. """ # First create an uncompressed archive file for the current build (chrome.7z) - lzma_exec = GetLZMAExec(options.build_dir) - archive_file = os.path.join(options.build_dir, + lzma_exec = GetLZMAExec(options.output_dir) + archive_file = os.path.join(options.output_dir, options.output_name + ARCHIVE_SUFFIX) - cmd = [lzma_exec, - 'a', - '-t7z', - archive_file, - os.path.join(staging_dir, CHROME_DIR), - '-mx0',] + cmd = '%s a -t7z "%s" "%s" -mx0' % (lzma_exec, archive_file, + os.path.join(staging_dir, CHROME_DIR)) # There doesnt seem to be any way in 7za.exe to override existing file so # we always delete before creating a new one. if not os.path.exists(archive_file): @@ -209,7 +223,7 @@ def CreateArchiveFile(options, staging_dir, current_version, prev_version): if options.last_chrome_installer: prev_archive_file = os.path.join(options.last_chrome_installer, options.output_name + ARCHIVE_SUFFIX) - patch_file = os.path.join(options.build_dir, patch_name_prefix + + patch_file = os.path.join(options.output_dir, patch_name_prefix + PATCH_FILE_EXT) GenerateDiffPatch(options, prev_archive_file, archive_file, patch_file) compressed_archive_file = patch_name_prefix + '_' + \ @@ -220,9 +234,9 @@ def CreateArchiveFile(options, staging_dir, current_version, prev_version): compressed_archive_file = options.output_name + COMPRESSED_ARCHIVE_SUFFIX orig_file = archive_file - compressed_archive_file_path = os.path.join(options.build_dir, + compressed_archive_file_path = os.path.join(options.output_dir, compressed_archive_file) - CompressUsingLZMA(options.build_dir, compressed_archive_file_path, orig_file) + CompressUsingLZMA(options.output_dir, compressed_archive_file_path, orig_file) return compressed_archive_file @@ -236,88 +250,63 @@ def PrepareSetupExec(options, staging_dir, current_version, prev_version): raise Exception( "To use DIFF for setup.exe, --last_chrome_installer is needed.") prev_setup_file = os.path.join(options.last_chrome_installer, SETUP_EXEC) - new_setup_file = os.path.join(options.build_dir, SETUP_EXEC) - patch_file = os.path.join(options.build_dir, SETUP_PATCH_FILE_PREFIX + + new_setup_file = os.path.join(options.output_dir, SETUP_EXEC) + patch_file = os.path.join(options.output_dir, SETUP_PATCH_FILE_PREFIX + PATCH_FILE_EXT) GenerateDiffPatch(options, prev_setup_file, new_setup_file, patch_file) setup_file = SETUP_PATCH_FILE_PREFIX + '_' + current_version + \ '_from_' + prev_version + COMPRESSED_FILE_EXT - setup_file_path = os.path.join(options.build_dir, setup_file) - CompressUsingLZMA(options.build_dir, setup_file_path, patch_file) + setup_file_path = os.path.join(options.output_dir, setup_file) + CompressUsingLZMA(options.output_dir, setup_file_path, patch_file) else: - cmd = ['makecab.exe', - '/D', 'CompressionType=LZX', - '/V1', - '/L', options.build_dir, - os.path.join(options.build_dir, SETUP_EXEC),] + cmd = 'makecab.exe /D CompressionType=LZX /V1 /L "%s" "%s"' % ( + options.output_dir, os.path.join(options.output_dir, SETUP_EXEC)) RunSystemCommand(cmd) - setup_file = SETUP_EXEC[:-1] + "_" + setup_file = SETUP_EXEC[:len(SETUP_EXEC) - 1] + "_" return setup_file -_RESOURCE_FILE_TEMPLATE = """ -// This file is automatically generated by create_installer_archive.py. -// It contains the resource entries that are going to be linked inside -// mini_installer.exe. For each file to be linked there should be two -// lines: -// - The first line contains the output filename (without path) and the -// type of the resource ('BN' - not compressed , 'BL' - LZ compressed, -// 'B7' - LZMA compressed) -// - The second line contains the path to the input file. Uses '/' to -// separate path components. - -%(setup_file)s %(setup_file_resource_type)s - %(setup_file_path)s - -%(archive_file)s B7 - %(archive_file_path)s -""" - - -def CreateResourceInputFile( - build_dir, setup_format, archive_file, setup_file, resource_file_path): +def CreateResourceInputFile(output_dir, setup_format, archive_file, setup_file): """Creates resource input file (packed_files.txt) for mini_installer project. This method checks the format of setup.exe being used and according sets its resource type. """ setup_resource_type = "BL" - if (setup_format == "FULL"): + if (options.setup_exe_format == "FULL"): setup_resource_type = "BN" - elif (setup_format == "DIFF"): + elif (options.setup_exe_format == "DIFF"): setup_resource_type = "B7" + setup_file_entry = "%s\t\t%s\n\"%s\"" % (setup_file, setup_resource_type, + os.path.join(output_dir, setup_file).replace("\\","/")) - # Expand the resource file template. - args = { - 'setup_file': setup_file, - 'setup_file_resource_type': setup_resource_type, - 'setup_file_path': - os.path.join(build_dir, setup_file).replace("\\","/"), - 'archive_file': archive_file, - 'archive_file_path': - os.path.join(build_dir, archive_file).replace("\\","/"), - } - resource_file = _RESOURCE_FILE_TEMPLATE % args - - with open(resource_file_path, 'w') as f: - f.write(resource_file) + archive_file_entry = "\n%s\t\tB7\n\"%s\"\n" % (archive_file, + os.path.join(output_dir, archive_file).replace("\\","/")) + output_file = os.path.join(output_dir, MINI_INSTALLER_INPUT_FILE) + f = open(output_file, 'w') + try: + f.write(PACKED_FILE_COMMENTS) + f.write(setup_file_entry) + f.write(archive_file_entry) + finally: + f.close() def main(options): """Main method that reads input file, creates archive file and write resource input file. """ - current_version = BuildVersion(options.build_dir) + current_version = BuildVersion(options.output_dir) - config = Readconfig(options.build_dir, options.input_file, current_version) + config = Readconfig(options.output_dir, options.input_file, current_version) - (staging_dir, temp_dir) = MakeStagingDirectories(options.staging_dir) + (staging_dir, temp_dir) = MakeStagingDirectories(options.output_dir) - prev_version = GetPrevVersion(options.build_dir, temp_dir, + prev_version = GetPrevVersion(options.output_dir, temp_dir, options.last_chrome_installer) CopyAllFilesToStagingDir(config, options.distribution, - staging_dir, options.build_dir) + staging_dir, options.output_dir) version_numbers = current_version.split('.') current_build_number = version_numbers[2] + '.' + version_numbers[3] @@ -334,54 +323,34 @@ def main(options): setup_file = PrepareSetupExec(options, staging_dir, current_build_number, prev_build_number) - CreateResourceInputFile(options.build_dir, options.setup_exe_format, - archive_file, setup_file, options.resource_file_path) - -def _ParseOptions(): - parser = optparse.OptionParser() - parser.add_option('-i', '--input_file', - help='Input file describing which files to archive.') - parser.add_option('-o', '--build_dir', - help='Build directory. The paths in input_file are relative to this.') - parser.add_option('--staging_dir', - help='Staging directory where intermediate files and directories ' - 'will be created'), - parser.add_option('--resource_file_path', - help='The path where the resource file will be output. ' - 'Defaults to %s in the build directory.' % - MINI_INSTALLER_INPUT_FILE), - parser.add_option('-d', '--distribution', + CreateResourceInputFile(options.output_dir, options.setup_exe_format, + archive_file, setup_file) + + +if '__main__' == __name__: + option_parser = optparse.OptionParser() + option_parser.add_option('-o', '--output_dir', help='Output directory') + option_parser.add_option('-i', '--input_file', help='Input file') + option_parser.add_option('-d', '--distribution', help='Name of Chromium Distribution. Optional.') - parser.add_option('-s', '--skip_rebuild_archive', + option_parser.add_option('-s', '--skip_rebuild_archive', default="False", help='Skip re-building Chrome.7z archive if it exists.') - parser.add_option('-l', '--last_chrome_installer', - help='Generate differential installer. The value of this parameter ' - 'specifies the directory that contains base versions of ' - 'setup.exe, courgette.exe (if --diff_algorithm is COURGETTE) ' + option_parser.add_option('-l', '--last_chrome_installer', + help='Generate differential installer. The value of this parameter ' + + 'specifies the directory that contains base versions of ' + + 'setup.exe, courgette.exe (if --diff_algorithm is COURGETTE) ' + '& chrome.7z.') - parser.add_option('-f', '--setup_exe_format', default='COMPRESSED', + option_parser.add_option('-p', '--archive_prefix', + help='Specifies a prefix to the archive path. Useful if building ' + + 'multiple installer archives.') + option_parser.add_option('-f', '--setup_exe_format', default='COMPRESSED', help='How setup.exe should be included {COMPRESSED|DIFF|FULL}.') - parser.add_option('-a', '--diff_algorithm', default='BSDIFF', - help='Diff algorithm to use when generating differential patches ' + option_parser.add_option('-a', '--diff_algorithm', default='BSDIFF', + help='Diff algorithm to use when generating differential patches ' + '{BSDIFF|COURGETTE}.') - parser.add_option('-n', '--output_name', default='chrome', + option_parser.add_option('-n', '--output_name', default='chrome', help='Name used to prefix names of generated archives.') - options, args = parser.parse_args() - - if not options.build_dir: - parser.error('You must provide a build dir.') - - if not options.staging_dir: - parser.error('You must provide a staging dir.') - - if not options.resource_file_path: - options.options.resource_file_path = os.path.join(options.build_dir, - MINI_INSTALLER_INPUT_FILE) - + options, args = option_parser.parse_args() print sys.argv - return options - - -if '__main__' == __name__: - sys.exit(main(_ParseOptions())) + sys.exit(main(options)) |