Partially reland Auto-generate v8 version based on tags.
authormachenbach <machenbach@chromium.org>
Mon, 19 Jan 2015 16:23:23 +0000 (08:23 -0800)
committerCommit bot <commit-bot@chromium.org>
Mon, 19 Jan 2015 16:23:39 +0000 (16:23 +0000)
This relands parts of
https://codereview.chromium.org/843913009

It prepares for using this script outside of v8, e.g. in a
chromium hook.

The script is intended to run as a hook and will create
version_gen.cc if the content has changed.

Changes to gyp and gn files can land as a follow up, once
calling the hook on the chromium side has landed.

BUG=chromium:446166
LOG=n

Review URL: https://codereview.chromium.org/830093003

Cr-Commit-Position: refs/heads/master@{#26144}

.gitignore
DEPS
Makefile
build/generate_version.py [new file with mode: 0755]
tools/push-to-trunk/generate_version.py [deleted file]

index f720bee..5744940 100644 (file)
@@ -46,6 +46,7 @@ shell_g
 /out
 /perf.data
 /perf.data.old
+/src/version_gen.cc
 /test/benchmarks/CHECKED_OUT_*
 /test/benchmarks/downloaded_*
 /test/benchmarks/kraken
diff --git a/DEPS b/DEPS
index edff128..fc7d2d2 100644 (file)
--- a/DEPS
+++ b/DEPS
@@ -88,6 +88,11 @@ hooks = [
     'action': ['python', 'v8/tools/clang/scripts/update.py', '--if-needed'],
   },
   {
+    # Generate v8 version based on the last git tag.
+    "pattern": ".",
+    "action": ["python", "v8/build/generate_version.py"],
+  },
+  {
     # A change to a .gyp, .gypi, or to GYP itself should run the generator.
     "pattern": ".",
     "action": ["python", "v8/build/gyp_v8"],
index 5468d91..8dc5b10 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -266,7 +266,7 @@ NACL_CHECKS = $(addsuffix .check,$(NACL_BUILDS))
 # File where previously used GYPFLAGS are stored.
 ENVFILE = $(OUTDIR)/environment
 
-.PHONY: all check clean builddeps dependencies $(ENVFILE).new native \
+.PHONY: all check clean builddeps dependencies $(ENVFILE).new native version \
         qc quickcheck $(QUICKCHECKS) turbocheck \
         $(addsuffix .quickcheck,$(MODES)) $(addsuffix .quickcheck,$(ARCHES)) \
         $(ARCHES) $(MODES) $(BUILDS) $(CHECKS) $(addsuffix .clean,$(ARCHES)) \
@@ -279,9 +279,13 @@ ENVFILE = $(OUTDIR)/environment
 # Target definitions. "all" is the default.
 all: $(DEFAULT_MODES)
 
+# Target for generating the v8 version file from git tags.
+version:
+       build/generate_version.py
+
 # Special target for the buildbots to use. Depends on $(OUTDIR)/Makefile
 # having been created before.
-buildbot:
+buildbot: version
        $(MAKE) -C "$(OUTDIR)" BUILDTYPE=$(BUILDTYPE) \
                builddir="$(abspath $(OUTDIR))/$(BUILDTYPE)"
 
@@ -292,14 +296,14 @@ $(MODES): $(addsuffix .$$@,$(DEFAULT_ARCHES))
 $(ARCHES): $(addprefix $$@.,$(DEFAULT_MODES))
 
 # Defines how to build a particular target (e.g. ia32.release).
-$(BUILDS): $(OUTDIR)/Makefile.$$@
+$(BUILDS): $(OUTDIR)/Makefile.$$@ version
        @$(MAKE) -C "$(OUTDIR)" -f Makefile.$@ \
                 BUILDTYPE=$(shell echo $(subst .,,$(suffix $@)) | \
                             python -c "print \
                             raw_input().replace('opt', '').capitalize()") \
                 builddir="$(shell pwd)/$(OUTDIR)/$@"
 
-native: $(OUTDIR)/Makefile.native
+native: $(OUTDIR)/Makefile.native version
        @$(MAKE) -C "$(OUTDIR)" -f Makefile.native \
                 BUILDTYPE=Release \
                 builddir="$(shell pwd)/$(OUTDIR)/$@"
@@ -307,7 +311,8 @@ native: $(OUTDIR)/Makefile.native
 $(ANDROID_ARCHES): $(addprefix $$@.,$(MODES))
 
 $(ANDROID_BUILDS): $(GYPFILES) $(ENVFILE) build/android.gypi \
-                   must-set-ANDROID_NDK_ROOT_OR_TOOLCHAIN Makefile.android
+                   must-set-ANDROID_NDK_ROOT_OR_TOOLCHAIN Makefile.android \
+                   version
        @$(MAKE) -f Makefile.android $@ \
                ARCH="$(basename $@)" \
                MODE="$(subst .,,$(suffix $@))" \
@@ -317,7 +322,7 @@ $(ANDROID_BUILDS): $(GYPFILES) $(ENVFILE) build/android.gypi \
 $(NACL_ARCHES): $(addprefix $$@.,$(MODES))
 
 $(NACL_BUILDS): $(GYPFILES) $(ENVFILE) \
-                  Makefile.nacl must-set-NACL_SDK_ROOT
+                  Makefile.nacl must-set-NACL_SDK_ROOT version
        @$(MAKE) -f Makefile.nacl $@ \
                ARCH="$(basename $@)" \
                MODE="$(subst .,,$(suffix $@))" \
@@ -417,7 +422,10 @@ native.clean:
        rm -rf $(OUTDIR)/native
        find $(OUTDIR) -regex '.*\(host\|target\)\.native\.mk' -delete
 
-clean: $(addsuffix .clean, $(ARCHES) $(ANDROID_ARCHES) $(NACL_ARCHES)) native.clean gtags.clean
+version.clean:
+       rm -f src/version_gen.cc
+
+clean: $(addsuffix .clean, $(ARCHES) $(ANDROID_ARCHES) $(NACL_ARCHES)) native.clean gtags.clean version.clean
 
 # GYP file generation targets.
 OUT_MAKEFILES = $(addprefix $(OUTDIR)/Makefile.,$(BUILDS))
diff --git a/build/generate_version.py b/build/generate_version.py
new file mode 100755 (executable)
index 0000000..2d4c40d
--- /dev/null
@@ -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())
diff --git a/tools/push-to-trunk/generate_version.py b/tools/push-to-trunk/generate_version.py
deleted file mode 100755 (executable)
index b4a0221..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/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.
-"""
-
-
-import os
-import re
-import subprocess
-import sys
-
-
-CWD = os.path.abspath(
-    os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
-VERSION_CC = os.path.join(CWD, "src", "version.cc")
-
-def main():
-  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.cc with the new values.
-  with open(VERSION_CC, "r") as f:
-    text = f.read()
-  output = []
-  for line in text.split("\n"):
-    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)
-  with open(VERSION_CC, "w") as f:
-    f.write("\n".join(output))
-
-  # Log what was done.
-  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))
-  print "Modified version.cc. Set V8 version to %s" %  version_txt
-  return 0
-
-if __name__ == "__main__":
-  sys.exit(main())