diff --git a/android/gyp/util/build_utils.py b/android/gyp/util/build_utils.py index 65bd07b35..8b395131c 100644 --- a/android/gyp/util/build_utils.py +++ b/android/gyp/util/build_utils.py @@ -406,8 +406,7 @@ def GetPythonDependencies(): A path is assumed to be a "system" import if it is outside of chromium's src/. The paths will be relative to the current directory. """ - module_paths = (m.__file__ for m in sys.modules.itervalues() - if m is not None and hasattr(m, '__file__')) + module_paths = GetModulePaths() abs_module_paths = map(os.path.abspath, module_paths) @@ -424,6 +423,30 @@ def GetPythonDependencies(): return sorted(set(non_system_module_paths)) +def GetModulePaths(): + """Returns the paths to all of the modules in sys.modules.""" + ForceLazyModulesToLoad() + return (m.__file__ for m in sys.modules.itervalues() + if m is not None and hasattr(m, '__file__')) + + +def ForceLazyModulesToLoad(): + """Forces any lazily imported modules to fully load themselves. + + Inspecting the modules' __file__ attribute causes lazily imported modules + (e.g. from email) to get fully imported and update sys.modules. Iterate + over the values until sys.modules stabilizes so that no modules are missed. + """ + while True: + num_modules_before = len(sys.modules.keys()) + for m in sys.modules.values(): + if m is not None and hasattr(m, '__file__'): + _ = m.__file__ + num_modules_after = len(sys.modules.keys()) + if num_modules_before == num_modules_after: + break + + def AddDepfileOption(parser): # TODO(agrieve): Get rid of this once we've moved to argparse. if hasattr(parser, 'add_option'):