hipl-core team mailing list archive
-
hipl-core team
-
Mailing list archive
-
Message #00170
[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()