| Index: SConstruct
|
| ===================================================================
|
| --- SConstruct (revision 1814)
|
| +++ SConstruct (working copy)
|
| @@ -197,7 +197,12 @@
|
| 'WARNINGFLAGS': ['-pedantic', '-Wno-long-long']
|
| },
|
| 'os:linux': {
|
| - 'WARNINGFLAGS': ['-pedantic']
|
| + 'WARNINGFLAGS': ['-pedantic'],
|
| + 'library:shared': {
|
| + 'soname:on': {
|
| + 'LINKFLAGS': ['-Wl,-soname,${SONAME}']
|
| + }
|
| + }
|
| },
|
| 'os:macos': {
|
| 'WARNINGFLAGS': ['-pedantic']
|
| @@ -493,6 +498,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',
|
| @@ -543,6 +553,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 ]
|
|
|
| @@ -565,6 +618,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.")
|
| for (name, option) in SIMPLE_OPTIONS.iteritems():
|
| if (not option.get('default')) and (name not in ARGUMENTS):
|
| message = ("A value for option %s must be specified (%s)." %
|
| @@ -695,11 +752,23 @@
|
| '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(
|
| join('src', 'SConscript'),
|
|
|