Attempt to fix the "Always checked no codelite files checkbox" issue.
[bertos.git] / wizard / BProject.py
index 125a2936c51fcb0e9133ab7abe819541fe6eddd4..366e9a7525058b504d94c60c69b859df4f9b598b 100644 (file)
@@ -53,7 +53,7 @@ from bertos_utils import (
                             getCommentList, sub,
 
                             # Project creation functions
-                            projectFileGenerator, versionFileGenerator, loadPlugin, 
+                            projectFileGenerator, versionFileGenerator, loadPlugin,
                             mergeSources,
 
                             # Custom exceptions
@@ -89,7 +89,7 @@ class BProject(object):
         project_src_path = os.path.join(project_dir, project_data.get("PROJECT_SRC_PATH", project_data["PROJECT_NAME"]))
         if project_src_path:
             self.infos["PROJECT_SRC_PATH"] = project_src_path
-            
+
         else:
             # 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"])
@@ -98,9 +98,9 @@ class BProject(object):
         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["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.
@@ -162,7 +162,6 @@ class BProject(object):
         project_data = pickle.loads(open(project_file, "r").read())
         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
@@ -200,7 +199,7 @@ class BProject(object):
         """
         # NOTE: this method does nothing (for now).
         preset_path = os.path.join(self.infos["BERTOS_PATH"], const.PREDEFINED_BOARDS_DIR)
-        preset_tree = {}
+        preset_tree = {"children": []}
         if os.path.exists(preset_path):
             preset_tree = self._loadProjectPresetTree(preset_path)
         self.infos["PRESET_TREE"] = preset_tree
@@ -210,14 +209,14 @@ class BProject(object):
         _tree["info"] = self._loadPresetInfo(os.path.join(path, const.PREDEFINED_BOARD_SPEC_FILE))
         _tree["info"]["filename"] = os.path.basename(path)
         _tree["info"]["path"] = path
-        _tree["children"] = []
+        _tree["children"] = {}
         entries = set(os.listdir(path))
         for entry in entries:
             _path = os.path.join(path, entry)
             if os.path.isdir(_path):
                 sub_entries = set(os.listdir(_path))
                 if const.PREDEFINED_BOARD_SPEC_FILE in sub_entries:
-                    _tree["children"].append(self._loadProjectPresetTree(_path))
+                    _tree["children"][_path] = self._loadProjectPresetTree(_path)
         # Add into the info dict the dir type (dir/project)
         if _tree["children"]:
             _tree["info"]["type"] = "dir"
@@ -227,7 +226,10 @@ class BProject(object):
 
     def _loadPresetInfo(self, preset_spec_file):
         D = {}
-        execfile(preset_spec_file, {}, D)
+        try:
+            execfile(preset_spec_file, {}, D)
+        except IOError, e:
+            pass
         return D
 
     def loadModuleData(self, edit=False):
@@ -249,7 +251,7 @@ class BProject(object):
                         information["depends"] = ()
                     information["depends"] += (filename.split(".")[0],)
                     information["category"] = os.path.basename(path)
-                    
+
                     # Hack to remove 'bertos/' from the configuration file path.
                     #
                     # The new module information format substitute paths like 'bertos/cfg/config_file.h'
@@ -271,6 +273,9 @@ class BProject(object):
                                 configuration_info[configuration] = updateConfigurationValues(configuration_info[configuration], loadConfigurationInfos(cfg_file_path))
                             except ParseError, err:
                                 raise DefineException.ConfigurationDefineException(cfg_file_path, err.line_number, err.line)
+                            except IOError, err:
+                                # The wizard can't find the file, use the default configuration
+                                pass
                 module_info_dict.update(module_dict)
                 configuration_info_dict.update(configuration_info)
                 if to_be_parsed:
@@ -356,17 +361,13 @@ class BProject(object):
 
         # Copy all the files and dirs except cfg/hw/*.mk
         self._writeCustomSrcFiles()
-        
+
         # Copy the hw files
-        self._writeHwFiles(self.src_hwdir, self.hwdir)
+        self._writeAllPresetHwFiles(self.src_hwdir, self.hwdir)
 
         # Copyt the new *_user.mk file
         self._writeUserMkFileFromPreset()
 
-        if self.infos["EMPTY_MAIN"]:
-            # Create and empty main.c file only if the user check the box
-            self._writeMainFile(self.prjdir + "/main.c")
-
         # Create project files for selected plugins
         self._createProjectFiles()
 
@@ -402,8 +403,9 @@ class BProject(object):
         self.infos["RELEVANT_FILES"] = relevants_files
 
     def _writeVersionFile(self, filename):
-        version_file = open(os.path.join(const.DATA_DIR, "vtemplates/VERSION"), "r").read()
-        open(filename, "w").write(versionFileGenerator(self, version_file))
+        if not self.edit or self.old_srcdir:
+            version_file = open(os.path.join(const.DATA_DIR, "vtemplates/VERSION"), "r").read()
+            open(filename, "w").write(versionFileGenerator(self, version_file))
 
     def _writeProjectFile(self, filename):
         f = open(filename, "w")
@@ -429,6 +431,8 @@ class BProject(object):
     def _writeHwFiles(self, source_dir, destination_dir):
         for module, information in self.infos["MODULES"].items():
             for hwfile in information["hw"]:
+                if hwfile == "":
+                    continue
                 string = open(source_dir + "/" + hwfile, "r").read()
                 hwfile_path = destination_dir + "/" + os.path.basename(hwfile)
                 if not self.edit or not os.path.exists(hwfile_path):
@@ -436,6 +440,20 @@ class BProject(object):
                     # editing mode it copies only the files that don't exist yet
                     open(os.path.join(destination_dir,os.path.basename(hwfile)), "w").write(string)
 
+    def _writeAllPresetHwFiles(self, source_dir, destination_dir):
+        """
+        Copy all but directories contained into the preset hw directory.
+        It's needed because some presets need custom hw files not defined with
+        Wizard directives into modules...
+        """
+        source_dir = os.path.join(source_dir, "hw")
+        for f in os.listdir(source_dir):
+            abspath = os.path.join(source_dir, f)
+            if not os.path.isdir(abspath):
+                # Exlude directories from the copy!
+                hw_file = open(os.path.join(source_dir, f), 'r').read()
+                open(os.path.join(destination_dir, f), 'w').write(hw_file)
+
     def _writeCfgFiles(self, source_dir, destination_dir):
         for configuration, information in self.infos["CONFIGURATIONS"].items():
             string = open(source_dir + "/" + configuration, "r").read()