summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose Fonseca <jfonseca@vmware.com>2016-05-06 14:03:05 +0100
committerJose Fonseca <jfonseca@vmware.com>2016-05-09 14:19:24 +0100
commitc521f2d7373a241a69238b95a8c0f3725a9da5ad (patch)
tree3e5544f47b64578475ad5102cda4a0b13463d94b
parent172bfdaa9e80342ade3f023f72d455d76713b866 (diff)
scons: Improve Python module dependency discovery.
Several NIR scripts were using `from ... import ...` syntax, which wasn't supported. Using Python standard libary's modulefinder solves the problem with less effort and hacks. Reviewed-by: Brian Paul <brianp@vmware.com>
-rw-r--r--scons/custom.py27
1 files changed, 9 insertions, 18 deletions
diff --git a/scons/custom.py b/scons/custom.py
index 043793b5de..ff7a7a935d 100644
--- a/scons/custom.py
+++ b/scons/custom.py
@@ -30,11 +30,10 @@ Custom builders and methods.
#
-import os
import os.path
-import re
import sys
import subprocess
+import modulefinder
import SCons.Action
import SCons.Builder
@@ -93,27 +92,19 @@ def createConvenienceLibBuilder(env):
return convenience_lib
-# TODO: handle import statements with multiple modules
-# TODO: handle from import statements
-import_re = re.compile(r'^\s*import\s+(\S+)\s*$', re.M)
-
def python_scan(node, env, path):
# http://www.scons.org/doc/0.98.5/HTML/scons-user/c2781.html#AEN2789
+ # https://docs.python.org/2/library/modulefinder.html
contents = node.get_contents()
source_dir = node.get_dir()
- imports = import_re.findall(contents)
+ finder = modulefinder.ModuleFinder()
+ finder.run_script(node.abspath)
results = []
- for imp in imports:
- for dir in path:
- file = os.path.join(str(dir), imp.replace('.', os.sep) + '.py')
- if os.path.exists(file):
- results.append(env.File(file))
- break
- file = os.path.join(str(dir), imp.replace('.', os.sep), '__init__.py')
- if os.path.exists(file):
- results.append(env.File(file))
- break
- #print node, map(str, results)
+ for name, mod in finder.modules.iteritems():
+ if mod.__file__ is None:
+ continue
+ assert os.path.exists(mod.__file__)
+ results.append(env.File(mod.__file__))
return results
python_scanner = SCons.Scanner.Scanner(function = python_scan, skeys = ['.py'])