summaryrefslogtreecommitdiff
path: root/lib/mesa/scons/custom.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mesa/scons/custom.py')
-rw-r--r--lib/mesa/scons/custom.py44
1 files changed, 24 insertions, 20 deletions
diff --git a/lib/mesa/scons/custom.py b/lib/mesa/scons/custom.py
index 043793b5d..bdb4039b8 100644
--- a/lib/mesa/scons/custom.py
+++ b/lib/mesa/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
@@ -44,6 +43,13 @@ import fixes
import source_list
+# the get_implicit_deps() method changed between 2.4 and 2.5: now it expects
+# a callable that takes a scanner as argument and returns a path, rather than
+# a path directly. We want to support both, so we need to detect the SCons version,
+# for which no API is provided by SCons 8-P
+
+scons_version = tuple(map(int, SCons.__version__.split('.')))
+
def quietCommandLines(env):
# Quiet command lines
# See also http://www.scons.org/wiki/HidingCommandLinesInOutput
@@ -93,27 +99,25 @@ 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)
+
+ # Tell ModuleFinder to search dependencies in the script dir, and the glapi
+ # dirs
+ source_dir = node.get_dir().abspath
+ GLAPI = env.Dir('#src/mapi/glapi/gen').abspath
+ path = [source_dir, GLAPI] + sys.path
+
+ finder = modulefinder.ModuleFinder(path=path)
+ 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'])
@@ -138,7 +142,7 @@ def code_generate(env, script, target, source, command):
# Explicitly mark that the generated code depends on the generator,
# and on implicitly imported python modules
- path = (script_src.get_dir(),)
+ path = (script_src.get_dir(),) if scons_version < (2, 5, 0) else lambda x: script_src
deps = [script_src]
deps += script_src.get_implicit_deps(env, python_scanner, path)
env.Depends(code, deps)