src/misc/gen_mod_template.py
changeset 0 ca70ae20a155
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/misc/gen_mod_template.py	Tue Feb 16 10:07:05 2010 +0530
@@ -0,0 +1,138 @@
+# Copyright (c) 2009 Nokia Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+
+excluded_modules = []
+module_paths = []
+pyd_path_name = []
+    
+
+def get_mod_list(arg, dirname, names):
+    for name in names:
+        # This check is done for not including the test_ files for modules
+        if not name.startswith('test_') and name.endswith('.py'):
+            path = os.path.join(dirname, name)
+            path = path.replace(lib_path + '\\', '')
+            # This check for 'test' is done to remove those files which fall
+            # under test or crashers
+            if not 'test' in path:
+                module_paths.append(path)
+
+
+def gen_excluded_list():
+    global excluded_modules
+    py_module = []
+    module_type = []
+    pyd_modules = []
+    builtin_modules = []
+    modules_cfg_path = \
+            os.path.abspath('..\\newcore\\Symbian\\src\\modules.cfg')
+    config_file = open(modules_cfg_path, 'r')
+    for line in config_file:
+        line = line.strip()
+        if line in ['PYD', 'PY_MODULES', 'BUILTIN', 'EXT-MODULES',
+                    'EXT-PYD', 'EXT-MOD-CFGS']:
+            module_type = line
+            continue
+        if line and line[0] != '#':
+            if module_type == 'PYD':
+                pyd_modules.append(line.split(',')[0])
+            elif module_type == 'BUILTIN':
+                builtin_modules.append(line.split('=')[0])
+            elif module_type == 'PY_MODULES':
+                py_module.append(line.split(':')[1])
+    excluded_modules = py_module + builtin_modules + pyd_modules
+
+
+def get_pyd_list(arg, dirname, names):
+    for name in names:
+        if name.endswith('.c'):
+            path = os.path.join(dirname, name)
+            buf = open(path, 'r').read()
+            if "Py_InitModule" in buf:
+                pyd_path_name.append(path)
+
+
+def add_pyd():
+    pyd_name = []
+    for pyd in pyd_path_name:
+        fp = open(pyd, 'r')
+        file_name = os.path.basename(pyd)
+        for line in fp:
+            if "Py_InitModule" in line:
+                try:
+                    pyd_name.append(line.split('"')[1])
+                except:
+                    # Some files do not have their pyd names in Py_InitModule,
+                    # a split on these files would not yield the names so their
+                    # names are hard coded
+                    if file_name == 'unicodedata.c':
+                        pyd_name.append('unicodedata')
+                    elif file_name == 'posixmodule.c':
+                        pyd_name.append('posix')
+                    elif file_name == 'pyexpat.c':
+                        pyd_name.append('pyexpat')
+                    elif file_name == 'socketmodule.c':
+                        pyd_name.append('_socket')
+                    elif file_name == '_bsddb.c':
+                        pyd_name.append('_bsddb')
+                    continue
+        fp.close()                             
+    module_paths.extend(pyd_name)
+
+
+def gen_mod_dep_cfg_template():
+    # These are the module dependency map for modules that are not
+    # found by the module_config_parser and hence they need an explicit mention
+    additional_modules = {'__main__': {'type': 'base', 'deps': []},
+                          '__builtin__': {'type': 'base', 'deps': []},
+                          'sys': {'type': 'base', 'deps': []},
+                          'nt': {'type': 'excluded', 'deps': []},
+                          'win32evtlogutil':{'type': 'excluded', 'deps': []},
+                          'win32evtlog': {'type': 'excluded', 'deps': []}}
+
+    for module in excluded_modules:
+        if module in module_paths:
+            module_paths.remove(module)
+
+    # The exclude py_files() are parsed here
+    dep_map = {}
+    mod_dep_cfg_template_path = \
+    os.path.abspath(
+                '..\\newcore\\Symbian\\src\\module_dependency.cfg.template')
+    dep_map = eval(open(mod_dep_cfg_template_path, 'r').read())
+    dep_map.update(additional_modules)
+    mod_map = {}
+    for mod in module_paths:
+        mod_map['type'] = 'excluded'
+        mod_map['deps'] = []
+        mod_name = os.path.splitext(mod)[0].replace('\\', '.')
+        dep_map[mod_name] = mod_map
+    open(mod_dep_cfg_template_path, 'w').write(str(dep_map))
+
+    fp = open(mod_dep_cfg_template_path, 'r')
+    buf = fp.read()
+    buf = buf.replace("}, '", "}, \n'")
+    fp.close()
+    open(mod_dep_cfg_template_path, 'w').write(buf)
+
+if __name__ == "__main__":
+    # Walk through the Lib path for inbuilt modules
+    lib_path = os.path.abspath("..\\newcore\\Lib")
+    os.path.walk(lib_path, get_mod_list, None)
+    gen_excluded_list()
+    os.path.walk(os.path.abspath("..\\newcore\\Modules"), get_pyd_list, None)
+    add_pyd()
+    gen_mod_dep_cfg_template()