Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 | 2 |
| 3 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 3 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 from compiler.ast import Const | 7 from compiler.ast import Const |
| 8 from compiler.ast import Dict | 8 from compiler.ast import Dict |
| 9 from compiler.ast import Discard | 9 from compiler.ast import Discard |
| 10 from compiler.ast import List | 10 from compiler.ast import List |
| 11 from compiler.ast import Module | 11 from compiler.ast import Module |
| 12 from compiler.ast import Node | 12 from compiler.ast import Node |
| 13 from compiler.ast import Stmt | 13 from compiler.ast import Stmt |
| 14 import compiler | 14 import compiler |
| 15 import copy | 15 import copy |
| 16 import gyp.common | 16 import gyp.common |
| 17 import optparse | 17 import optparse |
| 18 import os.path | 18 import os.path |
| 19 import re | 19 import re |
| 20 import shlex | 20 import shlex |
| 21 import subprocess | 21 import subprocess |
| 22 import sys | 22 import sys |
| 23 | 23 |
| 24 # Try to import grit. | |
| 25 try: | |
| 26 import grit_info # TODO: make optional | |
|
Mark Mentovai
2011/05/16 16:51:34
What does “TODO: make optional” mean when this is
| |
| 27 grit_available = True | |
| 28 except Exception, e: | |
| 29 grit_available = False | |
|
tony
2011/05/16 16:24:05
The python idiom for this is on Exception to just
| |
| 30 | |
| 24 | 31 |
| 25 # A list of types that are treated as linkable. | 32 # A list of types that are treated as linkable. |
| 26 linkable_types = ['executable', 'shared_library', 'loadable_module'] | 33 linkable_types = ['executable', 'shared_library', 'loadable_module'] |
| 27 | 34 |
| 28 # A list of sections that contain links to other targets. | 35 # A list of sections that contain links to other targets. |
| 29 dependency_sections = ['dependencies', 'export_dependent_settings'] | 36 dependency_sections = ['dependencies', 'export_dependent_settings'] |
| 30 | 37 |
| 31 # base_path_sections is a list of sections defined by GYP that contain | 38 # base_path_sections is a list of sections defined by GYP that contain |
| 32 # pathnames. The generators can provide more keys, the two lists are merged | 39 # pathnames. The generators can provide more keys, the two lists are merged |
| 33 # into path_sections, but you should call IsPathSection instead of using either | 40 # into path_sections, but you should call IsPathSection instead of using either |
| (...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 627 # is invoked it produces different output by design. When the need | 634 # is invoked it produces different output by design. When the need |
| 628 # arises, the syntax should be extended to support no caching off a | 635 # arises, the syntax should be extended to support no caching off a |
| 629 # command's output so it is run every time. | 636 # command's output so it is run every time. |
| 630 cache_key = str(contents) | 637 cache_key = str(contents) |
| 631 cached_value = cached_command_results.get(cache_key, None) | 638 cached_value = cached_command_results.get(cache_key, None) |
| 632 if cached_value is None: | 639 if cached_value is None: |
| 633 gyp.DebugOutput(gyp.DEBUG_VARIABLES, | 640 gyp.DebugOutput(gyp.DEBUG_VARIABLES, |
| 634 "Executing command '%s' in directory '%s'" % | 641 "Executing command '%s' in directory '%s'" % |
| 635 (contents,build_file_dir)) | 642 (contents,build_file_dir)) |
| 636 | 643 |
| 637 # Fix up command with platform specific workarounds. | 644 replacement = '' |
| 638 contents = FixupPlatformCommand(contents) | |
| 639 p = subprocess.Popen(contents, shell=use_shell, | |
| 640 stdout=subprocess.PIPE, | |
| 641 stderr=subprocess.PIPE, | |
| 642 stdin=subprocess.PIPE, | |
| 643 cwd=build_file_dir) | |
| 644 | 645 |
| 645 (p_stdout, p_stderr) = p.communicate('') | 646 parsed_contents = contents.split() |
|
Mark Mentovai
2011/05/16 16:51:34
Can you refactor this whole block into its own fun
Mark Mentovai
2011/05/16 16:51:34
shlex instead?
| |
| 647 if (grit_available and | |
| 648 parsed_contents[0] == 'python' and | |
| 649 parsed_contents[1].endswith('grit_info.py')): | |
|
tony
2011/05/16 16:24:05
Will parsed_contents always have at least 2 valeus
bradn
2011/05/16 16:35:50
Maybe raise an exception with a more specific erro
Mark Mentovai
2011/05/16 16:51:34
It certainly seems like you can tighten up the saf
| |
| 650 # Invoke grit_info directly, without spawning a subprocess. Do | |
| 651 # this in |build_file_dir|. | |
| 652 oldwd = os.getcwd() # Python doesn't like os.open('.'): no fchdir. | |
| 653 os.chdir(build_file_dir) | |
| 654 replacement = str(grit_info.DoMain(contents.split()[2:]).rstrip()) | |
|
tony
2011/05/16 16:24:05
The extra str() seems unnecessary (doesn't rstrip(
Mark Mentovai
2011/05/16 16:51:34
You already have parsed_contents, why are you goin
| |
| 655 os.chdir(oldwd) | |
| 656 assert replacement != None | |
| 657 else: | |
| 658 # Fix up command with platform specific workarounds. | |
| 659 contents = FixupPlatformCommand(contents) | |
| 660 p = subprocess.Popen(contents, shell=use_shell, | |
| 661 stdout=subprocess.PIPE, | |
| 662 stderr=subprocess.PIPE, | |
| 663 stdin=subprocess.PIPE, | |
| 664 cwd=build_file_dir) | |
| 646 | 665 |
| 647 if p.wait() != 0 or p_stderr: | 666 (p_stdout, p_stderr) = p.communicate('') |
| 648 sys.stderr.write(p_stderr) | 667 |
| 649 # Simulate check_call behavior, since check_call only exists | 668 if p.wait() != 0 or p_stderr: |
| 650 # in python 2.5 and later. | 669 sys.stderr.write(p_stderr) |
| 651 raise Exception("Call to '%s' returned exit status %d." % | 670 # Simulate check_call behavior, since check_call only exists |
| 652 (contents, p.returncode)) | 671 # in python 2.5 and later. |
| 653 replacement = p_stdout.rstrip() | 672 raise Exception("Call to '%s' returned exit status %d." % |
| 673 (contents, p.returncode)) | |
| 674 replacement = p_stdout.rstrip() | |
| 654 | 675 |
| 655 cached_command_results[cache_key] = replacement | 676 cached_command_results[cache_key] = replacement |
| 656 else: | 677 else: |
| 657 gyp.DebugOutput(gyp.DEBUG_VARIABLES, | 678 gyp.DebugOutput(gyp.DEBUG_VARIABLES, |
| 658 "Had cache value for command '%s' in directory '%s'" % | 679 "Had cache value for command '%s' in directory '%s'" % |
| 659 (contents,build_file_dir)) | 680 (contents,build_file_dir)) |
| 660 replacement = cached_value | 681 replacement = cached_value |
| 661 | 682 |
| 662 else: | 683 else: |
| 663 if not contents in variables: | 684 if not contents in variables: |
| (...skipping 1577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2241 ValidateRunAsInTarget(target, target_dict, build_file) | 2262 ValidateRunAsInTarget(target, target_dict, build_file) |
| 2242 ValidateActionsInTarget(target, target_dict, build_file) | 2263 ValidateActionsInTarget(target, target_dict, build_file) |
| 2243 | 2264 |
| 2244 # Generators might not expect ints. Turn them into strs. | 2265 # Generators might not expect ints. Turn them into strs. |
| 2245 TurnIntIntoStrInDict(data) | 2266 TurnIntIntoStrInDict(data) |
| 2246 | 2267 |
| 2247 # TODO(mark): Return |data| for now because the generator needs a list of | 2268 # TODO(mark): Return |data| for now because the generator needs a list of |
| 2248 # build files that came in. In the future, maybe it should just accept | 2269 # build files that came in. In the future, maybe it should just accept |
| 2249 # a list, and not the whole data dict. | 2270 # a list, and not the whole data dict. |
| 2250 return [flat_list, targets, data] | 2271 return [flat_list, targets, data] |
| OLD | NEW |