import bertos_utils
import qvariant_converter
+from toolchain_manager import ToolchainManager
+
from const import *
class BToolchainPage(BWizardPage):
self.setTitle(self.tr("Select toolchain"))
self._validation_process = None
self._valid_items = []
+ self._toolchain_manager = ToolchainManager()
## Overloaded QWizardPage methods. ##
item = QListWidgetItem(sel_toolchain)
item.setData(Qt.UserRole, qvariant_converter.convertStringDict({"path": sel_toolchain}))
self.pageContent.toolchainList.addItem(item)
- toolchains = self.toolchains()
- toolchains[sel_toolchain] = False
- self.setToolchains(toolchains)
+ self._toolchain_manager.addToolchain(sel_toolchain)
def removeToolchain(self):
"""
if self.pageContent.toolchainList.currentRow() != -1:
item = self.pageContent.toolchainList.takeItem(self.pageContent.toolchainList.currentRow())
toolchain = qvariant_converter.getStringDict(item.data(Qt.UserRole))["path"]
- toolchains = self.toolchains()
- del toolchains[toolchain]
- self.setToolchains(toolchains)
+ self._toolchain_manager.removeToolchain(toolchain)
def searchToolchain(self):
"""
"""
Fills the toolchain list with the toolchains stored in the QSettings.
"""
- toolchains = self.toolchains()
- if os.name == "nt":
- import winreg_importer
- stored_toolchains = winreg_importer.getBertosToolchains()
- for toolchain in stored_toolchains:
- toolchains[toolchain] = True
+ self.pageContent.toolchainList.clear()
+ toolchains = self._toolchain_manager.predefined_toolchains + self._toolchain_manager.toolchains
sel_toolchain = self.projectInfo("TOOLCHAIN")
- for key, value in toolchains.items():
+ for key, value in toolchains:
if os.path.exists(key):
item = QListWidgetItem(key)
- item.setData(Qt.UserRole, qvariant_converter.convertStringDict({"path": key}))
+ item_data = {"path":key}
+ if value:
+ item_data.update(value)
+ item.setData(Qt.UserRole, qvariant_converter.convertStringDict(item_data))
self.pageContent.toolchainList.addItem(item)
if sel_toolchain and sel_toolchain["path"] == key:
self.pageContent.toolchainList.setCurrentItem(item)
- if value:
+ if value is not None:
self.validateToolchain(self.pageContent.toolchainList.row(item))
def currentToolchain(self):
dir_list = self.searchDirList()
if self.pathSearch():
dir_list += [element for element in bertos_utils.getSystemPath()]
+ _toolchain_dict = self._toolchain_manager.storedToolchainDict()
toolchain_list = bertos_utils.findToolchains(dir_list)
- stored_toolchains = self.toolchains()
- for element in toolchain_list:
- if not element in stored_toolchains:
- item = QListWidgetItem(element)
- item.setData(Qt.UserRole, qvariant_converter.convertStringDict({"path": element}))
- self.pageContent.toolchainList.addItem(item)
- stored_toolchains[element] = False
- self.setToolchains(stored_toolchains)
- self.showMessage(self.tr("Toolchain search result."), self.tr("%1 toolchains founded").arg(len(stored_toolchains)))
+ for toolchain in toolchain_list:
+ self._toolchain_manager.addToolchain(toolchain, _toolchain_dict.get(toolchain, False))
+ self._populateToolchainList()
+ self.showMessage(self.tr("Toolchain search result."), self.tr("%1 toolchains founded").arg(len(self._toolchain_manager.toolchains)))
def _validItem(self, index, infos):
"""
Toolchain validation procedure.
"""
filename = qvariant_converter.getStringDict(self.pageContent.toolchainList.item(i).data(Qt.UserRole))["path"]
- valid = False
- info = {}
- # Check for the other tools of the toolchain
- for tool in TOOLCHAIN_ITEMS:
- if os.path.exists(filename.replace("gcc", tool)):
- valid = True
- else:
- valid = False
- break
- # Try to retrieve the informations about the toolchain only for the valid toolchains
- if valid:
- self._validation_process = QProcess()
- self._validation_process.start(filename, ["-v"])
- self._validation_process.waitForStarted(1000)
- if self._validation_process.waitForFinished(200):
- description = unicode(self._validation_process.readAllStandardError())
- info = bertos_utils.getToolchainInfo(description)
- if len(info) >= 4:
- valid = True
- else:
- self._validation_process.kill()
+ info = self._toolchain_manager.validateToolchain(filename)
+
# Add the item in the list with the appropriate associate data.
- if valid:
+ if info:
self._validItem(i, info)
else:
self._invalidItem(i)
- toolchains = self.toolchains()
- toolchains[filename] = True
- self.setToolchains(toolchains)
def isDefaultToolchain(self, toolchain):
"""
Returns True if the given toolchain is one of the default toolchains.
"""
- if os.name == "nt":
- import winreg_importer
- stored_toolchains = winreg_importer.getBertosToolchains()
- if toolchain["path"] in stored_toolchains:
- return True
- return False
+ return toolchain["path"] in self._toolchain_manager._predefined_toolchain_set
def disableRemoveButton(self):
"""
--- /dev/null
+#!/usr/bin/env python
+# encoding: utf-8
+#
+# This file is part of BeRTOS.
+#
+# Bertos is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# As a special exception, you may use this file as part of a free software
+# library without restriction. Specifically, if other files instantiate
+# templates or use macros or inline functions from this file, or you compile
+# this file and link it with other files to produce an executable, this
+# file does not by itself cause the resulting executable to be covered by
+# the GNU General Public License. This exception does not however
+# invalidate any other reasons why the executable file might be covered by
+# the GNU General Public License.
+#
+# Copyright 2008 Develer S.r.l. (http://www.develer.com/)
+#
+# $Id$
+#
+# Author: Lorenzo Berni <duplo@develer.com>
+#
+
+import os
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+import qvariant_converter
+from toolchain_validation import validateToolchain
+
+
+class ToolchainManager(object):
+ def __init__(self):
+ self._app_settings = QApplication.instance().settings
+
+ def validateToolchain(self, toolchain):
+ toolchains = self.storedToolchainDict()
+ if toolchain in toolchains:
+ toolchains[toolchain] = True
+ self.setStoredToolchainDict(toolchains)
+ return self._validateToolchain(toolchain)
+ elif toolchain in self._predefined_toolchain_set:
+ return self._validateToolchain(toolchain)
+ else:
+ return None
+
+ def _validateToolchain(self, toolchain):
+ """
+ Returns information about the toolchain located in path
+ "toolchain". If the toolchain is not recognized, or it doesn't
+ exists anymore a empty dict is returned.
+
+ Example of toolchain information dict:
+ {
+ "target": "arm",
+ "version": "4.0.6",
+ "build": None,
+ "configured": None,
+ "thread": None,
+ }
+ """
+ return validateToolchain(toolchain)
+
+ def addToolchain(self, toolchain, validated=False):
+ if toolchain not in self.predefined_toolchains:
+ toolchains = self.storedToolchainDict()
+ toolchains[toolchain] = validated
+ self.setStoredToolchainDict(toolchains)
+
+ def removeToolchain(self, toolchain):
+ toolchains = self.storedToolchainDict()
+ if toolchain in toolchains:
+ del toolchains[toolchain]
+ self.setStoredToolchainDict(toolchains)
+
+ def storedToolchainDict(self):
+ toolchains = self._app_settings.value("toolchains", QVariant())
+ toolchains = qvariant_converter.getBoolDict(toolchains)
+ return toolchains
+
+ def setStoredToolchainDict(self, toolchain_dict):
+ toolchains = qvariant_converter.convertBoolDict(toolchain_dict)
+ self._app_settings.setValue("toolchains", toolchains)
+
+ @property
+ def toolchains(self):
+ toolchains = []
+ toolchain_dict = self.storedToolchainDict()
+ for toolchain, validated in toolchain_dict.items():
+ if validated:
+ information = self._validateToolchain(toolchain)
+ else:
+ information = None
+ toolchains.append((toolchain, information))
+ return toolchains
+
+ @property
+ def predefined_toolchains(self):
+ toolchains = []
+ stored_toolchains = self._predefined_toolchain_set
+ for toolchain in stored_toolchains:
+ toolchains.append((toolchain, self._validateToolchain(toolchain)))
+ return toolchains
+
+ @property
+ def _predefined_toolchain_set(self):
+ stored_toolchains = set()
+ if os.name == "nt":
+ import winreg_importer
+ stored_toolchains |= set(winreg_importer.getBertosToolchains())
+ return stored_toolchains
+
+ def suitableToolchains(self, target):
+ toolchains = self.toolchains
+ suitable_toolchains = []
+ for name, info in toolchains:
+ if info and info.get('target', None) == target:
+ suitable_toolchains.append(name)
+ return suitable_toolchains
+
def validateToolchain(toolchain):
if not os.path.exists(toolchain):
- return False, {}
+ return {}
for tool in TOOLCHAIN_ITEMS:
if not os.path.exists(toolchain.replace("gcc", tool)):
- return False, {}
+ return {}
validation_process = QProcess()
validation_process.start(toolchain, ["-v"])
validation_process.waitForStarted(1000)
description = unicode(validation_process.readAllStandardError())
info = bertos_utils.getToolchainInfo(description)
if len(info) >= 4:
- return True, info
+ return info
else:
- return False, {}
+ return {}
else:
validation_process.kill()
- return False, {}
+ return {}