[Mesa-dev] [PATCH] scons: Improve Python module dependency discovery.

Brian Paul brianp at vmware.com
Fri May 6 16:18:57 UTC 2016


On 05/06/2016 10:04 AM, Jose Fonseca wrote:
> 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.
> ---
>   scons/custom.py | 27 +++++++++------------------
>   1 file changed, 9 insertions(+), 18 deletions(-)
>
> diff --git a/scons/custom.py b/scons/custom.py
> index 043793b..ff7a7a9 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'])
>

Looks OK to me.

Reviewed-by: Brian Paul <brianp at vmware.com>



More information about the mesa-dev mailing list