summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Node/FS.py
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2003-01-06 18:42:37 (GMT)
committerSteven Knight <knight@baldmt.com>2003-01-06 18:42:37 (GMT)
commit7fbd5909a526fc1ad282c7e701b0f7832af2e3ed (patch)
tree04f622a7b8fdab4ca337f20eced35b4d2699beb6 /src/engine/SCons/Node/FS.py
parent6702e9dce5182eaa012da9dc511fcf85cf205049 (diff)
downloadSCons-7fbd5909a526fc1ad282c7e701b0f7832af2e3ed.zip
SCons-7fbd5909a526fc1ad282c7e701b0f7832af2e3ed.tar.gz
SCons-7fbd5909a526fc1ad282c7e701b0f7832af2e3ed.tar.bz2
Refactor the Scanner interface to eliminate unnecessary scanning and make it easier to write efficient scanners.
Diffstat (limited to 'src/engine/SCons/Node/FS.py')
-rw-r--r--src/engine/SCons/Node/FS.py23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py
index 826307b..aa7f973 100644
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -790,6 +790,8 @@ class File(Entry):
def _morph(self):
"""Turn a file system node into a File object."""
self.linked = 0
+ self.scanner_paths = {}
+ self.found_includes = {}
if not hasattr(self, '_local'):
self._local = 0
@@ -856,11 +858,23 @@ class File(Entry):
return self.dir.sconsign().get_implicit(self.name)
def get_implicit_deps(self, env, scanner, target):
- if scanner:
- return scanner.scan(self, env, target)
- else:
+ if not scanner:
return []
-
+
+ try:
+ path = target.scanner_paths[scanner]
+ except KeyError:
+ path = scanner.path(env, target.cwd)
+ target.scanner_paths[scanner] = path
+
+ try:
+ includes = self.found_includes[path]
+ except KeyError:
+ includes = scanner(self, env, path)
+ self.found_includes[path] = includes
+
+ return includes
+
def scanner_key(self):
return os.path.splitext(self.name)[1]
@@ -895,6 +909,7 @@ class File(Entry):
def built(self):
SCons.Node.Node.built(self)
+ self.found_includes = {}
if hasattr(self, '_exists'):
delattr(self, '_exists')
if hasattr(self, '_rexists'):