← Back to team overview

hipl-core team mailing list archive

[Branch ~rene-hummen/hipl/ipsec_esp] Rev 4937: added dependency resolution and documented module parsing script

 

------------------------------------------------------------
revno: 4937
committer: Rene Hummen <rene.hummen@xxxxxxxxxxxxxxxxx>
branch nick: ipsec_esp
timestamp: Fri 2010-09-10 16:38:41 +0200
message:
  added dependency resolution and documented module parsing script
modified:
  process_modules.py


--
lp:~rene-hummen/hipl/ipsec_esp
https://code.launchpad.net/~rene-hummen/hipl/ipsec_esp

Your team HIPL core team is subscribed to branch lp:~rene-hummen/hipl/ipsec_esp.
To unsubscribe from this branch go to https://code.launchpad.net/~rene-hummen/hipl/ipsec_esp/+edit-subscription
=== modified file 'process_modules.py'
--- process_modules.py	2010-04-01 15:38:03 +0000
+++ process_modules.py	2010-09-10 14:38:41 +0000
@@ -24,9 +24,13 @@
 
     module_info = {}
 
+    # name of the module
     module_name = str(dom.getElementsByTagName('module')[0].attributes['name'].value)
+    
+    # current version of the module
     module_info['version'] = str(dom.getElementsByTagName('module')[0].attributes['version'].value)
 
+    # list of module dependencies (incl. version range)
     module_info['requires'] = []
     if 0 < len(dom.getElementsByTagName('requires')):
         for node in dom.getElementsByTagName('requires')[0].getElementsByTagName('module'):
@@ -39,6 +43,7 @@
 
             module_info['requires'].append(current_req)
 
+    # list of conflicting modules (incl. version range)
     module_info['conflicts'] = []
     if 0 < len(dom.getElementsByTagName('conflicts')):
         for node in dom.getElementsByTagName('conflicts')[0].getElementsByTagName('module'):
@@ -51,7 +56,9 @@
 
             module_info['conflicts'].append(current_con)
 
+    # application for which the module provides functionality
     module_info['application'] = {}
+    # application field is mandatory
     if 0 == len(dom.getElementsByTagName('application')):
         print '|\n|    WARNING in configuration of ' + module_name + ':',
         print 'no application tag found'
@@ -60,8 +67,11 @@
 
     for current_app in dom.getElementsByTagName('application'):
         app_info = {}
+        # application name
         name = str(current_app.attributes['name'].value)
+        # header files that should be included by the application
         app_info['header_file'] = str(current_app.attributes['header_file'].value)
+        # hook to be called by application at startup
         app_info['init_function'] = str(current_app.attributes['init_function'].value)
         module_info['application'][name] = app_info
 
@@ -87,6 +97,7 @@
         if True == cont:
             continue
 
+        # Now parse specific module information
         try:
             path = os.path.join(current_module, MODULE_INFO_FILE)
             (module_name, info) = parse_xml_info(path)
@@ -101,10 +112,20 @@
     return (module_info)
 
 # Checks the module_info data structure for missing dependencies and conflicts
-# between modules. Returns a
+# between modules.
 def check_dependencies(module_info):
 
+    # list of ordered dependencies
+    ordered_dependencies = []
+
     for current_module in module_info.keys():
+
+        # append current module if it is not a member of the list yet
+        if ordered_dependencies.count(current_module) == 0:
+            ordered_dependencies.append(current_module)
+
+        current_index = ordered_dependencies.index(current_module)
+
         # Check for dependencies
         for require in module_info[current_module]['requires']:
             if False == (require['name'] in module_info.keys()):
@@ -114,6 +135,7 @@
             else:
                 req_version = module_info[require['name']]['version']
 
+                # Check for matching version
                 if require.has_key('minversion') and req_version < require['minversion']:
                     print '|\n|    ERROR ' + current_module + ' requires module',
                     print require['name'] + ' at least in version ' + require['minversion']
@@ -123,11 +145,16 @@
                     print require['name'] + ' at most in version ' + require['maxversion']
                     sys.exit('|    ...abort current run. Please check module configuration\n|')
 
+            # insert dependency before current module if it is not a member yet
+            if ordered_dependencies.count(require['name']) == 0:
+                ordered_dependencies.insert(current_index, require['name'])
+
         # Check for conflicts
         for conflict in module_info[current_module]['conflicts']:
             if conflict['name'] in module_info.keys():
                 con_version = module_info[conflict['name']]['version']
