From 0707afc863e14ad216fa2157f41fc35f86bd64b2 Mon Sep 17 00:00:00 2001 From: machenbach Date: Mon, 19 Jan 2015 08:23:23 -0800 Subject: [PATCH] Partially reland Auto-generate v8 version based on tags. 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 | 1 + DEPS | 5 ++ Makefile | 22 ++++-- build/generate_version.py | 118 ++++++++++++++++++++++++++++++++ tools/push-to-trunk/generate_version.py | 78 --------------------- 5 files changed, 139 insertions(+), 85 deletions(-) create mode 100755 build/generate_version.py delete mode 100755 tools/push-to-trunk/generate_version.py diff --git a/.gitignore b/.gitignore index f720bee..5744940 100644 --- a/.gitignore +++ b/.gitignore @@ -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 --- 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"], diff --git a/Makefile b/Makefile index 5468d91..8dc5b10 100644 --- 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 index 0000000..2d4c40d --- /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 + # --. + 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 index b4a0221..0000000 --- a/tools/push-to-trunk/generate_version.py +++ /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 - # --. - 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()) -- 2.7.4