Index: build/generate_version.py |
diff --git a/build/generate_version.py b/build/generate_version.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..2d4c40dba3e8de5dc22bee7032515648d2ddfd09 |
--- /dev/null |
+++ b/build/generate_version.py |
@@ -0,0 +1,118 @@ |
+#!/usr/bin/env python |
+# Copyright 2014 the V8 project authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+""" |
+Script to set v8's version file to the version given by the latest tag. |
+ |
+The script is intended to be run as a gclient hook. The script will write a |
+generated version file into the checkout. |
+ |
+On build systems where no git is available and where the version information |
+is not necessary, the version generation can be bypassed with the option |
+--skip. |
+""" |
+ |
+ |
+import optparse |
+import os |
+import re |
+import subprocess |
+import sys |
+ |
+ |
+CWD = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) |
+VERSION_CC = os.path.join(CWD, "src", "version.cc") |
+VERSION_GEN_CC = os.path.join(CWD, "src", "version_gen.cc") |
+ |
+ |
+def generate_version_file(): |
+ tag = subprocess.check_output( |
+ "git describe --tags", |
+ shell=True, |
+ cwd=CWD, |
+ ).strip() |
+ assert tag |
+ |
+ # Check for commits not exactly matching a tag. Those are candidate builds |
+ # for the next version. The output has the form |
+ # <tag name>-<n commits>-<hash>. |
+ if "-" in tag: |
+ version = tag.split("-")[0] |
+ candidate = "1" |
+ else: |
+ version = tag |
+ candidate = "0" |
+ version_levels = version.split(".") |
+ |
+ # Set default patch level if none is given. |
+ if len(version_levels) == 3: |
+ version_levels.append("0") |
+ assert len(version_levels) == 4 |
+ |
+ major, minor, build, patch = version_levels |
+ |
+ # Increment build level for candidate builds. |
+ if candidate == "1": |
+ build = str(int(build) + 1) |
+ patch = "0" |
+ |
+ # Modify version_gen.cc with the new values. |
+ output = [] |
+ with open(VERSION_CC, "r") as f: |
+ for line in f: |
+ for definition, substitute in ( |
+ ("MAJOR_VERSION", major), |
+ ("MINOR_VERSION", minor), |
+ ("BUILD_NUMBER", build), |
+ ("PATCH_LEVEL", patch), |
+ ("IS_CANDIDATE_VERSION", candidate)): |
+ if line.startswith("#define %s" % definition): |
+ line = re.sub("\d+$", substitute, line) |
+ output.append(line) |
+ |
+ # Prepare log message. |
+ candidate_txt = " (candidate)" if candidate == "1" else "" |
+ patch_txt = ".%s" % patch if patch != "0" else "" |
+ version_txt = ("%s.%s.%s%s%s" % |
+ (major, minor, build, patch_txt, candidate_txt)) |
+ log_message = "Modifying version_gen.cc. Set V8 version to %s" % version_txt |
+ return "".join(output), log_message |
+ |
+ |
+def bypass_version_file(): |
+ with open(VERSION_CC, "r") as f: |
+ return f.read(), "Bypassing V8 version creation." |
+ |
+ |
+def main(): |
+ parser = optparse.OptionParser() |
+ parser.add_option("--skip", |
+ help="Use raw version.cc file (disables version " |
+ "generation and uses a dummy version).", |
+ default=False, action="store_true") |
+ (options, args) = parser.parse_args() |
+ |
+ if options.skip: |
+ version_file_content, log_message = bypass_version_file() |
+ else: |
+ version_file_content, log_message = generate_version_file() |
+ |
+ old_content = "" |
+ if os.path.exists(VERSION_GEN_CC): |
+ with open(VERSION_GEN_CC, "r") as f: |
+ old_content = f.read() |
+ |
+ # Only generate version file if content has changed. |
+ if old_content != version_file_content: |
+ with open(VERSION_GEN_CC, "w") as f: |
+ f.write(version_file_content) |
+ # Log what was calculated. |
+ print log_message |
+ |
+ return 0 |
+ |
+ |
+if __name__ == "__main__": |
+ sys.exit(main()) |