ParseError, SupportedException
)
+from compatibility import updateProject
+
class BProject(object):
"""
Simple class for store and retrieve project informations.
def loadBertosProject(self, project_file, info_dict):
project_dir = os.path.dirname(project_file)
project_data = pickle.loads(open(project_file, "r").read())
+ updateProject(project_data)
# If PROJECT_NAME is not defined it use the directory name as PROJECT_NAME
# NOTE: this can throw an Exception if the user has changed the directory containing the project
self.infos["PROJECT_NAME"] = project_data.get("PROJECT_NAME", os.path.basename(project_dir))
self.infos["PROJECT_PATH"] = os.path.dirname(project_file)
project_src_path = project_data.get("PROJECT_SRC_PATH", None)
+ project_src_path = os.path.join(project_dir, project_data.get("PROJECT_SRC_PATH", None))
if project_src_path:
self.infos["PROJECT_SRC_PATH"] = project_src_path
-
- wizard_version = project_data.get("WIZARD_VERSION", 0)
- if wizard_version < 1:
- # Ignore the SOURCES_PATH inside the project file for older project
- project_data["SOURCES_PATH"] = project_dir
+
else:
- linked_sources_path = project_data["SOURCES_PATH"]
- sources_abspath = os.path.abspath(os.path.join(project_dir, linked_sources_path))
- project_data["SOURCES_PATH"] = sources_abspath
+ # In projects created with older versions of the Wizard this metadata doesn't exist
+ self.infos["PROJECT_SRC_PATH"] = os.path.join(self.infos["PROJECT_PATH"], self.infos["PROJECT_NAME"])
+
+ linked_sources_path = project_data["BERTOS_PATH"]
+ sources_abspath = os.path.abspath(os.path.join(project_dir, linked_sources_path))
+ project_data["BERTOS_PATH"] = sources_abspath
- self._loadBertosSourceStuff(project_data["SOURCES_PATH"], info_dict.get("SOURCES_PATH", None))
+ self._loadBertosSourceStuff(project_data["BERTOS_PATH"], info_dict.get("BERTOS_PATH", None))
self.infos["PRESET"] = project_data.get("PRESET", False)
# For those projects that don't have a VERSION file create a dummy one.
- if not isBertosDir(project_dir):
+ if not isBertosDir(project_dir) and not self.is_preset:
version_file = open(os.path.join(const.DATA_DIR, "vtemplates/VERSION"), "r").read()
open(os.path.join(project_dir, "VERSION"), "w").write(version_file.replace("$version", "").strip())
if forced_version:
sources_path = forced_version
if os.path.exists(sources_path):
- self.infos["SOURCES_PATH"] = sources_path
+ self.infos["BERTOS_PATH"] = sources_path
else:
raise VersionException(self)
self.loadSourceTree()
self._loadCpuStuff(project_data["CPU_NAME"], project_data["SELECTED_FREQ"])
self._loadToolchainStuff(project_data["TOOLCHAIN"])
+
# NOTE: this is a HACK!!!
# TODO: find a better way to reuse loadModuleData
+ preset_project_name = project_data.get("PROJECT_NAME", os.path.basename(preset))
+ preset_prj_src_path = os.path.join(preset, project_data.get("PROJECT_SRC_PATH", os.path.join(preset, preset_project_name)))
+
old_project_name = self.infos["PROJECT_NAME"]
old_project_path = self.infos["PROJECT_PATH"]
- self.infos["PROJECT_NAME"] = project_data.get("PROJECT_NAME", os.path.basename(preset))
+ old_project_src_path = self.infos["PROJECT_SRC_PATH"]
+
+ self.infos["PROJECT_NAME"] = preset_project_name
self.infos["PROJECT_PATH"] = preset
+ self.infos["PROJECT_SRC_PATH"] = preset_prj_src_path
+
self.loadModuleData(True)
self.setEnabledModules(project_data["ENABLED_MODULES"])
+
self.infos["PROJECT_NAME"] = old_project_name
self.infos["PROJECT_PATH"] = old_project_path
- self.infos["PRESET_NAME"] = project_data.get("PROJECT_NAME", os.path.basename(preset))
+ self.infos["PROJECT_SRC_PATH"] = old_project_src_path
+ # End of the ugly HACK!
+
+ self.infos["PRESET_NAME"] = preset_project_name
self.infos["PRESET_PATH"] = preset
+ self.infos["PRESET_SRC_PATH"] = preset_prj_src_path
def loadProjectPresets(self):
"""
Load the default presets (into the const.PREDEFINED_BOARDS_DIR).
"""
# NOTE: this method does nothing (for now).
- preset_path = os.path.join(self.infos["SOURCES_PATH"], const.PREDEFINED_BOARDS_DIR)
+ preset_path = os.path.join(self.infos["BERTOS_PATH"], const.PREDEFINED_BOARDS_DIR)
preset_tree = {}
if os.path.exists(preset_path):
preset_tree = self._loadProjectPresetTree(preset_path)
if "configuration" in information and len(information["configuration"]):
configuration = module_dict[module]["configuration"]
try:
- configuration_info[configuration] = loadConfigurationInfos(self.infos["SOURCES_PATH"] + "/" + configuration)
+ configuration_info[configuration] = loadConfigurationInfos(self.infos["BERTOS_PATH"] + "/" + configuration)
except ParseError, err:
- raise DefineException.ConfigurationDefineException(self.infos["SOURCES_PATH"] + "/" + configuration, err.line_number, err.line)
+ raise DefineException.ConfigurationDefineException(self.infos["BERTOS_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))
+ path = self.infos["PROJECT_SRC_PATH"]
+ user_configuration = loadConfigurationInfos(configuration.replace("bertos", path))
configuration_info[configuration] = updateConfigurationValues(configuration_info[configuration], user_configuration)
except ParseError, err:
- raise DefineException.ConfigurationDefineException(directory + "/" + configuration.replace("bertos", path))
+ raise DefineException.ConfigurationDefineException(configuration.replace("bertos", path))
module_info_dict.update(module_dict)
configuration_info_dict.update(configuration_info)
if to_be_parsed:
"""
Index BeRTOS source and load it in memory.
"""
- # Index only the SOURCES_PATH/bertos content
- bertos_sources_dir = os.path.join(self.info("SOURCES_PATH"), "bertos")
+ # Index only the BERTOS_PATH/bertos content
+ bertos_sources_dir = os.path.join(self.info("BERTOS_PATH"), "bertos")
file_dict = {}
if os.path.exists(bertos_sources_dir):
for element in os.walk(bertos_sources_dir):
self._newBertosProjectFromPreset()
def _newBertosProject(self):
- for directory in (self.maindir, self.srcdir, self.prjdir, self.hwdir, self.cfgdir):
+ for directory in (self.maindir, self.srcdir, self.prjdir, self.cfgdir):
self._createDirectory(directory)
# Write the project file
self._writeProjectFile(os.path.join(self.maindir, "project.bertos"))
self._writeMakefile(os.path.join(self.maindir, "Makefile"))
# Copy the sources
self._copySources(self.sources_dir, self.srcdir)
- # Copy all the hw files
- self._writeHwFiles(self.sources_dir, self.hwdir)
# Set properly the autoenabled parameters
self._setupAutoenabledParameters()
# Copy all the configuration files
def _newCustomBertosProject(self):
# Create/write/copy the common things
self._newBertosProject()
+ # Copy the clean hw files
+ self._createDirectory(self.hwdir)
+ # Copy all the hw files
+ self._writeHwFiles(self.sources_dir, self.hwdir)
# Destination user mk file
self._writeUserMkFile(os.path.join(self.prjdir, os.path.basename(self.prjdir) + ".mk"))
# Destination main.c file
def _editBertosProject(self):
# Write the project file
self._writeProjectFile(os.path.join(self.maindir, "project.bertos"))
- # VERSION file
- self._writeVersionFile(os.path.join(self.maindir, "VERSION"))
- # Destination makefile
- self._writeMakefile(os.path.join(self.maindir, "Makefile"))
- # Merge sources
- self._mergeSources(self.sources_dir, self.srcdir, self.old_srcdir)
- # Copy all the hw files
- self._writeHwFiles(self.sources_dir, self.hwdir)
+ if not self.is_preset:
+ # Generate this files only if the project isn't a preset
+ # VERSION file
+ self._writeVersionFile(os.path.join(self.maindir, "VERSION"))
+ # Destination makefile
+ self._writeMakefile(os.path.join(self.maindir, "Makefile"))
+ # Merge sources
+ self._mergeSources(self.sources_dir, self.srcdir, self.old_srcdir)
+ # Copy all the hw files
+ self._writeHwFiles(self.sources_dir, self.hwdir)
+ # Destination wizard mk file
+ self._writeWizardMkFile(os.path.join(self.prjdir, os.path.basename(self.prjdir) + "_wiz.mk"))
# Set properly the autoenabled parameters
self._setupAutoenabledParameters()
# Copy all the configuration files
self._writeCfgFiles(self.sources_dir, self.cfgdir)
- # Destination wizard mk file
- self._writeWizardMkFile(os.path.join(self.prjdir, os.path.basename(self.prjdir) + "_wiz.mk"))
- # Create project files for selected plugins
- self._createProjectFiles()
+ if not self.is_preset:
+ # Create project files for selected plugins only if the project isn't a preset
+ self._createProjectFiles()
def _createProjectFiles(self):
# Files for selected plugins
f.close()
def _writeMakefile(self, filename):
- makefile = open(os.path.join(const.DATA_DIR, "mktemplates/Makefile"), "r").read()
- makefile = makefileGenerator(self, makefile)
- open(filename, "w").write(makefile)
+ makefileGenerator(self, filename)
def _writeUserMkFile(self, filename):
- makefile = open(os.path.join(const.DATA_DIR, "mktemplates/template.mk"), "r").read()
- # Deadly performances loss was here :(
- makefile = userMkGenerator(self, makefile)
- open(filename, "w").write(makefile)
+ userMkGenerator(self, filename)
def _writeWizardMkFile(self, filename):
- makefile = open(os.path.join(const.DATA_DIR, "mktemplates/template_wiz.mk"), "r").read()
- makefile = mkGenerator(self, makefile)
- open(filename, "w").write(makefile)
+ mkGenerator(self, filename)
def _writeMainFile(self, filename):
main = open(os.path.join(const.DATA_DIR, "srctemplates/main.c"), "r").read()
f.close()
def _writeCustomSrcFiles(self):
- preset = self.infos["PRESET_PATH"]
- preset_name = self.infos["PRESET_NAME"]
- origin = os.path.join(preset, preset_name)
- project_related_stuff = ("cfg", "hw", self.infos["PROJECT_NAME"] + "_wiz.mk") + const.IGNORE_LIST
+ origin = self.infos["PRESET_SRC_PATH"]
+ # Files to be ignored (all project files, cfg dir, wizard mk file, all global ignored dirs)
+ project_related_stuff = (
+ "cfg",
+ self.infos["PRESET_NAME"] + "_wiz.mk",
+ "project.bertos",
+ self.infos["PRESET_NAME"] + ".project",
+ self.infos["PRESET_NAME"] + ".workspace",
+ ) + const.IGNORE_LIST
for element in os.listdir(origin):
if element not in project_related_stuff:
full_path = os.path.join(origin, element)
@property
def prjdir(self):
- if self.maindir:
- return os.path.join(self.maindir, self.infos["PROJECT_NAME"])
- else:
- return None
+ return self.infos.get("PROJECT_SRC_PATH", None)
@property
def hwdir(self):
@property
def old_srcdir(self):
- return self.infos.get("OLD_SOURCES_PATH", None)
+ return self.infos.get("OLD_BERTOS_PATH", None)
@property
def sources_dir(self):
- return self.infos.get("SOURCES_PATH", None)
+ return self.infos.get("BERTOS_PATH", None)
@property
def from_preset(self):
return self.infos.get("PROJECT_FROM_PRESET", False)
+ @property
+ def is_preset(self):
+ return self.infos.get("PRESET", False)
+
def _createDirectory(self, directory):
if not directory:
return
return [(filename, dirname) for dirname in file_dict.get(filename, [])]
def findDefinitions(self, ftype):
- # Maintain a cache for every scanned SOURCES_PATH
- definitions_dict = self._cached_queries.get(self.infos["SOURCES_PATH"], {})
+ # Maintain a cache for every scanned BERTOS_PATH
+ definitions_dict = self._cached_queries.get(self.infos["BERTOS_PATH"], {})
definitions = definitions_dict.get(ftype, None)
if definitions is not None:
return definitions
if fnmatch.fnmatch(filename, ftype):
definitions += [(filename, dirname) for dirname in file_dict.get(filename, [])]
- # If no cache for the current SOURCES_PATH create an empty one
+ # If no cache for the current BERTOS_PATH create an empty one
if not definitions_dict:
- self._cached_queries[self.infos["SOURCES_PATH"]] = {}
+ self._cached_queries[self.infos["BERTOS_PATH"]] = {}
# Fill the empty cache with the result
- self._cached_queries[self.infos["SOURCES_PATH"]][ftype] = definitions
+ self._cached_queries[self.infos["BERTOS_PATH"]][ftype] = definitions
return definitions
def setEnabledModules(self, enabled_modules):