src/misc/gen_mod_template.py
changeset 0 ca70ae20a155
equal deleted inserted replaced
-1:000000000000 0:ca70ae20a155
       
     1 # Copyright (c) 2009 Nokia Corporation
       
     2 #
       
     3 # Licensed under the Apache License, Version 2.0 (the "License");
       
     4 # you may not use this file except in compliance with the License.
       
     5 # You may obtain a copy of the License at
       
     6 #
       
     7 #     http://www.apache.org/licenses/LICENSE-2.0
       
     8 #
       
     9 # Unless required by applicable law or agreed to in writing, software
       
    10 # distributed under the License is distributed on an "AS IS" BASIS,
       
    11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       
    12 # See the License for the specific language governing permissions and
       
    13 # limitations under the License.
       
    14 
       
    15 import os
       
    16 
       
    17 excluded_modules = []
       
    18 module_paths = []
       
    19 pyd_path_name = []
       
    20     
       
    21 
       
    22 def get_mod_list(arg, dirname, names):
       
    23     for name in names:
       
    24         # This check is done for not including the test_ files for modules
       
    25         if not name.startswith('test_') and name.endswith('.py'):
       
    26             path = os.path.join(dirname, name)
       
    27             path = path.replace(lib_path + '\\', '')
       
    28             # This check for 'test' is done to remove those files which fall
       
    29             # under test or crashers
       
    30             if not 'test' in path:
       
    31                 module_paths.append(path)
       
    32 
       
    33 
       
    34 def gen_excluded_list():
       
    35     global excluded_modules
       
    36     py_module = []
       
    37     module_type = []
       
    38     pyd_modules = []
       
    39     builtin_modules = []
       
    40     modules_cfg_path = \
       
    41             os.path.abspath('..\\newcore\\Symbian\\src\\modules.cfg')
       
    42     config_file = open(modules_cfg_path, 'r')
       
    43     for line in config_file:
       
    44         line = line.strip()
       
    45         if line in ['PYD', 'PY_MODULES', 'BUILTIN', 'EXT-MODULES',
       
    46                     'EXT-PYD', 'EXT-MOD-CFGS']:
       
    47             module_type = line
       
    48             continue
       
    49         if line and line[0] != '#':
       
    50             if module_type == 'PYD':
       
    51                 pyd_modules.append(line.split(',')[0])
       
    52             elif module_type == 'BUILTIN':
       
    53                 builtin_modules.append(line.split('=')[0])
       
    54             elif module_type == 'PY_MODULES':
       
    55                 py_module.append(line.split(':')[1])
       
    56     excluded_modules = py_module + builtin_modules + pyd_modules
       
    57 
       
    58 
       
    59 def get_pyd_list(arg, dirname, names):
       
    60     for name in names:
       
    61         if name.endswith('.c'):
       
    62             path = os.path.join(dirname, name)
       
    63             buf = open(path, 'r').read()
       
    64             if "Py_InitModule" in buf:
       
    65                 pyd_path_name.append(path)
       
    66 
       
    67 
       
    68 def add_pyd():
       
    69     pyd_name = []
       
    70     for pyd in pyd_path_name:
       
    71         fp = open(pyd, 'r')
       
    72         file_name = os.path.basename(pyd)
       
    73         for line in fp:
       
    74             if "Py_InitModule" in line:
       
    75                 try:
       
    76                     pyd_name.append(line.split('"')[1])
       
    77                 except:
       
    78                     # Some files do not have their pyd names in Py_InitModule,
       
    79                     # a split on these files would not yield the names so their
       
    80                     # names are hard coded
       
    81                     if file_name == 'unicodedata.c':
       
    82                         pyd_name.append('unicodedata')
       
    83                     elif file_name == 'posixmodule.c':
       
    84                         pyd_name.append('posix')
       
    85                     elif file_name == 'pyexpat.c':
       
    86                         pyd_name.append('pyexpat')
       
    87                     elif file_name == 'socketmodule.c':
       
    88                         pyd_name.append('_socket')
       
    89                     elif file_name == '_bsddb.c':
       
    90                         pyd_name.append('_bsddb')
       
    91                     continue
       
    92         fp.close()                             
       
    93     module_paths.extend(pyd_name)
       
    94 
       
    95 
       
    96 def gen_mod_dep_cfg_template():
       
    97     # These are the module dependency map for modules that are not
       
    98     # found by the module_config_parser and hence they need an explicit mention
       
    99     additional_modules = {'__main__': {'type': 'base', 'deps': []},
       
   100                           '__builtin__': {'type': 'base', 'deps': []},
       
   101                           'sys': {'type': 'base', 'deps': []},
       
   102                           'nt': {'type': 'excluded', 'deps': []},
       
   103                           'win32evtlogutil':{'type': 'excluded', 'deps': []},
       
   104                           'win32evtlog': {'type': 'excluded', 'deps': []}}
       
   105 
       
   106     for module in excluded_modules:
       
   107         if module in module_paths:
       
   108             module_paths.remove(module)
       
   109 
       
   110     # The exclude py_files() are parsed here
       
   111     dep_map = {}
       
   112     mod_dep_cfg_template_path = \
       
   113     os.path.abspath(
       
   114                 '..\\newcore\\Symbian\\src\\module_dependency.cfg.template')
       
   115     dep_map = eval(open(mod_dep_cfg_template_path, 'r').read())
       
   116     dep_map.update(additional_modules)
       
   117     mod_map = {}
       
   118     for mod in module_paths:
       
   119         mod_map['type'] = 'excluded'
       
   120         mod_map['deps'] = []
       
   121         mod_name = os.path.splitext(mod)[0].replace('\\', '.')
       
   122         dep_map[mod_name] = mod_map
       
   123     open(mod_dep_cfg_template_path, 'w').write(str(dep_map))
       
   124 
       
   125     fp = open(mod_dep_cfg_template_path, 'r')
       
   126     buf = fp.read()
       
   127     buf = buf.replace("}, '", "}, \n'")
       
   128     fp.close()
       
   129     open(mod_dep_cfg_template_path, 'w').write(buf)
       
   130 
       
   131 if __name__ == "__main__":
       
   132     # Walk through the Lib path for inbuilt modules
       
   133     lib_path = os.path.abspath("..\\newcore\\Lib")
       
   134     os.path.walk(lib_path, get_mod_list, None)
       
   135     gen_excluded_list()
       
   136     os.path.walk(os.path.abspath("..\\newcore\\Modules"), get_pyd_list, None)
       
   137     add_pyd()
       
   138     gen_mod_dep_cfg_template()