#!/usr/bin/env python # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file # for details. All rights reserved. Use of this source code is governed by a # BSD-style license that can be found in the LICENSE file. # # This python script creates a version string in a C++ file. import hashlib import os import sys import time from optparse import OptionParser import utils def debugLog(message): print >> sys.stderr, message sys.stderr.flush() # When these files change, snapshots created by the VM are potentially no longer # backwards-compatible. VM_SNAPSHOT_FILES=[ # Header files. 'datastream.h', 'object.h', 'raw_object.h', 'snapshot.h', 'snapshot_ids.h', 'symbols.h', # Source files. 'dart.cc', 'dart_api_impl.cc', 'object.cc', 'raw_object.cc', 'raw_object_snapshot.cc', 'snapshot.cc', 'symbols.cc', ] def makeVersionString(quiet, no_svn): version_string = utils.GetSemanticSDKVersion(ignore_svn_revision=no_svn) if not quiet: debugLog("Returning version string: %s " % version_string) return version_string def makeSnapshotHashString(): vmhash = hashlib.md5() for vmfilename in VM_SNAPSHOT_FILES: vmfilepath = os.path.join(utils.DART_DIR, 'runtime', 'vm', vmfilename) with open(vmfilepath) as vmfile: vmhash.update(vmfile.read()) return vmhash.hexdigest() def makeFile(quiet, output_file, input_file, ignore_svn_revision): version_cc_text = open(input_file).read() version_string = makeVersionString(quiet, ignore_svn_revision) version_cc_text = version_cc_text.replace("{{VERSION_STR}}", version_string) version_time = time.ctime(time.time()) version_cc_text = version_cc_text.replace("{{BUILD_TIME}}", version_time) snapshot_hash = makeSnapshotHashString() version_cc_text = version_cc_text.replace("{{SNAPSHOT_HASH}}", snapshot_hash) open(output_file, 'w').write(version_cc_text) return True def main(args): try: # Parse input. parser = OptionParser() parser.add_option("-q", "--quiet", action="store_true", default=False, help="disable console output") parser.add_option("--ignore_svn_revision", action="store_true", default=False, help="Don't try to determine svn revision") parser.add_option("--output", action="store", type="string", help="output file name") parser.add_option("--input", action="store", type="string", help="input template file") (options, args) = parser.parse_args() if not options.output: sys.stderr.write('--output not specified\n') return -1 if not len(options.input): sys.stderr.write('--input not specified\n') return -1 files = [] for arg in args: files.append(arg) if not makeFile(options.quiet, options.output, options.input, options.ignore_svn_revision): return -1 return 0 except Exception, inst: sys.stderr.write('make_version.py exception\n') sys.stderr.write(str(inst)) sys.stderr.write('\n') return -1 if __name__ == '__main__': exit_code = main(sys.argv) sys.exit(exit_code)