diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index acf75f5c61dfab64f1a1f2e7a3f82c1df7525981..3fc55c3bad1ec0343bca37e7592efb330a0134c0 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -394,7 +394,7 @@ QString CMakeProject::buildParser(BuildConfiguration *configuration) const if (!m_toolChain) return QString::null; if (m_toolChain->type() == ProjectExplorer::ToolChain::GCC - || m_toolChain->type() == ProjectExplorer::ToolChain::LinuxICC + //|| m_toolChain->type() == ProjectExplorer::ToolChain::LinuxICC || m_toolChain->type() == ProjectExplorer::ToolChain::MinGW) { return ProjectExplorer::Constants::BUILD_PARSER_GCC; } else if (m_toolChain->type() == ProjectExplorer::ToolChain::MSVC diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index c6d00f0112e32c5ad68a50e35c594305168ca7ec..f4b4ed0385d85a37bfa8160c016b108fc47ea654 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -844,7 +844,7 @@ static IDebuggerEngine *debuggerEngineForToolChain(ProjectExplorer::ToolChain::T { IDebuggerEngine *rc = 0; switch (tc) { - case ProjectExplorer::ToolChain::LinuxICC: + //case ProjectExplorer::ToolChain::LinuxICC: case ProjectExplorer::ToolChain::MinGW: case ProjectExplorer::ToolChain::GCC: rc = gdbEngine; @@ -1713,7 +1713,7 @@ bool DebuggerManager::checkDebugConfiguration(int toolChain, bool success = true; switch(toolChain) { case ProjectExplorer::ToolChain::GCC: - case ProjectExplorer::ToolChain::LinuxICC: + //case ProjectExplorer::ToolChain::LinuxICC: case ProjectExplorer::ToolChain::MinGW: case ProjectExplorer::ToolChain::WINCE: // S60 case ProjectExplorer::ToolChain::WINSCW: diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index bc7c96138b1ef0559ae04462f0160a8a9aff4de6..d6d9d0a8c10e6b322c9beee46228bf419b59f2b4 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -413,7 +413,7 @@ QString GenericProject::buildParser(BuildConfiguration *configuration) const if (m_toolChain) { switch (m_toolChain->type()) { case ProjectExplorer::ToolChain::GCC: - case ProjectExplorer::ToolChain::LinuxICC: + //case ProjectExplorer::ToolChain::LinuxICC: case ProjectExplorer::ToolChain::MinGW: return QLatin1String(ProjectExplorer::Constants::BUILD_PARSER_GCC); diff --git a/src/plugins/projectexplorer/cesdkhandler.cpp b/src/plugins/projectexplorer/cesdkhandler.cpp index 96c2b12df8de0100be2248338e8e179d84a5ca40..d0ca7202d99132ef8615d955dda7d5450d4e8bfa 100644 --- a/src/plugins/projectexplorer/cesdkhandler.cpp +++ b/src/plugins/projectexplorer/cesdkhandler.cpp @@ -56,53 +56,6 @@ CeSdkHandler::CeSdkHandler() { } -static void readMkSpec(const QString &qtpath, QString *ceSdk, QString *ceArch) -{ - QFile f(qtpath); - if (f.exists() && f.open(QIODevice::ReadOnly)) { - while (!f.atEnd()) { - QByteArray line = f.readLine(); - if (line.startsWith("CE_SDK")) { - int index = line.indexOf('='); - if (index >= 0) { - *ceSdk = line.mid(index + 1).trimmed(); - } - } else if (line.startsWith("CE_ARCH")) { - int index = line.indexOf('='); - if (index >= 0) { - *ceArch = line.mid(index + 1).trimmed(); - } - } else if (line.startsWith("include(")) { - int startIndex = line.indexOf('('); - int endIndex = line.indexOf(')'); - if (startIndex >= 0 && endIndex >= 0) { - QString path = line.mid(startIndex + 1, endIndex - startIndex - 1).trimmed(); - - int index = qtpath.lastIndexOf('/'); - if (index >= 0) - readMkSpec(qtpath.left(index + 1) + path, ceSdk, ceArch); - else - readMkSpec(path, ceSdk, ceArch); - } - } - } - } -} - -QString CeSdkHandler::platformName(const QString &qtpath) -{ - QString platformName; - QString CE_SDK; - QString CE_ARCH; - - readMkSpec(qtpath, &CE_SDK, &CE_ARCH); - - if (!CE_SDK.isEmpty() && !CE_ARCH.isEmpty()) - platformName = CE_SDK + " (" + CE_ARCH + ")"; - - return platformName; -} - bool CeSdkHandler::parse(const QString &vsdir) { // look at the file at %VCInstallDir%/vcpackages/WCE.VCPlatform.config diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp index 02608a6c2937c6ad9ce8606b38bc6a7933630e0e..eea09595cd66de10b6d471b1cb7b4d34d00eff3b 100644 --- a/src/plugins/projectexplorer/toolchain.cpp +++ b/src/plugins/projectexplorer/toolchain.cpp @@ -111,8 +111,8 @@ QString ToolChain::toolChainName(ToolChainType tc) switch (tc) { case GCC: return QCoreApplication::translate("ToolChain", "GCC"); - case LinuxICC: - return QCoreApplication::translate("ToolChain", "Intel C++ Compiler (Linux)"); +// case LinuxICC: +// return QCoreApplication::translate("ToolChain", "Intel C++ Compiler (Linux)"); case MinGW: return QCoreApplication::translate("ToolChain", "MinGW"); case MSVC: diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index 26863c0245e6ecaccd14a9ca559b4172b8ae2246..2492b5a417e919b65212d0797dffd1e2b97c8717 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -75,7 +75,7 @@ public: enum ToolChainType { GCC = 0, - LinuxICC = 1, + // LINUX_ICC = 1, MinGW = 2, MSVC = 3, WINCE = 4, diff --git a/src/plugins/qt4projectmanager/projectloadwizard.cpp b/src/plugins/qt4projectmanager/projectloadwizard.cpp index 29e518edc52b19e16921495adcbfd79975ba583b..bebf7bc27a8e1bfa52e9583fd83aa3b435ff1b5c 100644 --- a/src/plugins/qt4projectmanager/projectloadwizard.cpp +++ b/src/plugins/qt4projectmanager/projectloadwizard.cpp @@ -65,24 +65,7 @@ ProjectLoadWizard::ProjectLoadWizard(Qt4Project *project, QWidget *parent, Qt::W QPair<QtVersion::QmakeBuildConfig, QStringList> result = QtVersionManager::scanMakeFile(directory, m_importVersion->defaultBuildConfig()); m_importBuildConfig = result.first; - m_additionalArguments = result.second; - - QString versionSpec = m_importVersion->sourcePath() + "/mkspecs/" + m_importVersion->mkspec(); - QString parsedSpec = Qt4Project::extractSpecFromArgumentList(m_additionalArguments); - - // Compare mkspecs and add to additional arguments - if (parsedSpec.isEmpty()) { - // using the default spec, don't modify additional arguments - } else { - QString parsedSpecOrginal = parsedSpec; - if (QFileInfo(parsedSpec).isRelative()) - parsedSpec = QDir::cleanPath(directory + "/" + parsedSpec); - m_additionalArguments = Qt4Project::removeSpecFromArgumentList(m_additionalArguments); - if (parsedSpec != versionSpec) { - m_additionalArguments.prepend(parsedSpecOrginal); - m_additionalArguments.prepend("-spec"); - } - } + m_additionalArguments = Qt4Project::removeSpecFromArgumentList(result.second); } // So now we have the version and the configuration for that version diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp index 918f5cec7673ee075c021cc6e0e852a53c57f190..613996b81d59cb4d20d5da086932fad45363f201 100644 --- a/src/plugins/qt4projectmanager/qmakestep.cpp +++ b/src/plugins/qt4projectmanager/qmakestep.cpp @@ -62,10 +62,6 @@ QStringList QMakeStep::arguments(const QString &buildConfiguration) ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(buildConfiguration); QStringList arguments; arguments << project()->file()->fileName(); - if (!additonalArguments.contains("-spec")) { - arguments << "-spec" << m_pro->qtVersion(bc)->mkspec(); - } - arguments << "-r"; #ifdef Q_OS_WIN diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 3d80b9c0f025b976816ec940dd7c45f64d1b04ac..fbcbc531ceb4c069f6d6d301beccc8b6e0163708 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -308,8 +308,7 @@ Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) : m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)), m_fileInfo(new Qt4ProjectFile(this, fileName, this)), m_isApplication(true), - m_projectFiles(new Qt4ProjectFiles), - m_toolChain(0) + m_projectFiles(new Qt4ProjectFiles) { m_manager->registerProject(this); @@ -322,7 +321,6 @@ Qt4Project::~Qt4Project() { m_manager->unregisterProject(this); delete m_projectFiles; - delete m_toolChain; } void Qt4Project::defaultQtVersionChanged() @@ -496,17 +494,11 @@ void Qt4Project::scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFile ProjectExplorer::ToolChain *Qt4Project::toolChain(BuildConfiguration *configuration) const { - ProjectExplorer::ToolChain *tempToolChain; - tempToolChain = qtVersion(configuration)->createToolChain(toolChainType(configuration)); - if (!ProjectExplorer::ToolChain::equals(m_toolChain, tempToolChain)) { - if (m_toolChain) - delete m_toolChain; - m_toolChain = tempToolChain; - } else { - delete tempToolChain; - } - - return m_toolChain; + ToolChain::ToolChainType tct = toolChainType(configuration); + foreach(ToolChain *tc, qtVersion(configuration)->toolChains()) + if (tc->type() == tct) + return tc; + return 0; } QString Qt4Project::makeCommand(BuildConfiguration *configuration) const @@ -1009,9 +1001,8 @@ void Qt4Project::updateActiveRunConfiguration() ProjectExplorer::ToolChain::ToolChainType Qt4Project::toolChainType(BuildConfiguration *configuration) const { - const ProjectExplorer::ToolChain::ToolChainType originalType = - (ProjectExplorer::ToolChain::ToolChainType)configuration->value("ToolChain").toInt(); - ProjectExplorer::ToolChain::ToolChainType type = originalType; + ToolChain::ToolChainType originalType = ToolChain::ToolChainType(configuration->value("ToolChain").toInt()); + ToolChain::ToolChainType type = originalType; const QtVersion *version = qtVersion(configuration); if (!version->possibleToolChainTypes().contains(type)) // use default tool chain type = version->defaultToolchainType(); @@ -1233,19 +1224,6 @@ QStringList Qt4Project::removeSpecFromArgumentList(const QStringList &old) return newList; } -QString Qt4Project::extractSpecFromArgumentList(const QStringList &list) -{ - int index = list.indexOf("-spec"); - if (index == -1) - index = list.indexOf("-platform"); - if (index == -1) - return QString(); - if (index + 1 < list.length()) - return list.at(index +1); - else - return QString(); -} - // returns true if both are equal bool Qt4Project::compareBuildConfigurationToImportFrom(BuildConfiguration *configuration, const QString &workingDirectory) { @@ -1262,51 +1240,15 @@ bool Qt4Project::compareBuildConfigurationToImportFrom(BuildConfiguration *confi // now compare arguments lists // we have to compare without the spec/platform cmd argument // and compare that on its own - QString actualSpec = extractSpecFromArgumentList(qs->value(configuration->name(), "qmakeArgs").toStringList()); - if (actualSpec.isEmpty()) - actualSpec = version->mkspec(); - - // Now to convert the actualSpec to a absolute path, we go through a few hops - if (QFileInfo(actualSpec).isRelative()) { - QString path = version->sourcePath() + "/mkspecs/" + actualSpec; - if (QFileInfo(path).exists()) { - actualSpec = QDir::cleanPath(path); - } else { - path = version->versionInfo().value("QMAKE_MKSPECS") + "/" + actualSpec; - if (QFileInfo(path).exists()) { - actualSpec = QDir::cleanPath(path); - } else { - path = workingDirectory + "/" + actualSpec; - if (QFileInfo(path).exists()) - actualSpec = QDir::cleanPath(path); - } - } - } - - - QString parsedSpec = extractSpecFromArgumentList(result.second); - // if the MakeFile did not contain a mkspec, then it is the default for that qmake - if (parsedSpec.isEmpty()) - parsedSpec = version->sourcePath() + "/mkspecs/" + version->mkspec(); - if (QFileInfo(parsedSpec).isRelative()) - parsedSpec = QDir::cleanPath(workingDirectory + "/" + parsedSpec); QStringList actualArgs = removeSpecFromArgumentList(qs->value(configuration->name(), "qmakeArgs").toStringList()); QStringList parsedArgs = removeSpecFromArgumentList(result.second); - -#ifdef Q_OS_WIN - actualSpec = actualSpec.toLower(); - parsedSpec = parsedSpec.toLower(); -#endif - if (debug) { qDebug()<<"Actual args:"<<actualArgs; qDebug()<<"Parsed args:"<<parsedArgs; - qDebug()<<"Actual spec:"<<actualSpec; - qDebug()<<"Parsed spec:"<<parsedSpec; } - if (actualArgs == parsedArgs && actualSpec == parsedSpec) + if (actualArgs == parsedArgs) return true; } } diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index 597a426247c6bd52bcf2b888914f4fd8d96c10de..13c7f52fdaae176a14d9ec084a42483402e22f6c 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -198,6 +198,7 @@ public: //returns the name of the qt version, might be QString::Null, which means default qt version // qtVersion is in general the better method to use QString qtVersionName(ProjectExplorer::BuildConfiguration *configuration) const; + ProjectExplorer::ToolChain *toolChain(ProjectExplorer::BuildConfiguration *configuration) const; void setToolChainType(ProjectExplorer::BuildConfiguration *configuration, ProjectExplorer::ToolChain::ToolChainType type); ProjectExplorer::ToolChain::ToolChainType toolChainType(ProjectExplorer::BuildConfiguration *configuration) const; @@ -234,7 +235,6 @@ public: bool compareBuildConfigurationToImportFrom(ProjectExplorer::BuildConfiguration *configuration, const QString &workingDirectory); static QStringList removeSpecFromArgumentList(const QStringList &old); - static QString extractSpecFromArgumentList(const QStringList &list); signals: void targetInformationChanged(); @@ -293,8 +293,6 @@ private: QList<Qt4ProjectManager::Internal::Qt4ProFileNode *> m_proFilesForCodeModelUpdate; QMap<QString, Internal::CodeModelInfo> m_codeModelInfo; - mutable ProjectExplorer::ToolChain *m_toolChain; - friend class Qt4ProjectFile; }; diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp index 74f364880b2e531174cc13009155aab76d010a5e..cfe21ab420b29f293a389a836711d34515e952c0 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp @@ -288,17 +288,6 @@ void Qt4ProjectConfigWidget::importLabelClicked() QtVersion::QmakeBuildConfig qmakeBuildConfig = result.first; QStringList additionalArguments = result.second; - QString versionSpec = version->sourcePath() + "/mkspecs/" + version->mkspec(); - QString parsedSpec = Qt4Project::extractSpecFromArgumentList(additionalArguments); - QString parsedSpecOrginal = parsedSpec; - if (QFileInfo(parsedSpec).isRelative()) - parsedSpec = QDir::cleanPath(directory + "/" + parsedSpec); - additionalArguments = Qt4Project::removeSpecFromArgumentList(additionalArguments); - if (parsedSpec != versionSpec) { - additionalArguments.prepend(parsedSpecOrginal); - additionalArguments.prepend("-spec"); - } - // So we got all the information now apply it... m_pro->setQtVersion(bc, version->uniqueId()); // Combo box will be updated at the end diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index 3125fccddd2d6af4357078766dd48d86583bae51..51298b69f70c9f43a08dc3578cf0b836a6ef848e 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -407,6 +407,7 @@ QtVersion::QtVersion(const QString &name, const QString &qmakeCommand, int id, m_autodetectionSource(autodetectionSource), m_hasDebuggingHelper(false), m_mkspecUpToDate(false), + m_toolChainUpToDate(false), m_versionInfoUpToDate(false), m_notInstalled(false), m_defaultConfigIsDebug(true), @@ -429,6 +430,7 @@ QtVersion::QtVersion(const QString &name, const QString &qmakeCommand, m_autodetectionSource(autodetectionSource), m_hasDebuggingHelper(false), m_mkspecUpToDate(false), + m_toolChainUpToDate(false), m_versionInfoUpToDate(false), m_notInstalled(false), m_defaultConfigIsDebug(true), @@ -447,6 +449,7 @@ QtVersion::QtVersion(const QString &qmakeCommand, bool isAutodetected, const QSt m_autodetectionSource(autodetectionSource), m_hasDebuggingHelper(false), m_mkspecUpToDate(false), + m_toolChainUpToDate(false), m_versionInfoUpToDate(false), m_notInstalled(false), m_defaultConfigIsDebug(true), @@ -466,6 +469,7 @@ QtVersion::QtVersion() m_isAutodetected(false), m_hasDebuggingHelper(false), m_mkspecUpToDate(false), + m_toolChainUpToDate(false), m_versionInfoUpToDate(false), m_notInstalled(false), m_defaultConfigIsDebug(true), @@ -480,7 +484,7 @@ QtVersion::QtVersion() QtVersion::~QtVersion() { - + qDeleteAll(m_toolChains); } QString QtVersion::name() const @@ -521,13 +525,6 @@ QHash<QString,QString> QtVersion::versionInfo() const return m_versionInfo; } -QString QtVersion::qmakeCXX() const -{ - updateQMakeCXX(); - return m_qmakeCXX; -} - - void QtVersion::setName(const QString &name) { m_name = name; @@ -541,8 +538,7 @@ void QtVersion::setQMakeCommand(const QString& qmakeCommand) #endif m_designerCommand = m_linguistCommand = m_uicCommand = QString::null; m_mkspecUpToDate = false; - m_qmakeCXX = QString::null; - m_qmakeCXXUpToDate = false; + m_toolChainUpToDate = false; // TODO do i need to optimize this? m_versionInfoUpToDate = false; m_hasDebuggingHelper = !debuggingHelperLibrary().isEmpty(); @@ -940,14 +936,14 @@ void QtVersion::updateMkSpec() const QString mkspec; // no .qmake.cache so look at the default mkspec - QString mkspecPath = versionInfo().value("QMAKE_MKSPECS"); - if (mkspecPath.isEmpty()) - mkspecPath = versionInfo().value("QT_INSTALL_DATA") + "/mkspecs/default"; + m_mkspecFullPath = versionInfo().value("QMAKE_MKSPECS"); + if (m_mkspecFullPath.isEmpty()) + m_mkspecFullPath = versionInfo().value("QT_INSTALL_DATA") + "/mkspecs/default"; else - mkspecPath = mkspecPath + "/default"; -// qDebug() << "default mkspec is located at" << mkspecPath; + m_mkspecFullPath = m_mkspecFullPath + "/default"; +// qDebug() << "default mkspec is located at" << m_mkspecFullPath; #ifdef Q_OS_WIN - QFile f2(mkspecPath + "/qmake.conf"); + QFile f2(m_mkspecFullPath + "/qmake.conf"); if (f2.exists() && f2.open(QIODevice::ReadOnly)) { while (!f2.atEnd()) { QByteArray line = f2.readLine(); @@ -962,7 +958,7 @@ void QtVersion::updateMkSpec() const f2.close(); } #elif defined(Q_OS_MAC) - QFile f2(mkspecPath + "/qmake.conf"); + QFile f2(m_mkspecFullPath + "/qmake.conf"); if (f2.exists() && f2.open(QIODevice::ReadOnly)) { while (!f2.atEnd()) { QByteArray line = f2.readLine(); @@ -976,7 +972,7 @@ void QtVersion::updateMkSpec() const mkspec = "macx-g++"; } else { //resolve mkspec link - QFileInfo f3(mkspecPath); + QFileInfo f3(m_mkspecFullPath); if (f3.isSymLink()) { mkspec = f3.symLinkTarget(); } @@ -988,18 +984,14 @@ void QtVersion::updateMkSpec() const f2.close(); } #else - QFileInfo f2(mkspecPath); + QFileInfo f2(m_mkspecFullPath); if (f2.isSymLink()) { mkspec = f2.symLinkTarget(); } #endif - m_mkspecFullPath = mkspec; - int index = mkspec.lastIndexOf('/'); - if (index == -1) - index = mkspec.lastIndexOf('\\'); - QString mkspecDir = QDir(versionInfo().value("QT_INSTALL_DATA") + "/mkspecs/").canonicalPath(); - if (index >= 0 && QDir(mkspec.left(index)).canonicalPath() == mkspecDir) + int index = qMax(mkspec.lastIndexOf('/'), mkspec.lastIndexOf('\\')); + if (index >= 0) mkspec = mkspec.mid(index+1).trimmed(); m_mkspec = mkspec; @@ -1007,70 +999,6 @@ void QtVersion::updateMkSpec() const // qDebug()<<"mkspec for "<<versionInfo().value("QT_INSTALL_DATA")<<" is "<<mkspec; } -void QtVersion::updateQMakeCXX() const -{ - if (m_qmakeCXXUpToDate) - return; - ProFileReader *reader = new ProFileReader(); - reader->setCumulative(false); - reader->setParsePreAndPostFiles(false); - reader->readProFile(mkspecPath() + "/qmake.conf"); - m_qmakeCXX = reader->value("QMAKE_CXX"); - - delete reader; - m_qmakeCXXUpToDate = true; -} - -ProjectExplorer::ToolChain *QtVersion::createToolChain(ProjectExplorer::ToolChain::ToolChainType type) const -{ - ProjectExplorer::ToolChain *tempToolchain = 0; - if (type == ProjectExplorer::ToolChain::MinGW) { - QString qmake_cxx = qmakeCXX(); - ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); - //addToEnvironment(env); - env.prependOrSetPath(mingwDirectory()+"/bin"); - qmake_cxx = env.searchInPath(qmake_cxx); - tempToolchain = ProjectExplorer::ToolChain::createMinGWToolChain(qmake_cxx, mingwDirectory()); - //qDebug()<<"Mingw ToolChain"; - } else if(type == ProjectExplorer::ToolChain::MSVC) { - tempToolchain = ProjectExplorer::ToolChain::createMSVCToolChain(msvcVersion(), isQt64Bit()); - //qDebug()<<"MSVC ToolChain ("<<version->msvcVersion()<<")"; - } else if(type == ProjectExplorer::ToolChain::WINCE) { - tempToolchain = ProjectExplorer::ToolChain::createWinCEToolChain(msvcVersion(), wincePlatform()); - //qDebug()<<"WinCE ToolChain ("<<version->msvcVersion()<<","<<version->wincePlatform()<<")"; - } else if(type == ProjectExplorer::ToolChain::GCC || type == ProjectExplorer::ToolChain::LinuxICC) { - QString qmake_cxx = qmakeCXX(); - ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); - //addToEnvironment(env); - qmake_cxx = env.searchInPath(qmake_cxx); - if (qmake_cxx.isEmpty()) { - // macx-xcode mkspec resets the value of QMAKE_CXX. - // Unfortunately, we need a valid QMAKE_CXX to configure the parser. - qmake_cxx = QLatin1String("cc"); - } - tempToolchain = ProjectExplorer::ToolChain::createGccToolChain(qmake_cxx); - //qDebug()<<"GCC ToolChain ("<<qmake_cxx<<")"; -#ifdef QTCREATOR_WITH_S60 - } else if (type == ProjectExplorer::ToolChain::WINSCW) { - tempToolchain = S60Manager::instance()->createWINSCWToolChain(this); - } else if (type == ProjectExplorer::ToolChain::GCCE) { - tempToolchain = S60Manager::instance()->createGCCEToolChain(this); - } else if (type == ProjectExplorer::ToolChain::RVCT_ARMV5 - || type == ProjectExplorer::ToolChain::RVCT_ARMV6) { - tempToolchain = S60Manager::instance()->createRVCTToolChain(this, type); -#endif -#ifdef QTCREATOR_WITH_MAEMO - } else if (type == ProjectExplorer::ToolChain::GCC_MAEMO) { - tempToolchain = MaemoManager::instance()->maemoToolChain(this); -#endif - } else { - qDebug()<<"Could not create ToolChain for"<<mkspec(); - qDebug()<<"Qt Creator doesn't know about the system includes, nor the systems defines."; - } - return tempToolchain; -} - - QString QtVersion::findQtBinary(const QStringList &possibleCommands) const { const QString qtdirbin = versionInfo().value(QLatin1String("QT_INSTALL_BINS")) + QLatin1Char('/'); @@ -1134,58 +1062,98 @@ QString QtVersion::linguistCommand() const return m_linguistCommand; } +QList<ProjectExplorer::ToolChain *> QtVersion::toolChains() const +{ + updateToolChain(); + return m_toolChains; +} + QList<ProjectExplorer::ToolChain::ToolChainType> QtVersion::possibleToolChainTypes() const { - QList<ProjectExplorer::ToolChain::ToolChainType> toolChains; - if (!isValid()) - return toolChains << ProjectExplorer::ToolChain::INVALID; - const QString &spec = mkspec(); - if (spec.contains("win32-msvc") - || spec.contains(QLatin1String("win32-icc"))) { - toolChains << ProjectExplorer::ToolChain::MSVC; - } else if (spec.contains("win32-g++")) { - toolChains << ProjectExplorer::ToolChain::MinGW; - } else if (spec == QString::null) { - toolChains << ProjectExplorer::ToolChain::INVALID; - } else if (spec.contains("wince")) { - toolChains << ProjectExplorer::ToolChain::WINCE; - } else if (spec.contains("linux-icc")) { - toolChains << ProjectExplorer::ToolChain::LinuxICC; + QList<ProjectExplorer::ToolChain::ToolChainType> types; + foreach(ProjectExplorer::ToolChain *tc, toolChains()) + types << tc->type(); + return types; +} + +ProjectExplorer::ToolChain::ToolChainType QtVersion::defaultToolchainType() const +{ + const QList<ProjectExplorer::ToolChain::ToolChainType> & list = possibleToolChainTypes(); + if (list.isEmpty()) + return ProjectExplorer::ToolChain::INVALID; + return list.first(); +} + +// if none, then it's INVALID everywhere this function is called +void QtVersion::updateToolChain() const +{ + if (m_toolChainUpToDate) + return; + + qDeleteAll(m_toolChains); + + QString mkspecPath = versionInfo().value("QMAKE_MKSPECS"); + if (mkspecPath.isEmpty()) + mkspecPath = versionInfo().value("QT_INSTALL_DATA") + "/mkspecs/default"; + else + mkspecPath = mkspecPath + "/default"; + + ProFileReader *reader = new ProFileReader(); + reader->setCumulative(false); + reader->setParsePreAndPostFiles(false); + reader->readProFile(mkspecPath + "/qmake.conf"); + QString qmakeCXX = reader->value("QMAKE_CXX"); + QString makefileGenerator = reader->value("MAKEFILE_GENERATOR"); + QString ce_sdk = reader->value("CE_SDK"); + QString ce_arch = reader->value("CE_ARCH"); + QString qt_arch = reader->value("QT_ARCH"); + if (!ce_sdk.isEmpty() && !ce_arch.isEmpty()) { + QString wincePlatformName = ce_sdk + " (" + ce_arch + ")"; + m_toolChains << ProjectExplorer::ToolChain::createWinCEToolChain(msvcVersion(), wincePlatformName); + } else if (makefileGenerator == "SYMBIAN_ABLD") { #ifdef QTCREATOR_WITH_S60 - } else if (spec.contains("symbian-abld")) { - toolChains << ProjectExplorer::ToolChain::GCCE - << ProjectExplorer::ToolChain::RVCT_ARMV5 - << ProjectExplorer::ToolChain::RVCT_ARMV6 - << ProjectExplorer::ToolChain::WINSCW; + m_toolChains << S60Manager::instance()->createGCCEToolChain(this); + m_toolChains << S60Manager::instance()->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV5); + m_toolChains << S60Manager::instance()->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV6); + m_toolChains << S60Manager::instance()->createWINSCWToolChain(this); #endif + } else if (qt_arch == "arm") { #ifdef QTCREATOR_WITH_MAEMO - } else if (spec.contains("linux-g++-opengl")) { - bool maemo = false; - const QString baseDir = m_versionInfo.contains("QT_INSTALL_DATA") ? - m_versionInfo.value("QT_INSTALL_DATA") : QLatin1String(""); - QFile qconfigpri(baseDir + QLatin1String("/mkspecs/qconfig.pri")); - if (qconfigpri.exists()) { - qconfigpri.open(QIODevice::ReadOnly | QIODevice::Text); - QTextStream stream(&qconfigpri); - while (!stream.atEnd()) { - QString line = stream.readLine().trimmed(); - if (line.startsWith(QLatin1String("QT_ARCH")) - && line.endsWith(QLatin1String("arm"))) - maemo = true; - } - } - toolChains << (maemo ? ProjectExplorer::ToolChain::GCC_MAEMO - : ProjectExplorer::ToolChain::GCC); + m_toolChains << MaemoManager::instance()->maemoToolChain(this); + + ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); + //addToEnvironment(env); + qmakeCXX = env.searchInPath(qmakeCXX); + m_toolChains << ProjectExplorer::ToolChain::createGccToolChain(qmakeCXX); #endif - } else { - toolChains << ProjectExplorer::ToolChain::GCC; + } else if (qmakeCXX == "cl" || qmakeCXX == "icl") { + // TODO proper support for intel cl + m_toolChains << ProjectExplorer::ToolChain::createMSVCToolChain(msvcVersion(), isQt64Bit()); + } else if (qmakeCXX == "g++" && makefileGenerator == "MINGW") { + ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); + //addToEnvironment(env); + env.prependOrSetPath(mingwDirectory() + "/bin"); + qmakeCXX = env.searchInPath(qmakeCXX); + m_toolChains << ProjectExplorer::ToolChain::createMinGWToolChain(qmakeCXX, mingwDirectory()); + } else if (qmakeCXX == "g++" || qmakeCXX == "icc") { + ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); + //addToEnvironment(env); + qmakeCXX = env.searchInPath(qmakeCXX); + if (qmakeCXX.isEmpty()) { + // macx-xcode mkspec resets the value of QMAKE_CXX. + // Unfortunately, we need a valid QMAKE_CXX to configure the parser. + qmakeCXX = QLatin1String("cc"); + } + m_toolChains << ProjectExplorer::ToolChain::createGccToolChain(qmakeCXX); } - return toolChains; -} -ProjectExplorer::ToolChain::ToolChainType QtVersion::defaultToolchainType() const -{ - return possibleToolChainTypes().at(0); + if (m_toolChains.isEmpty()) { + qDebug()<<"Could not create ToolChain for"<<mkspecPath<<qmakeCXX; + qDebug()<<"Qt Creator doesn't know about the system includes, nor the systems defines."; + } + + delete reader; + m_toolChainUpToDate = true; } #ifdef QTCREATOR_WITH_S60 @@ -1208,6 +1176,7 @@ QString QtVersion::mingwDirectory() const void QtVersion::setMingwDirectory(const QString &directory) { m_mingwDirectory = directory; + m_toolChainUpToDate = false; } QString QtVersion::msvcVersion() const @@ -1215,15 +1184,10 @@ QString QtVersion::msvcVersion() const return m_msvcVersion; } -QString QtVersion::wincePlatform() const -{ -// qDebug()<<"QtVersion::wincePlatform returning"<<ProjectExplorer::CeSdkHandler::platformName(mkspecPath() + "/qmake.conf"); - return ProjectExplorer::CeSdkHandler::platformName(mkspecPath() + "/qmake.conf"); -} - void QtVersion::setMsvcVersion(const QString &version) { m_msvcVersion = version; + m_toolChainUpToDate = false; } void QtVersion::addToEnvironment(ProjectExplorer::Environment &env) const @@ -1346,7 +1310,8 @@ QString QtVersion::buildDebuggingHelperLibrary() addToEnvironment(env); // TODO: the debugging helper doesn't comply to actual tool chain yet - ProjectExplorer::ToolChain *tc = createToolChain(defaultToolchainType()); + QList<ProjectExplorer::ToolChain *> alltc = toolChains(); + ProjectExplorer::ToolChain *tc = alltc.isEmpty() ? 0 : alltc.first(); tc->addToEnvironment(env); QString output; QString directory = DebuggingHelperLibrary::copyDebuggingHelperLibrary(qtInstallData, &output); diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h index d79809bffe9d528174b2191ebb61a4f404a39abb..93680f7ddcc8fcd7089caf6e1cd54d0601ab3b76 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.h +++ b/src/plugins/qt4projectmanager/qtversionmanager.h @@ -36,6 +36,10 @@ #include <QtCore/QSharedPointer> #include <QtCore/QHash> +namespace ProjectExplorer { + class ToolChain; +} + namespace Qt4ProjectManager { namespace Internal { @@ -65,16 +69,21 @@ public: QString name() const; QString sourcePath() const; - QString mkspecPath() const; QString qmakeCommand() const; QString uicCommand() const; QString designerCommand() const; QString linguistCommand() const; QList<ProjectExplorer::ToolChain::ToolChainType> possibleToolChainTypes() const; - QString mkspec() const; ProjectExplorer::ToolChain::ToolChainType defaultToolchainType() const; - ProjectExplorer::ToolChain *createToolChain(ProjectExplorer::ToolChain::ToolChainType type) const; + QList<ProjectExplorer::ToolChain *> toolChains() const; + + /// @returns the name of the mkspec, which is generally not enough + /// to pass to qmake. + QString mkspec() const; + /// @returns the full path to the default directory + /// specifally not the directory the symlink/ORIGINAL_QMAKESPEC points to + QString mkspecPath() const; void setName(const QString &name); void setQMakeCommand(const QString &path); @@ -90,7 +99,6 @@ public: QString mingwDirectory() const; void setMingwDirectory(const QString &directory); QString msvcVersion() const; - QString wincePlatform() const; void setMsvcVersion(const QString &version); void addToEnvironment(ProjectExplorer::Environment &env) const; @@ -128,9 +136,8 @@ private: void updateSourcePath(); void updateMkSpec() const; void updateVersionInfo() const; - void updateQMakeCXX() const; - QString qmakeCXX() const; QString findQtBinary(const QStringList &possibleName) const; + void updateToolChain() const; QString m_name; QString m_sourcePath; QString m_mingwDirectory; @@ -147,6 +154,9 @@ private: mutable QString m_mkspec; // updated lazily mutable QString m_mkspecFullPath; + mutable bool m_toolChainUpToDate; + mutable QList<ProjectExplorer::ToolChain *> m_toolChains; + mutable bool m_versionInfoUpToDate; mutable QHash<QString,QString> m_versionInfo; // updated lazily mutable bool m_notInstalled; @@ -161,9 +171,6 @@ private: mutable QString m_uicCommand; mutable QString m_designerCommand; mutable QString m_linguistCommand; - - mutable bool m_qmakeCXXUpToDate; - mutable QString m_qmakeCXX; }; struct QMakeAssignment