| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 from optparse import OptionParser | 6 from optparse import OptionParser |
| 7 import os | 7 import os |
| 8 import re | 8 import re |
| 9 import sys | 9 import sys |
| 10 | 10 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 | 52 |
| 53 def open(self, pathname): | 53 def open(self, pathname): |
| 54 ospath = self.ToNativePath(pathname) | 54 ospath = self.ToNativePath(pathname) |
| 55 return open(ospath) | 55 return open(ospath) |
| 56 | 56 |
| 57 def realpath(self, pathname): | 57 def realpath(self, pathname): |
| 58 ospath = self.ToNativePath(pathname) | 58 ospath = self.ToNativePath(pathname) |
| 59 ospath = os.path.realpath(ospath) | 59 ospath = os.path.realpath(ospath) |
| 60 return self.ToPosixPath(ospath) | 60 return self.ToPosixPath(ospath) |
| 61 | 61 |
| 62 def dirname(self, pathname): |
| 63 ospath = self.ToNativePath(pathname) |
| 64 ospath = os.path.dirname(ospath) |
| 65 return self.ToPosixPath(ospath) |
| 66 |
| 62 | 67 |
| 63 class Resolver(object): | 68 class Resolver(object): |
| 64 """Resolver finds and generates relative paths for include files. | 69 """Resolver finds and generates relative paths for include files. |
| 65 | 70 |
| 66 The Resolver object provides a mechanism to to find and convert a source or | 71 The Resolver object provides a mechanism to to find and convert a source or |
| 67 include filename into a relative path based on provided search paths. All | 72 include filename into a relative path based on provided search paths. All |
| 68 paths use POSIX style separator. | 73 paths use POSIX style separator. |
| 69 """ | 74 """ |
| 70 def __init__(self, pathobj=PathConverter()): | 75 def __init__(self, pathobj=PathConverter()): |
| 71 self.search_dirs = [] | 76 self.search_dirs = [] |
| 72 self.pathobj = pathobj | 77 self.pathobj = pathobj |
| 73 self.cwd = self.pathobj.getcwd() | 78 self.cwd = self.pathobj.getcwd() |
| 74 self.offs = len(self.cwd) | 79 self.offs = len(self.cwd) |
| 75 | 80 |
| 76 def AddOneDirectory(self, pathname): | 81 def AddOneDirectory(self, pathname): |
| 77 """Add an include search path.""" | 82 """Add an include search path.""" |
| 78 pathname = self.pathobj.realpath(pathname) | 83 pathname = self.pathobj.realpath(pathname) |
| 79 DebugPrint('Adding DIR: %s' % pathname) | 84 DebugPrint('Adding DIR: %s' % pathname) |
| 80 if pathname not in self.search_dirs: | 85 if pathname not in self.search_dirs: |
| 81 if self.pathobj.isdir(pathname): | 86 if self.pathobj.isdir(pathname): |
| 82 self.search_dirs.append(pathname) | 87 self.search_dirs.append(pathname) |
| 83 else: | 88 else: |
| 84 sys.stderr.write('Not a directory: %s\n' % pathname) | 89 sys.stderr.write('Not a directory: %s\n' % pathname) |
| 85 return False | 90 return False |
| 86 return True | 91 return True |
| 87 | 92 |
| 93 def RemoveOneDirectory(self, pathname): |
| 94 """Remove an include search path.""" |
| 95 pathname = self.pathobj.realpath(pathname) |
| 96 DebugPrint('Removing DIR: %s' % pathname) |
| 97 if pathname in self.search_dirs: |
| 98 self.search_dirs.remove(pathname) |
| 99 return True |
| 100 |
| 88 def AddDirectories(self, pathlist): | 101 def AddDirectories(self, pathlist): |
| 89 """Add list of space separated directories.""" | 102 """Add list of space separated directories.""" |
| 90 failed = False | 103 failed = False |
| 91 dirlist = ' '.join(pathlist) | 104 dirlist = ' '.join(pathlist) |
| 92 for dirname in dirlist.split(' '): | 105 for dirname in dirlist.split(' '): |
| 93 if not self.AddOneDirectory(dirname): | 106 if not self.AddOneDirectory(dirname): |
| 94 failed = True | 107 failed = True |
| 95 return not failed | 108 return not failed |
| 96 | 109 |
| 97 def GetDirectories(self): | 110 def GetDirectories(self): |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 if not self.todo_list: | 204 if not self.todo_list: |
| 192 return None | 205 return None |
| 193 return self.todo_list.pop() | 206 return self.todo_list.pop() |
| 194 | 207 |
| 195 def Run(self): | 208 def Run(self): |
| 196 """Search through the available dependencies until the list becomes empty. | 209 """Search through the available dependencies until the list becomes empty. |
| 197 The list must be primed with one or more source files to search.""" | 210 The list must be primed with one or more source files to search.""" |
| 198 scan_name = self.PopIfAvail() | 211 scan_name = self.PopIfAvail() |
| 199 while scan_name: | 212 while scan_name: |
| 200 includes = self.scanner.ScanFile(scan_name) | 213 includes = self.scanner.ScanFile(scan_name) |
| 214 # Add the directory of the current scanned file for resolving includes |
| 215 # while processing includes for this file. |
| 216 scan_dir = PathConverter().dirname(scan_name) |
| 217 self.resolver.AddOneDirectory(scan_dir) |
| 201 for include_file in includes: | 218 for include_file in includes: |
| 202 self.PushIfNew(include_file) | 219 self.PushIfNew(include_file) |
| 220 self.resolver.RemoveOneDirectory(scan_dir) |
| 203 scan_name = self.PopIfAvail() | 221 scan_name = self.PopIfAvail() |
| 204 return sorted(self.added_set) | 222 return sorted(self.added_set) |
| 205 | 223 |
| 206 | 224 |
| 207 def DoMain(argv): | 225 def DoMain(argv): |
| 208 """Entry point used by gyp's pymod_do_main feature.""" | 226 """Entry point used by gyp's pymod_do_main feature.""" |
| 209 global debug | 227 global debug |
| 210 parser = OptionParser() | 228 parser = OptionParser() |
| 211 parser.add_option('-I', dest='includes', action='append', | 229 parser.add_option('-I', dest='includes', action='append', |
| 212 help='Set include path.') | 230 help='Set include path.') |
| (...skipping 21 matching lines...) Expand all Loading... |
| 234 | 252 |
| 235 def Main(): | 253 def Main(): |
| 236 retcode, result = DoMain(sys.argv[1:]) | 254 retcode, result = DoMain(sys.argv[1:]) |
| 237 if retcode: | 255 if retcode: |
| 238 sys.exit(retcode) | 256 sys.exit(retcode) |
| 239 sys.stdout.write(result) | 257 sys.stdout.write(result) |
| 240 | 258 |
| 241 | 259 |
| 242 if __name__ == '__main__': | 260 if __name__ == '__main__': |
| 243 Main() | 261 Main() |
| OLD | NEW |