-
+                
+                # Check for conflicting version
                 if False == ((conflict.has_key('minversion') and
                               con_version < conflict['minversion']) or
                              (conflict.has_key('maxversion') and
@@ -135,10 +162,12 @@
                     print '|    ERROR ' + current_module + ' conflicts with module ' + conflict['name'] + ' (version ' + con_version + ')'
                     sys.exit('|    ...abort current run. Please check module configuration\n|')
 
-# Creates a C header file with the given filename an the needed includes,
+    return ordered_dependencies
+
+# Creates a C header file with the given filename and the needed includes,
 # the number of init functions per application and an array of function
 # pointers for each application
-def create_header_files(applications, module_info):
+def create_header_files(applications, module_info, ordered_dependencies):
 
     if False == os.path.isdir(HEADER_FILE_DIR):
         os.mkdir(HEADER_FILE_DIR)
@@ -151,63 +180,84 @@
         try:
             hdr_file = open(hdr_file_path, 'w')
             try:
+                # Protection for multiple header includes
                 app_string = 'HIP_MODULES_' + current_app.upper() + '_MODULES_H'
                 hdr_file.write('/* ' + WARNING_STRING + ' */\n')
                 hdr_file.write('#ifndef ' + app_string + '\n')
                 hdr_file.write('#define ' + app_string + '\n')
 
-                info_string  = 'struct module_info ' + current_app
-                info_string += '_modules[] = {'
-                first_loop           = True
-                num_spaces           = len(info_string)
+                # Header includes providing hooks into extensions
                 num_modules          = 0
                 max_required_modules = 0
 
-                for current_module in module_info:
+                # Add includes ordered by dependencies
+                for current_module in ordered_dependencies:
                     if module_info[current_module]['application'].has_key(current_app):
+                        # Add includes
                         app_info = module_info[current_module]['application'][current_app]
+                        hdr_file.write('\n#include \"' + app_info['header_file'] + '\"')
+
+                        # Count number of modules for the current application
                         num_modules += 1
-                        hdr_file.write('\n#include \"' + app_info['header_file'] + '\"')
 
+                        # Check the maximum number of dependencies (required for array size)
                         num_required_modules = len(module_info[current_module]['requires'])
                         if num_required_modules > max_required_modules:
                             max_required_modules = num_required_modules
+
+                # required defines and struct definitions
+                info_struct  = '\n\n#define MAX_REQUIRED_MODULES '
+                info_struct += str(max_required_modules)
+                info_struct += '\n\nstruct module_info {\n'
+                info_struct += '    const char *name;\n'
+                info_struct += '    const int   num_required_moduels;\n'
+                info_struct += '    const char *required_modules_hipd['
+                info_struct += 'MAX_REQUIRED_MODULES];\n'
+                info_struct += '    int       (*init_function)(void);\n'
+                info_struct += '};\n\n'
+                hdr_file.write(info_struct)
+
+                # required const definition
+                hdr_file.write('/* Number of modules - determined during build process. */')
+                hdr_file.write('\nconst int ' + current_app + '_num_modules')
+                hdr_file.write(' = ' + str(num_modules) + ';\n\n')
+
+                # hooks and additional information required by the application
+                # at start-up to initialize modules
+                info_string  = 'struct module_info ' + current_app
+                info_string += '_modules[] = {'
+
+                # required for code alignment in header
+                num_spaces           = len(info_string)
+                # first module does not need to be aligned
+                first_loop           = True
+
+                for current_module in ordered_dependencies:
+                    # only add module information for corresponding application
+                    if module_info[current_module]['application'].has_key(current_app):
                         if first_loop != True:
                             info_string += ',\n'
                             for i in range(num_spaces):
                                 info_string += ' '
                         info_string += '{"' + current_module + '", '
-                        info_string += str(num_required_modules) + ', '
+                        info_string += str(len(module_info[current_module]['requires']))
 
                         first_loop_1 = True
-                        info_string += '{'
+                        info_string += ', {'
                         for required_module in module_info[current_module]['requires']:
                             if first_loop_1 != True:
                                 info_string += ', '
                             info_string += '"' + required_module['name'] + '"'
                             first_loop_1 = False
+                        info_string += '}, &'
+                        info_string += module_info[current_module]['application'][current_app]['init_function']
                         info_string += '}'
-                        info_string += ', &' + app_info['init_function'] + '}'
                         first_loop = False
 
                 info_string += '};'
-
-                info_struct  = '\n\n#define MAX_REQUIRED_MODULES '
-                info_struct += str(max_required_modules)
-                info_struct += '\n\nstruct module_info {\n'
-                info_struct += '    const char *name;\n'
-                info_struct += '    const int   num_required_moduels;\n'
-                info_struct += '    const char *required_modules_hipd['
-                info_struct += 'MAX_REQUIRED_MODULES];\n'
-                info_struct += '    int       (*init_function)(void);\n'
-                info_struct += '};\n\n'
-                hdr_file.write(info_struct)
-                hdr_file.write('/* Number of modules - determined during build process. */')
-                hdr_file.write('\nconst int ' + current_app + '_num_modules')
-                hdr_file.write(' = ' + str(num_modules) + ';\n\n')
-
                 hdr_file.write(info_string)
 
+                # End of multiple include protection
                 hdr_file.write('\n\n#endif /* ' + app_string + ' */\n')
                 print '|    created file: ' + hdr_file_path
             finally:
@@ -236,15 +286,16 @@
         else:
             assert False, "unhandled option"
 
+    # Handle disabling modules at command-line during compile-time
     if disabled_modules:
         disabled_modules = disabled_modules.rsplit(',')
 
     (module_info) = read_module_info(os.path.join(srcdir, MODULES_DIR),
                                      disabled_modules)
 
-    check_dependencies(module_info)
+    ordered_dependencies = check_dependencies(module_info)
 
-    create_header_files(applications, module_info)
+    create_header_files(applications, module_info, ordered_dependencies)
 
 if __name__ == "__main__":
     main()