X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=wizard%2FBProject.py;h=866d5be977f15650e86e7fdff941002cd6d2a394;hb=e47f203a5648786cd782d921880a77a395570059;hp=5e4a6bda387024c69491e818f8e5903abb789de3;hpb=b83274df8738dd4c0a5486eb24b482faa726abc0;p=bertos.git diff --git a/wizard/BProject.py b/wizard/BProject.py index 5e4a6bda..866d5be9 100644 --- a/wizard/BProject.py +++ b/wizard/BProject.py @@ -38,13 +38,27 @@ import fnmatch import copy import pickle -from bertos_utils import isBertosDir, loadCpuInfos, getTagSet, loadModuleData, setEnabledModules +import DefineException + +from LoadException import VersionException, ToolchainException + +import const + +from bertos_utils import ( + # Utility functions + isBertosDir, getTagSet, setEnabledModules, getInfos, + loadConfigurationInfos, loadDefineLists, loadModuleDefinition, + getCommentList, updateConfigurationValues, + + # Custom exceptions + ParseError, SupportedException + ) class BProject(object): """ Simple class for store and retrieve project informations. """ - + def __init__(self, project_file="", info_dict={}): self.infos = {} self._cached_queries = {} @@ -74,7 +88,7 @@ class BProject(object): self.loadSourceTree() cpu_name = project_data["CPU_NAME"] self.infos["CPU_NAME"] = cpu_name - cpu_info = loadCpuInfos(self) + cpu_info = self.loadCpuInfos() for cpu in cpu_info: if cpu["CPU_NAME"] == cpu_name: self.infos["CPU_INFOS"] = cpu @@ -99,15 +113,85 @@ class BProject(object): raise ToolchainException(self) self.infos["SELECTED_FREQ"] = project_data["SELECTED_FREQ"] self.infos["OUTPUT"] = project_data["OUTPUT"] - loadModuleData(self, True) + self.loadModuleData(True) setEnabledModules(self, project_data["ENABLED_MODULES"]) + def loadProjectPresets(self, preset_directory): + # This method will save: + # "CPU_NAME" + # ... + pass + + def loadModuleData(self, edit=False): + module_info_dict = {} + list_info_dict = {} + configuration_info_dict = {} + file_dict = {} + for filename, path in self.findDefinitions("*.h") + self.findDefinitions("*.c") + self.findDefinitions("*.s") + self.findDefinitions("*.S"): + comment_list = getCommentList(open(path + "/" + filename, "r").read()) + if len(comment_list) > 0: + module_info = {} + configuration_info = {} + try: + to_be_parsed, module_dict = loadModuleDefinition(comment_list[0]) + except ParseError, err: + raise DefineException.ModuleDefineException(path, err.line_number, err.line) + for module, information in module_dict.items(): + if "depends" not in information: + information["depends"] = () + information["depends"] += (filename.split(".")[0],) + information["category"] = os.path.basename(path) + if "configuration" in information and len(information["configuration"]): + configuration = module_dict[module]["configuration"] + try: + configuration_info[configuration] = loadConfigurationInfos(self.infos["SOURCES_PATH"] + "/" + configuration) + except ParseError, err: + raise DefineException.ConfigurationDefineException(self.infos["SOURCES_PATH"] + "/" + configuration, err.line_number, err.line) + if edit: + try: + path = self.infos["PROJECT_NAME"] + directory = self.infos["PROJECT_PATH"] + user_configuration = loadConfigurationInfos(directory + "/" + configuration.replace("bertos", path)) + configuration_info[configuration] = updateConfigurationValues(configuration_info[configuration], user_configuration) + except ParseError, err: + raise DefineException.ConfigurationDefineException(directory + "/" + configuration.replace("bertos", path)) + module_info_dict.update(module_dict) + configuration_info_dict.update(configuration_info) + if to_be_parsed: + try: + list_dict = loadDefineLists(comment_list[1:]) + list_info_dict.update(list_dict) + except ParseError, err: + raise DefineException.EnumDefineException(path, err.line_number, err.line) + for filename, path in self.findDefinitions("*_" + self.infos["CPU_INFOS"]["TOOLCHAIN"] + ".h"): + comment_list = getCommentList(open(path + "/" + filename, "r").read()) + list_info_dict.update(loadDefineLists(comment_list)) + for tag in self.infos["CPU_INFOS"]["CPU_TAGS"]: + for filename, path in self.findDefinitions("*_" + tag + ".h"): + comment_list = getCommentList(open(path + "/" + filename, "r").read()) + list_info_dict.update(loadDefineLists(comment_list)) + self.infos["MODULES"] = module_info_dict + self.infos["LISTS"] = list_info_dict + self.infos["CONFIGURATIONS"] = configuration_info_dict + self.infos["FILES"] = file_dict + + def loadCpuInfos(self): + cpuInfos = [] + for definition in self.findDefinitions(const.CPU_DEFINITION): + cpuInfos.append(getInfos(definition)) + return cpuInfos + + def reloadCpuInfo(self): + for cpu_info in self.loadCpuInfos(): + if cpu_info["CPU_NAME"] == self.infos["CPU_NAME"]: + self.infos["CPU_INFOS"] = cpu_info + def setInfo(self, key, value): """ Store the given value with the name key. """ self.infos[key] = value - + def info(self, key, default=None): """ Retrieve the value associated with the name key. @@ -131,7 +215,9 @@ class BProject(object): return [(filename, dirname) for dirname in file_dict.get(filename, [])] def findDefinitions(self, ftype): - definitions = self._cached_queries.get(ftype, None) + # Maintain a cache for every scanned SOURCES_PATH + definitions_dict = self._cached_queries.get(self.infos["SOURCES_PATH"], {}) + definitions = definitions_dict.get(ftype, None) if definitions is not None: return definitions file_dict = self.infos["FILE_DICT"] @@ -139,7 +225,12 @@ class BProject(object): for filename in file_dict: if fnmatch.fnmatch(filename, ftype): definitions += [(filename, dirname) for dirname in file_dict.get(filename, [])] - self._cached_queries[ftype] = definitions + + # If no cache for the current SOURCES_PATH create an empty one + if not definitions_dict: + self._cached_queries[self.infos["SOURCES_PATH"]] = {} + # Fill the empty cache with the result + self._cached_queries[self.infos["SOURCES_PATH"]][ftype] = definitions return definitions def __repr__(self):