| OLD | NEW |
| 1 # Copyright 2008 the V8 project authors. All rights reserved. | 1 # Copyright 2008 the V8 project authors. All rights reserved. |
| 2 # Redistribution and use in source and binary forms, with or without | 2 # Redistribution and use in source and binary forms, with or without |
| 3 # modification, are permitted provided that the following conditions are | 3 # modification, are permitted provided that the following conditions are |
| 4 # met: | 4 # met: |
| 5 # | 5 # |
| 6 # * Redistributions of source code must retain the above copyright | 6 # * Redistributions of source code must retain the above copyright |
| 7 # notice, this list of conditions and the following disclaimer. | 7 # notice, this list of conditions and the following disclaimer. |
| 8 # * Redistributions in binary form must reproduce the above | 8 # * Redistributions in binary form must reproduce the above |
| 9 # copyright notice, this list of conditions and the following | 9 # copyright notice, this list of conditions and the following |
| 10 # disclaimer in the documentation and/or other materials provided | 10 # disclaimer in the documentation and/or other materials provided |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 24 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | 27 |
| 28 import platform | 28 import platform |
| 29 import re | 29 import re |
| 30 import sys | 30 import sys |
| 31 import os | 31 import os |
| 32 from os.path import join, dirname, abspath | 32 from os.path import join, dirname, abspath |
| 33 from types import DictType | 33 from types import DictType, StringTypes |
| 34 root_dir = dirname(File('SConstruct').rfile().abspath) | 34 root_dir = dirname(File('SConstruct').rfile().abspath) |
| 35 sys.path.append(join(root_dir, 'tools')) | 35 sys.path.append(join(root_dir, 'tools')) |
| 36 import js2c, utils | 36 import js2c, utils |
| 37 | 37 |
| 38 | 38 |
| 39 LIBRARY_FLAGS = { | 39 LIBRARY_FLAGS = { |
| 40 'all': { | 40 'all': { |
| 41 'CPPDEFINES': ['ENABLE_LOGGING_AND_PROFILING'] | 41 'CPPDEFINES': ['ENABLE_LOGGING_AND_PROFILING'] |
| 42 }, | 42 }, |
| 43 'gcc': { | 43 'gcc': { |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 'CPPDEFINES': ['BUILDING_V8_SHARED'] | 131 'CPPDEFINES': ['BUILDING_V8_SHARED'] |
| 132 } | 132 } |
| 133 } | 133 } |
| 134 } | 134 } |
| 135 | 135 |
| 136 | 136 |
| 137 DTOA_EXTRA_FLAGS = { | 137 DTOA_EXTRA_FLAGS = { |
| 138 'gcc': { | 138 'gcc': { |
| 139 'all': { | 139 'all': { |
| 140 'WARNINGFLAGS': ['-Werror'] | 140 'WARNINGFLAGS': ['-Werror'] |
| 141 } | 141 } |
| 142 }, | 142 }, |
| 143 'msvc': { | 143 'msvc': { |
| 144 'all': { | 144 'all': { |
| 145 'WARNINGFLAGS': ['/WX', '/wd4018', '/wd4244'] | 145 'WARNINGFLAGS': ['/WX', '/wd4018', '/wd4244'] |
| 146 } | 146 } |
| 147 } | 147 } |
| 148 } | 148 } |
| 149 | 149 |
| 150 | 150 |
| 151 CCTEST_EXTRA_FLAGS = { | 151 CCTEST_EXTRA_FLAGS = { |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 'help': 'set how the build system detects file changes' | 306 'help': 'set how the build system detects file changes' |
| 307 } | 307 } |
| 308 } | 308 } |
| 309 | 309 |
| 310 | 310 |
| 311 def GetOptions(): | 311 def GetOptions(): |
| 312 result = Options() | 312 result = Options() |
| 313 result.Add('mode', 'compilation mode (debug, release)', 'release') | 313 result.Add('mode', 'compilation mode (debug, release)', 'release') |
| 314 result.Add('sample', 'build sample (shell, process)', '') | 314 result.Add('sample', 'build sample (shell, process)', '') |
| 315 result.Add('env', 'override environment settings (NAME1:value1,NAME2:value2)',
'') | 315 result.Add('env', 'override environment settings (NAME1:value1,NAME2:value2)',
'') |
| 316 for (name, option) in SIMPLE_OPTIONS.items(): | 316 for (name, option) in SIMPLE_OPTIONS.iteritems(): |
| 317 help = '%s (%s)' % (name, ", ".join(option['values'])) | 317 help = '%s (%s)' % (name, ", ".join(option['values'])) |
| 318 result.Add(name, help, option.get('default')) | 318 result.Add(name, help, option.get('default')) |
| 319 return result | 319 return result |
| 320 | 320 |
| 321 | 321 |
| 322 def SplitList(str): | 322 def SplitList(str): |
| 323 return [ s for s in str.split(",") if len(s) > 0 ] | 323 return [ s for s in str.split(",") if len(s) > 0 ] |
| 324 | 324 |
| 325 | 325 |
| 326 def IsLegal(env, option, values): | 326 def IsLegal(env, option, values): |
| 327 str = env[option] | 327 str = env[option] |
| 328 for s in SplitList(str): | 328 for s in SplitList(str): |
| 329 if not s in values: | 329 if not s in values: |
| 330 Abort("Illegal value for option %s '%s'." % (option, s)) | 330 Abort("Illegal value for option %s '%s'." % (option, s)) |
| 331 return False | 331 return False |
| 332 return True | 332 return True |
| 333 | 333 |
| 334 | 334 |
| 335 def VerifyOptions(env): | 335 def VerifyOptions(env): |
| 336 if not IsLegal(env, 'mode', ['debug', 'release']): | 336 if not IsLegal(env, 'mode', ['debug', 'release']): |
| 337 return False | 337 return False |
| 338 if not IsLegal(env, 'sample', ["shell", "process"]): | 338 if not IsLegal(env, 'sample', ["shell", "process"]): |
| 339 return False | 339 return False |
| 340 for (name, option) in SIMPLE_OPTIONS.items(): | 340 for (name, option) in SIMPLE_OPTIONS.iteritems(): |
| 341 if (not option.get('default')) and (name not in ARGUMENTS): | 341 if (not option.get('default')) and (name not in ARGUMENTS): |
| 342 message = ("A value for option %s must be specified (%s)." % | 342 message = ("A value for option %s must be specified (%s)." % |
| 343 (name, ", ".join(option['values']))) | 343 (name, ", ".join(option['values']))) |
| 344 Abort(message) | 344 Abort(message) |
| 345 if not env[name] in option['values']: | 345 if not env[name] in option['values']: |
| 346 message = ("Unknown %s value '%s'. Possible values are (%s)." % | 346 message = ("Unknown %s value '%s'. Possible values are (%s)." % |
| 347 (name, env[name], ", ".join(option['values']))) | 347 (name, env[name], ", ".join(option['values']))) |
| 348 Abort(message) | 348 Abort(message) |
| 349 | 349 |
| 350 | 350 |
| 351 class BuildContext(object): | 351 class BuildContext(object): |
| 352 | 352 |
| 353 def __init__(self, options, env_overrides, samples): | 353 def __init__(self, options, env_overrides, samples): |
| 354 self.library_targets = [] | 354 self.library_targets = [] |
| 355 self.cctest_targets = [] | 355 self.cctest_targets = [] |
| 356 self.sample_targets = [] | 356 self.sample_targets = [] |
| 357 self.options = options | 357 self.options = options |
| 358 self.env_overrides = env_overrides | 358 self.env_overrides = env_overrides |
| 359 self.samples = samples | 359 self.samples = samples |
| 360 self.use_snapshot = (options['snapshot'] == 'on') | 360 self.use_snapshot = (options['snapshot'] == 'on') |
| 361 self.flags = None | 361 self.flags = None |
| 362 | 362 |
| 363 def AddRelevantFlags(self, initial, flags): | 363 def AddRelevantFlags(self, initial, flags): |
| 364 result = initial.copy() | 364 result = initial.copy() |
| 365 self.AppendFlags(result, flags.get('all')) | 365 self.AppendFlags(result, flags.get('all')) |
| 366 toolchain = self.options['toolchain'] | 366 toolchain = self.options['toolchain'] |
| 367 self.AppendFlags(result, flags[toolchain].get('all')) | 367 self.AppendFlags(result, flags[toolchain].get('all')) |
| 368 for option in sorted(self.options.keys()): | 368 for option in sorted(self.options.keys()): |
| 369 value = self.options[option] | 369 value = self.options[option] |
| 370 self.AppendFlags(result, flags[toolchain].get(option + ':' + value)) | 370 self.AppendFlags(result, flags[toolchain].get(option + ':' + value)) |
| 371 return result | 371 return result |
| 372 | 372 |
| 373 def GetRelevantSources(self, source): | 373 def GetRelevantSources(self, source): |
| 374 result = [] | 374 result = [] |
| 375 result += source.get('all', []) | 375 result += source.get('all', []) |
| 376 for (name, value) in self.options.items(): | 376 for (name, value) in self.options.iteritems(): |
| 377 result += source.get(name + ':' + value, []) | 377 result += source.get(name + ':' + value, []) |
| 378 return sorted(result) | 378 return sorted(result) |
| 379 | 379 |
| 380 def AppendFlags(self, options, added): | 380 def AppendFlags(self, options, added): |
| 381 if not added: | 381 if not added: |
| 382 return | 382 return |
| 383 for (key, value) in added.items(): | 383 for (key, value) in added.iteritems(): |
| 384 if not key in options: | 384 if not key in options: |
| 385 options[key] = value | 385 options[key] = value |
| 386 else: | 386 else: |
| 387 options[key] = options[key] + value | 387 prefix = options[key] |
| 388 if isinstance(prefix, StringTypes): prefix = prefix.split() |
| 389 options[key] = prefix + value |
| 388 | 390 |
| 389 def ConfigureObject(self, env, input, **kw): | 391 def ConfigureObject(self, env, input, **kw): |
| 390 if self.options['library'] == 'static': | 392 if self.options['library'] == 'static': |
| 391 return env.StaticObject(input, **kw) | 393 return env.StaticObject(input, **kw) |
| 392 else: | 394 else: |
| 393 return env.SharedObject(input, **kw) | 395 return env.SharedObject(input, **kw) |
| 394 | 396 |
| 395 def ApplyEnvOverrides(self, env): | 397 def ApplyEnvOverrides(self, env): |
| 396 if not self.env_overrides: | 398 if not self.env_overrides: |
| 397 return | 399 return |
| (...skipping 28 matching lines...) Expand all Loading... |
| 426 for option in SIMPLE_OPTIONS: | 428 for option in SIMPLE_OPTIONS: |
| 427 options[option] = env[option] | 429 options[option] = env[option] |
| 428 PostprocessOptions(options) | 430 PostprocessOptions(options) |
| 429 | 431 |
| 430 context = BuildContext(options, env_overrides, samples=SplitList(env['sample']
)) | 432 context = BuildContext(options, env_overrides, samples=SplitList(env['sample']
)) |
| 431 | 433 |
| 432 library_flags = context.AddRelevantFlags(os.environ, LIBRARY_FLAGS) | 434 library_flags = context.AddRelevantFlags(os.environ, LIBRARY_FLAGS) |
| 433 v8_flags = context.AddRelevantFlags(library_flags, V8_EXTRA_FLAGS) | 435 v8_flags = context.AddRelevantFlags(library_flags, V8_EXTRA_FLAGS) |
| 434 jscre_flags = context.AddRelevantFlags(library_flags, JSCRE_EXTRA_FLAGS) | 436 jscre_flags = context.AddRelevantFlags(library_flags, JSCRE_EXTRA_FLAGS) |
| 435 dtoa_flags = context.AddRelevantFlags(library_flags, DTOA_EXTRA_FLAGS) | 437 dtoa_flags = context.AddRelevantFlags(library_flags, DTOA_EXTRA_FLAGS) |
| 436 cctest_flags = context.AddRelevantFlags(v8_flags, CCTEST_EXTRA_FLAGS) | 438 cctest_flags = context.AddRelevantFlags(v8_flags, CCTEST_EXTRA_FLAGS) |
| 437 sample_flags = context.AddRelevantFlags(os.environ, SAMPLE_FLAGS) | 439 sample_flags = context.AddRelevantFlags(os.environ, SAMPLE_FLAGS) |
| 438 | 440 |
| 439 context.flags = { | 441 context.flags = { |
| 440 'v8': v8_flags, | 442 'v8': v8_flags, |
| 441 'jscre': jscre_flags, | 443 'jscre': jscre_flags, |
| 442 'dtoa': dtoa_flags, | 444 'dtoa': dtoa_flags, |
| 443 'cctest': cctest_flags, | 445 'cctest': cctest_flags, |
| 444 'sample': sample_flags | 446 'sample': sample_flags |
| 445 } | 447 } |
| 446 | 448 |
| 447 target_id = mode | 449 target_id = mode |
| 448 suffix = SUFFIXES[target_id] | 450 suffix = SUFFIXES[target_id] |
| 449 library_name = 'v8' + suffix | 451 library_name = 'v8' + suffix |
| 450 env['LIBRARY'] = library_name | 452 env['LIBRARY'] = library_name |
| 451 | 453 |
| 452 # Build the object files by invoking SCons recursively. | 454 # Build the object files by invoking SCons recursively. |
| 453 object_files = env.SConscript( | 455 object_files = env.SConscript( |
| 454 join('src', 'SConscript'), | 456 join('src', 'SConscript'), |
| 455 build_dir=join('obj', target_id), | 457 build_dir=join('obj', target_id), |
| 456 exports='context', | 458 exports='context', |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 # version of scons. Also, there's a bug in some revisions that | 532 # version of scons. Also, there's a bug in some revisions that |
| 531 # doesn't allow this flag to be set, so we swallow any exceptions. | 533 # doesn't allow this flag to be set, so we swallow any exceptions. |
| 532 # Lovely. | 534 # Lovely. |
| 533 try: | 535 try: |
| 534 SetOption('warn', 'no-deprecated') | 536 SetOption('warn', 'no-deprecated') |
| 535 except: | 537 except: |
| 536 pass | 538 pass |
| 537 | 539 |
| 538 | 540 |
| 539 Build() | 541 Build() |
| OLD | NEW |