Author: [email protected]
Date: Thu Apr 30 02:29:15 2009
New Revision: 1826

Added:
    branches/bleeding_edge/src/version.cc
    branches/bleeding_edge/src/version.h
    branches/bleeding_edge/test/cctest/test-version.cc
Modified:
    branches/bleeding_edge/SConstruct
    branches/bleeding_edge/src/SConscript
    branches/bleeding_edge/src/api.cc
    branches/bleeding_edge/test/cctest/SConscript
    branches/bleeding_edge/tools/gyp/v8.gyp
    branches/bleeding_edge/tools/visual_studio/v8_base.vcproj
    branches/bleeding_edge/tools/visual_studio/v8_base_arm.vcproj
    branches/bleeding_edge/tools/visual_studio/v8_cctest.vcproj
    branches/bleeding_edge/tools/visual_studio/v8_cctest_arm.vcproj

Log:
Added better version information

The current version is now held in src/version.cc in a number of defines  
which needs to be modified when changing version.

The following defines make up the version information:

   MAJOR_VERSION
   MINOR_VERSION
   BUILD_NUMBER
   PATCH_LEVEL
   CANDIDATE_VERSION

The first four are numbers and the fifth is a boolean. Besides these five  
the define

   SONAME

can be used to set a specific soname when building the a shared library  
(see below). This will most likely be used on stable branches where binary  
compatibility is ensured between different versions. This define is a  
string.

This version information is now read by the SCons build to support setting  
the soname for a Linux shared library. This requires passing the option  
soname=on to the SCons build.

When soname=on is specified the soname for the shared library can be set in  
two different ways. Either it will be the full versioned library name (e.g.  
libv8-1.2.2.so) or a specific soname defined in src/version.cc. Whenever a  
shared library is build with an soname the filename of the library will  
hold the full version name (e.g. libv8-1.2.2.so).

I did not update the xcode project with the new files.

BUG=151
Review URL: http://codereview.chromium.org/100104

Modified: branches/bleeding_edge/SConstruct
==============================================================================
--- branches/bleeding_edge/SConstruct   (original)
+++ branches/bleeding_edge/SConstruct   Thu Apr 30 02:29:15 2009
@@ -216,7 +216,12 @@
        'WARNINGFLAGS': ['-pedantic', '-Wno-long-long']
      },
      'os:linux': {
-      'WARNINGFLAGS': ['-pedantic']
+      'WARNINGFLAGS': ['-pedantic'],
+      'library:shared': {
+        'soname:on': {
+          'LINKFLAGS': ['-Wl,-soname,${SONAME}']
+        }
+      }
      },
      'os:macos': {
        'WARNINGFLAGS': ['-pedantic']
@@ -542,6 +547,11 @@
      'default': 'static',
      'help': 'the type of library to produce'
    },
+  'soname': {
+    'values': ['on', 'off'],
+    'default': 'off',
+    'help': 'turn on setting soname for Linux shared library'
+  },
    'msvcrt': {
      'values': ['static', 'shared'],
      'default': 'static',
@@ -592,6 +602,49 @@
    return result


+def GetVersionComponents():
+  MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)")
+  MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)")
+  BUILD_NUMBER_PATTERN = re.compile(r"#define\s+BUILD_NUMBER\s+(.*)")
+  PATCH_LEVEL_PATTERN = re.compile(r"#define\s+PATCH_LEVEL\s+(.*)")
+
+  patterns = [MAJOR_VERSION_PATTERN,
+              MINOR_VERSION_PATTERN,
+              BUILD_NUMBER_PATTERN,
+              PATCH_LEVEL_PATTERN]
+
+  source = open(join('src', 'version.cc')).read()
+  version_components = []
+  for pattern in patterns:
+    match = pattern.search(source)
+    if match:
+      version_components.append(match.group(1).strip())
+    else:
+      version_components.append('0')
+
+  return version_components
+
+
+def GetVersion():
+  version_components = GetVersionComponents()
+
+  if version_components[len(version_components) - 1] == '0':
+    version_components.pop()
+  return '.'.join(version_components)
+
+
+def GetSpecificSONAME():
+  SONAME_PATTERN = re.compile(r"#define\s+SONAME\s+\"(.*)\"")
+
+  source = open(join('src', 'version.cc')).read()
+  match = SONAME_PATTERN.search(source)
+
+  if match:
+    return match.group(1).strip()
+  else:
+    return ''
+
+
  def SplitList(str):
    return [ s for s in str.split(",") if len(s) > 0 ]

