00001 import os
00002 import string
00003 import SCons.Environment
00004 from SCons.Script import Dir
00005 from SCons.Variables import Variables, EnumVariable, BoolVariable
00006 import sys
00007
00008 class Directives:
00009 """
00010 Creates a list of C preprocessor directives.
00011 """
00012
00013 def __init__(self, cfg_name, module_name, cmd_line_args, bool_vars, enum_vars, other_vars):
00014 self._cfg_name = cfg_name
00015 self._module_name = module_name
00016 self._cmd_line_args = cmd_line_args
00017 self._bool_vars = bool_vars
00018 self._enum_vars = enum_vars
00019 self._other_vars = other_vars
00020 self._env = SCons.Environment.Environment()
00021 self.updateVariables()
00022 self.updateValues()
00023
00024 def updateValues(self):
00025 self._variables.Update(self._env)
00026
00027 def updateVariables(self):
00028 """
00029 Retrieve and define help options for configuration variables.
00030 """
00031 rootdir = Dir('#').abspath
00032 cfg_files = [
00033 rootdir + "/library/configuration/" + self._cfg_name + "/" + self._module_name + ".py",
00034 ]
00035
00036 cfgVars = Variables(cfg_files, self._cmd_line_args)
00037 [cfgVars.Add(BoolVariable(name, helptext, default)) for name, helptext, default in self._bool_vars]
00038 [cfgVars.Add(EnumVariable(name, helptext, default, valid)) for name, helptext, default, valid in self._enum_vars]
00039 [cfgVars.Add(option) for option in self._other_vars]
00040
00041 self._variables = cfgVars
00042
00043 def getBooleanDirectives(self, vars):
00044 """
00045 Takes the boolean directives of this instance and composes them
00046 into a list where each entry is 'X' if X is True.
00047 """
00048 directives = []
00049 for name, helptext, default in vars:
00050 if self._env[name] is True:
00051 directive = '%s' % name
00052 directives.append(directive)
00053 return directives
00054
00055 def getDirectives(self, vars):
00056 """
00057 Takes a list of vars and returns composes them
00058 into a list where each entry is 'NAME=VAL'.
00059 """
00060 directives = []
00061 for option in vars:
00062 directive = '%s=%s' % (option[0], self._env[option[0]])
00063 directives.append(directive)
00064 return directives
00065
00066 def getPreprocessorDefinitions(self):
00067 """
00068 Takes the input configuration and generates a string of preprocessor definitions
00069 appropriate to the environment as the configuration demands.
00070 """
00071 bool_directives = self.getBooleanDirectives(self._bool_vars)
00072 enum_directives = self.getDirectives(self._enum_vars)
00073 other_directives = self.getDirectives(self._other_vars)
00074 all_directives = bool_directives + enum_directives + other_directives
00075
00076 return all_directives