diff options
author | Jose Fonseca <jfonseca@vmware.com> | 2016-05-06 14:03:05 +0100 |
---|---|---|
committer | Jose Fonseca <jfonseca@vmware.com> | 2016-05-09 14:19:24 +0100 |
commit | c521f2d7373a241a69238b95a8c0f3725a9da5ad (patch) | |
tree | 3e5544f47b64578475ad5102cda4a0b13463d94b /scons/custom.py | |
parent | 172bfdaa9e80342ade3f023f72d455d76713b866 (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>
Diffstat (limited to 'scons/custom.py')
-rw-r--r-- | scons/custom.py | 27 |
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']) |