@@ -614,6 +667,10 @@
      Abort("Profiling on windows only supported for static library.")
    if env['prof'] == 'oprofile' and env['os'] != 'linux':
      Abort("OProfile is only supported on Linux.")
+  if env['os'] == 'win32' and env['soname'] == 'on':
+    Abort("Shared Object soname not applicable for Windows.")
+  if env['soname'] == 'on' and env['library'] == 'static':
+    Abort("Shared Object soname not applicable for static library.")
    if env['arch'] == 'x64' and env['os'] != 'linux':
      Abort("X64 compilation only allowed on Linux OS.")
    for (name, option) in SIMPLE_OPTIONS.iteritems():
@@ -746,10 +803,22 @@
      'd8': d8_flags
    }

+  # Generate library base name.
    target_id = mode
    suffix = SUFFIXES[target_id]
    library_name = 'v8' + suffix
+  version = GetVersion()
+  if context.options['soname'] == 'on':
+    # When building shared object with SONAME version the library name.
+    library_name += '-' + version
    env['LIBRARY'] = library_name
+
+  # Generate library SONAME if required by the build.
+  if context.options['soname'] == 'on':
+    soname = GetSpecificSONAME()
+    if soname == '':
+      soname = 'lib' + library_name + '.so'
+    env['SONAME'] = soname

    # Build the object files by invoking SCons recursively.
    (object_files, shell_files, mksnapshot) = env.SConscript(

Modified: branches/bleeding_edge/src/SConscript
==============================================================================
--- branches/bleeding_edge/src/SConscript       (original)
+++ branches/bleeding_edge/src/SConscript       Thu Apr 30 02:29:15 2009
@@ -50,7 +50,8 @@
      'scopeinfo.cc', 'scopes.cc', 'serialize.cc', 'snapshot-common.cc',
      'spaces.cc', 'string-stream.cc', 'stub-cache.cc', 'token.cc', 'top.cc',
      'unicode.cc', 'usage-analyzer.cc', 'utils.cc', 'v8-counters.cc',
-    'v8.cc', 'v8threads.cc', 'variables.cc', 'virtual-frame.cc', 'zone.cc'
+    'v8.cc', 'v8threads.cc', 'variables.cc', 'version.cc',
+    'virtual-frame.cc', 'zone.cc'
    ],
    'arch:arm': [
      'arm/assembler-arm.cc', 'arm/builtins-arm.cc',

Modified: branches/bleeding_edge/src/api.cc
==============================================================================
--- branches/bleeding_edge/src/api.cc   (original)
+++ branches/bleeding_edge/src/api.cc   Thu Apr 30 02:29:15 2009
@@ -37,6 +37,7 @@
  #include "serialize.h"
  #include "snapshot.h"
  #include "v8threads.h"
+#include "version.h"


  #define LOG_API(expr) LOG(ApiEntryCall(expr))
@@ -2427,7 +2428,9 @@


  const char* v8::V8::GetVersion() {
-  return "1.2.2 (candidate)";
+  static v8::internal::EmbeddedVector<char, 128> buffer;
+  v8::internal::Version::GetString(buffer);
+  return buffer.start();
  }



Added: branches/bleeding_edge/src/version.cc
==============================================================================
--- (empty file)
+++ branches/bleeding_edge/src/version.cc       Thu Apr 30 02:29:15 2009
@@ -0,0 +1,89 @@
+// Copyright 2008 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "v8.h"
+
+#include "version.h"
+
+// These macros define the version number for the current version.
+// NOTE these macros are used by the SCons build script so their names
+// cannot be changed without changing the SCons build script.
+#define MAJOR_VERSION     1
+#define MINOR_VERSION     2
+#define BUILD_NUMBER      2
+#define PATCH_LEVEL       0
+#define CANDIDATE_VERSION true
+
+// Define SONAME to have the SCons build the put a specific SONAME into the
+// shared library instead the generic SONAME generated from the V8 version
+// number. This define is mainly used by the SCons build script.
+#define SONAME            ""
+
+namespace v8 { namespace internal {
+
+int Version::major_ = MAJOR_VERSION;
+int Version::minor_ = MINOR_VERSION;
+int Version::build_ = BUILD_NUMBER;
+int Version::patch_ = PATCH_LEVEL;
+bool Version::candidate_ = CANDIDATE_VERSION;
+const char* Version::soname_ = SONAME;
+
+
+// Calculate the V8 version string.
+void Version::GetString(Vector<char> str) {
+  const char* candidate = IsCandidate() ? " (candidate)" : "";
+  if (GetPatch() > 0) {
+    OS::SNPrintF(str, "%d.%d.%d.%d%s",
+                 GetMajor(), GetMinor(), GetBuild(), GetPatch(),  
candidate);
+  } else {
+    OS::SNPrintF(str, "%d.%d.%d%s",
+                 GetMajor(), GetMinor(), GetBuild(), candidate);
+  }
+}
+
+
+// Calculate the SONAME for the V8 shared library.
+void Version::GetSONAME(Vector<char> str) {
+  if (soname_ == NULL || *soname_ == '\0') {
+    // Generate generic SONAME if no specific SONAME is defined.
+    const char* candidate = IsCandidate() ? "-candidate" : "";
+    if (GetPatch() > 0) {
+      OS::SNPrintF(str, "libv8-%d.%d.%d.%d%s.so",
+                   GetMajor(), GetMinor(), GetBuild(), GetPatch(),  
candidate);
+    } else {
+      OS::SNPrintF(str, "libv8-%d.%d.%d%s.so",
+                   GetMajor(), GetMinor(), GetBuild(), candidate);
+    }
+  } else {
+    // Use specific SONAME.
+    OS::SNPrintF(str, "%s", soname_);
+  }
+}
+
+} }  // namespace v8::internal
+
+

Added: branches/bleeding_edge/src/version.h
==============================================================================
--- (empty file)
+++ branches/bleeding_edge/src/version.h        Thu Apr 30 02:29:15 2009
@@ -0,0 +1,63 @@
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef V8_VERSION_H_
+#define V8_VERSION_H_
+
+namespace v8 { namespace internal {
+
+class Version {
+ public:
+  // Return the various version components.
+  static int GetMajor() { return major_; }
+  static int GetMinor() { return minor_; }
+  static int GetBuild() { return build_; }
+  static int GetPatch() { return patch_; }
+  static bool IsCandidate() { return candidate_; }
+
+  // Calculate the V8 version string.
+  static void GetString(Vector<char> str);
+
+  // Calculate the SONAME for the V8 shared library.
+  static void GetSONAME(Vector<char> str);
+
+ private:
+  static int major_;
+  static int minor_;
+  static int build_;
+  static int patch_;
+  static bool candidate_;
+  static const char* soname_;
+
+  // In test-version.cc.
+  friend void SetVersion(int major, int minor, int build, int patch,
+                         bool candidate, const char* soname);
+};
+
+} }  // namespace v8::internal
+
+#endif  // V8_VERSION_H_

Modified: branches/bleeding_edge/test/cctest/SConscript
==============================================================================
--- branches/bleeding_edge/test/cctest/SConscript       (original)
+++ branches/bleeding_edge/test/cctest/SConscript       Thu Apr 30 02:29:15 2009
@@ -54,7 +54,8 @@
      'test-spaces.cc',
      'test-strings.cc',
      'test-threads.cc',
-    'test-utils.cc'
+    'test-utils.cc',
+    'test-version.cc'
    ],
    'arch:arm':  ['test-assembler-arm.cc', 'test-disasm-arm.cc'],
    'arch:ia32': [

Added: branches/bleeding_edge/test/cctest/test-version.cc
==============================================================================
--- (empty file)
+++ branches/bleeding_edge/test/cctest/test-version.cc  Thu Apr 30 02:29:15  
2009
@@ -0,0 +1,88 @@
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "v8.h"
+
+#include "version.h"
+#include "cctest.h"
+
+using namespace v8::internal;
+
+
+namespace v8 { namespace internal {
+
+void SetVersion(int major, int minor, int build, int patch,
+                bool candidate, const char* soname) {
+  Version::major_ = major;
+  Version::minor_ = minor;
+  Version::build_ = build;
+  Version::patch_ = patch;
+  Version::candidate_ = candidate;
+  Version::soname_ = soname;
+}
+
+} }  // namespace v8::internal
+
+
+static void CheckVersion(int major, int minor, int build,
+                         int patch, bool candidate,
+                         const char* expected_version_string,
+                         const char* expected_generic_soname) {
+  static v8::internal::EmbeddedVector<char, 128> version_str;
+  static v8::internal::EmbeddedVector<char, 128> soname_str;
+
+  // Test version without specific SONAME.
+  SetVersion(major, minor, build, patch, candidate, "");
+  Version::GetString(version_str);
+  CHECK_EQ(expected_version_string, version_str.start());
+  Version::GetSONAME(soname_str);
+  CHECK_EQ(expected_generic_soname, soname_str.start());
+
+  // Test version with specific SONAME.
+  const char* soname = "libv8.so.1";
+  SetVersion(major, minor, build, patch, candidate, soname);
+  Version::GetString(version_str);
+  CHECK_EQ(expected_version_string, version_str.start());
+  Version::GetSONAME(soname_str);
+  CHECK_EQ(soname, soname_str.start());
+}
+
+
+TEST(VersionString) {
+  CheckVersion(0, 0, 0, 0, false, "0.0.0", "libv8-0.0.0.so");
+  CheckVersion(0, 0, 0, 0, true,
+               "0.0.0 (candidate)", "libv8-0.0.0-candidate.so");
+  CheckVersion(1, 0, 0, 0, false, "1.0.0", "libv8-1.0.0.so");
+  CheckVersion(1, 0, 0, 0, true,
+               "1.0.0 (candidate)", "libv8-1.0.0-candidate.so");
+  CheckVersion(1, 0, 0, 1, false, "1.0.0.1", "libv8-1.0.0.1.so");
+  CheckVersion(1, 0, 0, 1, true,
+               "1.0.0.1 (candidate)", "libv8-1.0.0.1-candidate.so");
+  CheckVersion(2, 5, 10, 7, false, "2.5.10.7", "libv8-2.5.10.7.so");
+  CheckVersion(2, 5, 10, 7, true,
+               "2.5.10.7 (candidate)", "libv8-2.5.10.7-candidate.so");
+}

Modified: branches/bleeding_edge/tools/gyp/v8.gyp
==============================================================================
--- branches/bleeding_edge/tools/gyp/v8.gyp     (original)
+++ branches/bleeding_edge/tools/gyp/v8.gyp     Thu Apr 30 02:29:15 2009
@@ -242,6 +242,8 @@
        '../../src/v8threads.h',
        '../../src/variables.cc',
        '../../src/variables.h',
+      '../../src/version.cc',
+      '../../src/version.h',
        '../../src/virtual-frame.h',
        '../../src/virtual-frame.cc',
        '../../src/zone-inl.h',

Modified: branches/bleeding_edge/tools/visual_studio/v8_base.vcproj
==============================================================================
--- branches/bleeding_edge/tools/visual_studio/v8_base.vcproj   (original)
+++ branches/bleeding_edge/tools/visual_studio/v8_base.vcproj   Thu Apr 30  
02:29:15 2009
@@ -857,6 +857,14 @@
                                >
                        </File>
                        <File
+                               RelativePath="..\..\src\version.cc"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\..\src\version.h"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\..\src\virtual-frame.h"
                                >
                        </File>

Modified: branches/bleeding_edge/tools/visual_studio/v8_base_arm.vcproj
==============================================================================
--- branches/bleeding_edge/tools/visual_studio/v8_base_arm.vcproj       
(original)
+++ branches/bleeding_edge/tools/visual_studio/v8_base_arm.vcproj       Thu Apr 
 
30 02:29:15 2009
@@ -869,6 +869,14 @@
                                >
                        </File>
                        <File
+                               RelativePath="..\..\src\version.cc"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\..\src\version.h"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\..\src\virtual-frame.h"
                                >
                        </File>

Modified: branches/bleeding_edge/tools/visual_studio/v8_cctest.vcproj
==============================================================================
--- branches/bleeding_edge/tools/visual_studio/v8_cctest.vcproj (original)
+++ branches/bleeding_edge/tools/visual_studio/v8_cctest.vcproj Thu Apr 30  
02:29:15 2009
@@ -233,6 +233,10 @@
                        RelativePath="..\..\test\cctest\test-utils.cc"
                        >
                </File>
+               <File
+                       RelativePath="..\..\test\cctest\test-version.cc"
+                       >
+               </File>
        </Files>
        <Globals>
        </Globals>

Modified: branches/bleeding_edge/tools/visual_studio/v8_cctest_arm.vcproj
==============================================================================
--- branches/bleeding_edge/tools/visual_studio/v8_cctest_arm.vcproj      
(original)
+++ branches/bleeding_edge/tools/visual_studio/v8_cctest_arm.vcproj     Thu Apr 
 
30 02:29:15 2009
@@ -219,6 +219,10 @@
                        RelativePath="..\..\test\cctest\test-utils.cc"
                        >
                </File>
+               <File
+                       RelativePath="..\..\test\cctest\test-version.cc"
+                       >
+               </File>
        </Files>
        <Globals>
        </Globals>

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to