diff options
Diffstat (limited to 'src/plugins/qtsupport')
23 files changed, 338 insertions, 289 deletions
diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index ec781d717a..97499cfcda 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -47,6 +47,7 @@ #include <utils/persistentsettings.h> #include <utils/environment.h> +#include <utils/hostosinfo.h> #include <utils/synchronousprocess.h> #include <QDir> @@ -57,6 +58,7 @@ using namespace QtSupport; using namespace QtSupport::Internal; +using namespace Utils; static const char QTVERSIONID[] = "Id"; static const char QTVERSIONNAME[] = "Name"; @@ -163,7 +165,7 @@ int BaseQtVersion::getUniqueId() return QtVersionManager::instance()->getUniqueId(); } -BaseQtVersion::BaseQtVersion(const Utils::FileName &qmakeCommand, bool isAutodetected, const QString &autodetectionSource) +BaseQtVersion::BaseQtVersion(const FileName &qmakeCommand, bool isAutodetected, const QString &autodetectionSource) : m_id(getUniqueId()), m_isAutodetected(isAutodetected), m_autodetectionSource(autodetectionSource), @@ -203,10 +205,10 @@ BaseQtVersion::BaseQtVersion() m_hasDocumentation(false), m_qmakeIsExecutable(true) { - ctor(Utils::FileName()); + ctor(FileName()); } -void BaseQtVersion::ctor(const Utils::FileName &qmakePath) +void BaseQtVersion::ctor(const FileName &qmakePath) { m_qmakeCommand = qmakePath; m_designerCommand.clear(); @@ -224,7 +226,7 @@ BaseQtVersion::~BaseQtVersion() { } -QString BaseQtVersion::defaultDisplayName(const QString &versionString, const Utils::FileName &qmakePath, +QString BaseQtVersion::defaultDisplayName(const QString &versionString, const FileName &qmakePath, bool fromPath) { QString location; @@ -317,7 +319,7 @@ QList<ProjectExplorer::Task> BaseQtVersion::validateKit(const ProjectExplorer::K version->displayName(), qtAbiString); result << ProjectExplorer::Task(ProjectExplorer::Task::Error, - message, Utils::FileName(), -1, + message, FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); } // Abi mismatch return result; @@ -340,7 +342,7 @@ void BaseQtVersion::fromMap(const QVariantMap &map) QString string = map.value(QLatin1String(QTVERSIONQMAKEPATH)).toString(); if (string.startsWith(QLatin1Char('~'))) string.remove(0, 1).prepend(QDir::homePath()); - ctor(Utils::FileName::fromString(string)); + ctor(FileName::fromString(string)); } QVariantMap BaseQtVersion::toMap() const @@ -399,9 +401,9 @@ QStringList BaseQtVersion::warningReason() const return ret; } -ProjectExplorer::ToolChain *BaseQtVersion::preferredToolChain(const Utils::FileName &ms) const +ProjectExplorer::ToolChain *BaseQtVersion::preferredToolChain(const FileName &ms) const { - const Utils::FileName spec = ms.isEmpty() ? mkspec() : ms; + const FileName spec = ms.isEmpty() ? mkspec() : ms; QList<ProjectExplorer::ToolChain *> tcList = ProjectExplorer::ToolChainManager::instance()->toolChains(); ProjectExplorer::ToolChain *possibleTc = 0; foreach (ProjectExplorer::ToolChain *tc, tcList) { @@ -415,7 +417,7 @@ ProjectExplorer::ToolChain *BaseQtVersion::preferredToolChain(const Utils::FileN return possibleTc; } -Utils::FileName BaseQtVersion::qmakeCommand() const +FileName BaseQtVersion::qmakeCommand() const { return m_qmakeCommand; } @@ -570,10 +572,10 @@ void BaseQtVersion::updateSourcePath() const } } } - m_sourcePath = Utils::FileName::fromUserInput(sourcePath); + m_sourcePath = FileName::fromUserInput(sourcePath); } -Utils::FileName BaseQtVersion::sourcePath() const +FileName BaseQtVersion::sourcePath() const { updateSourcePath(); return m_sourcePath; @@ -652,46 +654,43 @@ QString BaseQtVersion::findQtBinary(Binaries binary) const QStringList possibleCommands; switch (binary) { case QmlScene: { -#if defined(Q_OS_WIN) - possibleCommands << QLatin1String("qmlscene.exe"); -#else - possibleCommands << QLatin1String("qmlscene"); -#endif + if (HostOsInfo::isWindowsHost()) + possibleCommands << QLatin1String("qmlscene.exe"); + else + possibleCommands << QLatin1String("qmlscene"); } case QmlViewer: { -#if defined(Q_OS_WIN) - possibleCommands << QLatin1String("qmlviewer.exe"); -#elif defined(Q_OS_MAC) - possibleCommands << QLatin1String("QMLViewer.app/Contents/MacOS/QMLViewer"); -#else - possibleCommands << QLatin1String("qmlviewer"); -#endif + if (HostOsInfo::isWindowsHost()) + possibleCommands << QLatin1String("qmlviewer.exe"); + else if (HostOsInfo::isMacHost()) + possibleCommands << QLatin1String("QMLViewer.app/Contents/MacOS/QMLViewer"); + else + possibleCommands << QLatin1String("qmlviewer"); } break; case Designer: -#if defined(Q_OS_WIN) - possibleCommands << QLatin1String("designer.exe"); -#elif defined(Q_OS_MAC) - possibleCommands << QLatin1String("Designer.app/Contents/MacOS/Designer"); -#else - possibleCommands << QLatin1String("designer"); -#endif + if (HostOsInfo::isWindowsHost()) + possibleCommands << QLatin1String("designer.exe"); + else if (HostOsInfo::isMacHost()) + possibleCommands << QLatin1String("Designer.app/Contents/MacOS/Designer"); + else + possibleCommands << QLatin1String("designer"); break; case Linguist: -#if defined(Q_OS_WIN) - possibleCommands << QLatin1String("linguist.exe"); -#elif defined(Q_OS_MAC) - possibleCommands << QLatin1String("Linguist.app/Contents/MacOS/Linguist"); -#else - possibleCommands << QLatin1String("linguist"); -#endif + if (HostOsInfo::isWindowsHost()) + possibleCommands << QLatin1String("linguist.exe"); + else if (HostOsInfo::isMacHost()) + possibleCommands << QLatin1String("Linguist.app/Contents/MacOS/Linguist"); + else + possibleCommands << QLatin1String("linguist"); break; case Uic: -#ifdef Q_OS_WIN - possibleCommands << QLatin1String("uic.exe"); -#else - possibleCommands << QLatin1String("uic-qt4") << QLatin1String("uic4") << QLatin1String("uic"); -#endif + if (HostOsInfo::isWindowsHost()) { + possibleCommands << QLatin1String("uic.exe"); + } else { + possibleCommands << QLatin1String("uic-qt4") << QLatin1String("uic4") + << QLatin1String("uic"); + } break; default: Q_ASSERT(false); @@ -726,13 +725,13 @@ void BaseQtVersion::updateMkspec() const if (m_mkspecFullPath.isEmpty()) return; - Utils::FileName baseMkspecDir = mkspecDirectoryFromVersionInfo(versionInfo()); + FileName baseMkspecDir = mkspecDirectoryFromVersionInfo(versionInfo()); if (m_mkspec.isChildOf(baseMkspecDir)) { m_mkspec = m_mkspec.relativeChildPath(baseMkspecDir); // qDebug() << "Setting mkspec to"<<mkspec; } else { - Utils::FileName sourceMkSpecPath = sourcePath().appendPath(QLatin1String("mkspecs")); + FileName sourceMkSpecPath = sourcePath().appendPath(QLatin1String("mkspecs")); if (m_mkspec.isChildOf(sourceMkSpecPath)) { m_mkspec = m_mkspec.relativeChildPath(sourceMkSpecPath); } else { @@ -750,7 +749,7 @@ void BaseQtVersion::ensureMkSpecParsed() const if (mkspecPath().isEmpty()) return; - QMakeGlobals option; + ProFileGlobals option; option.setProperties(versionInfo()); ProMessageHandler msgHandler(true); ProFileCacheManager::instance()->incRefCount(); @@ -783,22 +782,22 @@ void BaseQtVersion::parseMkSpec(ProFileEvaluator *evaluator) const m_mkspecValues.insert(declarativeBins, evaluator->value(declarativeBins)); } -Utils::FileName BaseQtVersion::mkspec() const +FileName BaseQtVersion::mkspec() const { updateMkspec(); return m_mkspec; } -Utils::FileName BaseQtVersion::mkspecFor(ProjectExplorer::ToolChain *tc) const +FileName BaseQtVersion::mkspecFor(ProjectExplorer::ToolChain *tc) const { Utils::FileName versionSpec = mkspec(); if (!tc) return versionSpec; - const QList<Utils::FileName> tcSpecList = tc->suggestedMkspecList(); + const QList<FileName> tcSpecList = tc->suggestedMkspecList(); if (tcSpecList.contains(versionSpec)) return versionSpec; - foreach (const Utils::FileName &tcSpec, tcSpecList) { + foreach (const FileName &tcSpec, tcSpecList) { if (hasMkspec(tcSpec)) return tcSpec; } @@ -806,13 +805,13 @@ Utils::FileName BaseQtVersion::mkspecFor(ProjectExplorer::ToolChain *tc) const return versionSpec; } -Utils::FileName BaseQtVersion::mkspecPath() const +FileName BaseQtVersion::mkspecPath() const { updateMkspec(); return m_mkspecFullPath; } -bool BaseQtVersion::hasMkspec(const Utils::FileName &spec) const +bool BaseQtVersion::hasMkspec(const FileName &spec) const { updateVersionInfo(); QFileInfo fi; @@ -867,7 +866,7 @@ void BaseQtVersion::updateVersionInfo() const m_hasQmlDebuggingLibrary = false; m_hasQmlObserver = false; - if (!queryQMakeVariables(qmakeCommand(), &m_versionInfo, &m_qmakeIsExecutable)) + if (!queryQMakeVariables(qmakeCommand(), qmakeRunEnvironment(), &m_versionInfo, &m_qmakeIsExecutable)) return; const QString qtInstallData = qmakeProperty("QT_INSTALL_DATA"); @@ -966,12 +965,11 @@ QString BaseQtVersion::demosPath() const QString BaseQtVersion::frameworkInstallPath() const { -#ifdef Q_OS_MAC - updateVersionInfo(); - return m_versionInfo.value(QLatin1String("QT_INSTALL_LIBS")); -#else + if (HostOsInfo::isMacHost()) { + updateVersionInfo(); + return m_versionInfo.value(QLatin1String("QT_INSTALL_LIBS")); + } return QString(); -#endif } bool BaseQtVersion::hasExamples() const @@ -994,13 +992,23 @@ QList<ProjectExplorer::HeaderPath> BaseQtVersion::systemHeaderPathes(const Proje return result; } -void BaseQtVersion::addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const +void BaseQtVersion::addToEnvironment(const ProjectExplorer::Kit *k, Environment &env) const { Q_UNUSED(k); env.set(QLatin1String("QTDIR"), QDir::toNativeSeparators(qmakeProperty("QT_HOST_DATA"))); env.prependOrSetPath(qmakeProperty("QT_HOST_BINS")); } +// Some Qt versions may require environment settings for qmake to work +// +// One such example is Blackberry which for some reason decided to always use the same +// qmake and use environment variables embedded in their mkspecs to make that point to +// the different Qt installations. +Utils::Environment BaseQtVersion::qmakeRunEnvironment() const +{ + return Utils::Environment::systemEnvironment(); +} + bool BaseQtVersion::hasGdbDebuggingHelper() const { updateVersionInfo(); @@ -1038,10 +1046,10 @@ bool BaseQtVersion::hasQmlObserver() const return m_hasQmlObserver; } -Utils::Environment BaseQtVersion::qmlToolsEnvironment() const +Environment BaseQtVersion::qmlToolsEnvironment() const { // FIXME: This seems broken! - Utils::Environment environment = Utils::Environment::systemEnvironment(); + Environment environment = Environment::systemEnvironment(); #if 0 // FIXME: Fix this! addToEnvironment(environment); #endif @@ -1127,7 +1135,7 @@ QList<ProjectExplorer::Task> BaseQtVersion::reportIssuesImpl(const QString &proF if (!isValid()) { //: %1: Reason for being invalid const QString msg = QCoreApplication::translate("Qt4ProjectManager::QtVersion", "The Qt version is invalid: %1").arg(invalidReason()); - results.append(ProjectExplorer::Task(ProjectExplorer::Task::Error, msg, Utils::FileName(), -1, + results.append(ProjectExplorer::Task(ProjectExplorer::Task::Error, msg, FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); } @@ -1137,7 +1145,7 @@ QList<ProjectExplorer::Task> BaseQtVersion::reportIssuesImpl(const QString &proF //: %1: Path to qmake executable const QString msg = QCoreApplication::translate("Qt4ProjectManager::QtVersion", "The qmake command \"%1\" was not found or is not executable.").arg(qmakeCommand().toUserOutput()); - results.append(ProjectExplorer::Task(ProjectExplorer::Task::Error, msg, Utils::FileName(), -1, + results.append(ProjectExplorer::Task(ProjectExplorer::Task::Error, msg, FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); } @@ -1148,13 +1156,13 @@ QList<ProjectExplorer::Task> BaseQtVersion::reportIssuesImpl(const QString &proF if ((tmpBuildDir.startsWith(sourcePath)) && (tmpBuildDir != sourcePath)) { const QString msg = QCoreApplication::translate("Qt4ProjectManager::QtVersion", "Qmake does not support build directories below the source directory."); - results.append(ProjectExplorer::Task(ProjectExplorer::Task::Warning, msg, Utils::FileName(), -1, + results.append(ProjectExplorer::Task(ProjectExplorer::Task::Warning, msg, FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); } else if (tmpBuildDir.count(slash) != sourcePath.count(slash) && qtVersion() < QtVersionNumber(4,8, 0)) { const QString msg = QCoreApplication::translate("Qt4ProjectManager::QtVersion", "The build directory needs to be at the same level as the source directory."); - results.append(ProjectExplorer::Task(ProjectExplorer::Task::Warning, msg, Utils::FileName(), -1, + results.append(ProjectExplorer::Task(ProjectExplorer::Task::Warning, msg, FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); } @@ -1169,23 +1177,19 @@ BaseQtVersion::reportIssues(const QString &proFile, const QString &buildDir) con return results; } -ProjectExplorer::IOutputParser *BaseQtVersion::createOutputParser() const -{ - return new ProjectExplorer::GnuMakeParser; -} - QtConfigWidget *BaseQtVersion::createConfigurationWidget() const { return 0; } -bool BaseQtVersion::queryQMakeVariables(const Utils::FileName &binary, QHash<QString, QString> *versionInfo) +bool BaseQtVersion::queryQMakeVariables(const FileName &binary, const Utils::Environment &env, + QHash<QString, QString> *versionInfo) { bool qmakeIsExecutable; - return BaseQtVersion::queryQMakeVariables(binary, versionInfo, &qmakeIsExecutable); + return BaseQtVersion::queryQMakeVariables(binary, env, versionInfo, &qmakeIsExecutable); } -static QByteArray runQmakeQuery(const Utils::FileName &binary, const Utils::Environment &env, +static QByteArray runQmakeQuery(const FileName &binary, const Environment &env, bool *isExecutable) { const int timeOutMS = 30000; // Might be slow on some machines. @@ -1200,7 +1204,7 @@ static QByteArray runQmakeQuery(const Utils::FileName &binary, const Utils::Envi return QByteArray(); } if (!process.waitForFinished(timeOutMS)) { - Utils::SynchronousProcess::stopProcess(process); + SynchronousProcess::stopProcess(process); *isExecutable = true; qWarning("Timeout running '%s' (%dms).", qPrintable(binary.toUserOutput()), timeOutMS); return QByteArray(); @@ -1215,8 +1219,8 @@ static QByteArray runQmakeQuery(const Utils::FileName &binary, const Utils::Envi return process.readAllStandardOutput(); } -bool BaseQtVersion::queryQMakeVariables(const Utils::FileName &binary, QHash<QString, QString> *versionInfo, - bool *qmakeIsExecutable) +bool BaseQtVersion::queryQMakeVariables(const FileName &binary, const Environment &env, + QHash<QString, QString> *versionInfo, bool *qmakeIsExecutable) { const QFileInfo qmake = binary.toFileInfo(); *qmakeIsExecutable = qmake.exists() && qmake.isExecutable() && !qmake.isDir(); @@ -1224,7 +1228,7 @@ bool BaseQtVersion::queryQMakeVariables(const Utils::FileName &binary, QHash<QSt return false; QByteArray output; - output = runQmakeQuery(binary, Utils::Environment::systemEnvironment(), qmakeIsExecutable); + output = runQmakeQuery(binary, env, qmakeIsExecutable); if (output.isNull() && !qmakeIsExecutable) { // Note: Don't rerun if we were able to execute the binary before. @@ -1237,9 +1241,9 @@ bool BaseQtVersion::queryQMakeVariables(const Utils::FileName &binary, QHash<QSt foreach (ProjectExplorer::ToolChain *tc, tcList) { if (!abiList.contains(tc->targetAbi())) continue; - Utils::Environment env = Utils::Environment::systemEnvironment(); - tc->addToEnvironment(env); - output = runQmakeQuery(binary, env, qmakeIsExecutable); + Environment realEnv = env; + tc->addToEnvironment(realEnv); + output = runQmakeQuery(binary, realEnv, qmakeIsExecutable); if (qmakeIsExecutable) break; } @@ -1278,19 +1282,19 @@ bool BaseQtVersion::queryQMakeVariables(const Utils::FileName &binary, QHash<QSt return true; } -Utils::FileName BaseQtVersion::mkspecDirectoryFromVersionInfo(const QHash<QString, QString> &versionInfo) +FileName BaseQtVersion::mkspecDirectoryFromVersionInfo(const QHash<QString, QString> &versionInfo) { QString dataDir = qmakeProperty(versionInfo, "QT_HOST_DATA"); if (dataDir.isEmpty()) - return Utils::FileName(); - return Utils::FileName::fromUserInput(dataDir + QLatin1String("/mkspecs")); + return FileName(); + return FileName::fromUserInput(dataDir + QLatin1String("/mkspecs")); } -Utils::FileName BaseQtVersion::mkspecFromVersionInfo(const QHash<QString, QString> &versionInfo) +FileName BaseQtVersion::mkspecFromVersionInfo(const QHash<QString, QString> &versionInfo) { - Utils::FileName baseMkspecDir = mkspecDirectoryFromVersionInfo(versionInfo); + FileName baseMkspecDir = mkspecDirectoryFromVersionInfo(versionInfo); if (baseMkspecDir.isEmpty()) - return Utils::FileName(); + return FileName(); bool qt5 = false; QString theSpec = qmakeProperty(versionInfo, "QMAKE_XSPEC"); @@ -1299,67 +1303,66 @@ Utils::FileName BaseQtVersion::mkspecFromVersionInfo(const QHash<QString, QStrin else qt5 = true; - Utils::FileName mkspecFullPath = baseMkspecDir; + FileName mkspecFullPath = baseMkspecDir; mkspecFullPath.appendPath(theSpec); // qDebug() << "default mkspec is located at" << mkspecFullPath; -#ifdef Q_OS_WIN - if (!qt5) { - QFile f2(mkspecFullPath.toString() + QLatin1String("/qmake.conf")); - if (f2.exists() && f2.open(QIODevice::ReadOnly)) { - while (!f2.atEnd()) { - QByteArray line = f2.readLine(); - if (line.startsWith("QMAKESPEC_ORIGINAL")) { - const QList<QByteArray> &temp = line.split('='); - if (temp.size() == 2) { - QString possibleFullPath = QString::fromLocal8Bit(temp.at(1).trimmed().constData()); - // We sometimes get a mix of different slash styles here... - possibleFullPath = possibleFullPath.replace(QLatin1Char('\\'), QLatin1Char('/')); - if (QFileInfo(possibleFullPath).exists()) // Only if the path exists - mkspecFullPath = Utils::FileName::fromUserInput(possibleFullPath); + if (HostOsInfo::isWindowsHost()) { + if (!qt5) { + QFile f2(mkspecFullPath.toString() + QLatin1String("/qmake.conf")); + if (f2.exists() && f2.open(QIODevice::ReadOnly)) { + while (!f2.atEnd()) { + QByteArray line = f2.readLine(); + if (line.startsWith("QMAKESPEC_ORIGINAL")) { + const QList<QByteArray> &temp = line.split('='); + if (temp.size() == 2) { + QString possibleFullPath = QString::fromLocal8Bit(temp.at(1).trimmed().constData()); + // We sometimes get a mix of different slash styles here... + possibleFullPath = possibleFullPath.replace(QLatin1Char('\\'), QLatin1Char('/')); + if (QFileInfo(possibleFullPath).exists()) // Only if the path exists + mkspecFullPath = FileName::fromUserInput(possibleFullPath); + } + break; } - break; } + f2.close(); } - f2.close(); } - } -#else -# ifdef Q_OS_MAC - QFile f2(mkspecFullPath.toString() + QLatin1String("/qmake.conf")); - if (f2.exists() && f2.open(QIODevice::ReadOnly)) { - while (!f2.atEnd()) { - QByteArray line = f2.readLine(); - if (line.startsWith("MAKEFILE_GENERATOR")) { - const QList<QByteArray> &temp = line.split('='); - if (temp.size() == 2) { - const QByteArray &value = temp.at(1); - if (value.contains("XCODE")) { - // we don't want to generate xcode projects... -// qDebug() << "default mkspec is xcode, falling back to g++"; - return baseMkspecDir.appendPath(QLatin1String("macx-g++")); + } else { + if (HostOsInfo::isMacHost()) { + QFile f2(mkspecFullPath.toString() + QLatin1String("/qmake.conf")); + if (f2.exists() && f2.open(QIODevice::ReadOnly)) { + while (!f2.atEnd()) { + QByteArray line = f2.readLine(); + if (line.startsWith("MAKEFILE_GENERATOR")) { + const QList<QByteArray> &temp = line.split('='); + if (temp.size() == 2) { + const QByteArray &value = temp.at(1); + if (value.contains("XCODE")) { + // we don't want to generate xcode projects... + // qDebug() << "default mkspec is xcode, falling back to g++"; + return baseMkspecDir.appendPath(QLatin1String("macx-g++")); + } + } + break; } } - break; + f2.close(); } } - f2.close(); - } -# endif - if (!qt5) { - //resolve mkspec link - QString rspec = mkspecFullPath.toFileInfo().readLink(); - if (!rspec.isEmpty()) - mkspecFullPath = Utils::FileName::fromUserInput( - QDir(baseMkspecDir.toString()).absoluteFilePath(rspec)); + if (!qt5) { + //resolve mkspec link + QString rspec = mkspecFullPath.toFileInfo().readLink(); + if (!rspec.isEmpty()) + mkspecFullPath = FileName::fromUserInput( + QDir(baseMkspecDir.toString()).absoluteFilePath(rspec)); + } } -#endif - return mkspecFullPath; } -Utils::FileName BaseQtVersion::qtCorePath(const QHash<QString,QString> &versionInfo, const QString &versionString) +FileName BaseQtVersion::qtCorePath(const QHash<QString,QString> &versionInfo, const QString &versionString) { QStringList dirs; dirs << qmakeProperty(versionInfo, "QT_INSTALL_LIBS") @@ -1377,7 +1380,7 @@ Utils::FileName BaseQtVersion::qtCorePath(const QHash<QString,QString> &versionI && file.startsWith(QLatin1String("QtCore")) && file.endsWith(QLatin1String(".framework"))) { // handle Framework - Utils::FileName lib(info); + FileName lib(info); lib.appendPath(file.left(file.lastIndexOf(QLatin1Char('.')))); return lib; } @@ -1393,18 +1396,18 @@ Utils::FileName BaseQtVersion::qtCorePath(const QHash<QString,QString> &versionI || file.endsWith(QString::fromLatin1(".so.") + versionString) || file.endsWith(QLatin1String(".so")) || file.endsWith(QLatin1Char('.') + versionString + QLatin1String(".dylib"))) - return Utils::FileName(info); + return FileName(info); } } } } // Return path to first static library found: if (!staticLibs.isEmpty()) - return Utils::FileName(staticLibs.at(0)); - return Utils::FileName(); + return FileName(staticLibs.at(0)); + return FileName(); } -QList<ProjectExplorer::Abi> BaseQtVersion::qtAbisFromLibrary(const Utils::FileName &coreLibrary) +QList<ProjectExplorer::Abi> BaseQtVersion::qtAbisFromLibrary(const FileName &coreLibrary) { return ProjectExplorer::Abi::abisOfBinary(coreLibrary); } diff --git a/src/plugins/qtsupport/baseqtversion.h b/src/plugins/qtsupport/baseqtversion.h index f9fc3ff573..261ff50e10 100644 --- a/src/plugins/qtsupport/baseqtversion.h +++ b/src/plugins/qtsupport/baseqtversion.h @@ -131,6 +131,7 @@ public: static QString qmakeProperty(const QHash<QString,QString> &versionInfo, const QByteArray &name); QString qmakeProperty(const QByteArray &name) const; virtual void addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const; + virtual Utils::Environment qmakeRunEnvironment() const; virtual Utils::FileName sourcePath() const; // used by QtUiCodeModelSupport @@ -185,10 +186,11 @@ public: /// warnings and finally info items. QList<ProjectExplorer::Task> reportIssues(const QString &proFile, const QString &buildDir) const; - virtual ProjectExplorer::IOutputParser *createOutputParser() const; - - static bool queryQMakeVariables(const Utils::FileName &binary, QHash<QString, QString> *versionInfo); - static bool queryQMakeVariables(const Utils::FileName &binary, QHash<QString, QString> *versionInfo, bool *qmakeIsExecutable); + static bool queryQMakeVariables(const Utils::FileName &binary, const Utils::Environment &env, + QHash<QString, QString> *versionInfo); + static bool queryQMakeVariables(const Utils::FileName &binary, const Utils::Environment &env, + QHash<QString, QString> *versionInfo, + bool *qmakeIsExecutable); static Utils::FileName mkspecDirectoryFromVersionInfo(const QHash<QString, QString> &versionInfo); static Utils::FileName mkspecFromVersionInfo(const QHash<QString, QString> &versionInfo); diff --git a/src/plugins/qtsupport/customexecutablerunconfiguration.cpp b/src/plugins/qtsupport/customexecutablerunconfiguration.cpp index a21288ca34..8848ee74cf 100644 --- a/src/plugins/qtsupport/customexecutablerunconfiguration.cpp +++ b/src/plugins/qtsupport/customexecutablerunconfiguration.cpp @@ -54,14 +54,14 @@ using namespace QtSupport; using namespace QtSupport::Internal; namespace { -const char * const CUSTOM_EXECUTABLE_ID("ProjectExplorer.CustomExecutableRunConfiguration"); - -const char * const EXECUTABLE_KEY("ProjectExplorer.CustomExecutableRunConfiguration.Executable"); -const char * const ARGUMENTS_KEY("ProjectExplorer.CustomExecutableRunConfiguration.Arguments"); -const char * const WORKING_DIRECTORY_KEY("ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory"); -const char * const USE_TERMINAL_KEY("ProjectExplorer.CustomExecutableRunConfiguration.UseTerminal"); -const char * const USER_ENVIRONMENT_CHANGES_KEY("ProjectExplorer.CustomExecutableRunConfiguration.UserEnvironmentChanges"); -const char * const BASE_ENVIRONMENT_BASE_KEY("ProjectExplorer.CustomExecutableRunConfiguration.BaseEnvironmentBase"); +const char CUSTOM_EXECUTABLE_ID[] = "ProjectExplorer.CustomExecutableRunConfiguration"; + +const char EXECUTABLE_KEY[] = "ProjectExplorer.CustomExecutableRunConfiguration.Executable"; +const char ARGUMENTS_KEY[] = "ProjectExplorer.CustomExecutableRunConfiguration.Arguments"; +const char WORKING_DIRECTORY_KEY[] = "ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory"; +const char USE_TERMINAL_KEY[] = "ProjectExplorer.CustomExecutableRunConfiguration.UseTerminal"; +const char USER_ENVIRONMENT_CHANGES_KEY[] = "ProjectExplorer.CustomExecutableRunConfiguration.UserEnvironmentChanges"; +const char BASE_ENVIRONMENT_BASE_KEY[] = "ProjectExplorer.CustomExecutableRunConfiguration.BaseEnvironmentBase"; } void CustomExecutableRunConfiguration::ctor() diff --git a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp index fbc5a159dd..2d562ab065 100644 --- a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp +++ b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp @@ -51,7 +51,7 @@ #include <QMutex> #include <QThread> #include <QMutexLocker> -#include <QWeakPointer> +#include <QPointer> #include <QWaitCondition> #include <QDir> #include <QBuffer> @@ -71,14 +71,16 @@ #include <QDeclarativeContext> #include <QDesktopServices> +using namespace Utils; + namespace QtSupport { namespace Internal { const char C_FALLBACK_ROOT[] = "ProjectsFallbackRoot"; -QWeakPointer<ExamplesListModel> &examplesModelStatic() +QPointer<ExamplesListModel> &examplesModelStatic() { - static QWeakPointer<ExamplesListModel> s_examplesModel; + static QPointer<ExamplesListModel> s_examplesModel; return s_examplesModel; } @@ -175,7 +177,7 @@ public: Q_UNUSED(size) QMutexLocker lock(&m_mutex); - QUrl url = QUrl::fromEncoded(id.toAscii()); + QUrl url = QUrl::fromEncoded(id.toLatin1()); if (!m_fetcher.asynchronousFetchData(url)) return QImage(); @@ -336,9 +338,9 @@ QString ExamplesWelcomePage::copyToAlternativeLocation(const QFileInfo& proFileI .arg(nativeProjectDir)); lay->addWidget(descrLbl, 0, 0, 1, 2); QLabel *txt = new QLabel(tr("&Location:")); - Utils::PathChooser *chooser = new Utils::PathChooser; + PathChooser *chooser = new PathChooser; txt->setBuddy(chooser); - chooser->setExpectedKind(Utils::PathChooser::ExistingDirectory); + chooser->setExpectedKind(PathChooser::ExistingDirectory); QSettings *settings = Core::ICore::settings(); chooser->setPath(settings->value(QString::fromLatin1(C_FALLBACK_ROOT), Core::DocumentManager::projectsDirectory()).toString()); @@ -367,15 +369,18 @@ QString ExamplesWelcomePage::copyToAlternativeLocation(const QFileInfo& proFileI } else { QString error; QString targetDir = destBaseDir + QLatin1Char('/') + exampleDirName; - if (Utils::FileUtils::copyRecursively(projectDir, targetDir, &error)) { + if (FileUtils::copyRecursively(FileName::fromString(projectDir), + FileName::fromString(targetDir), &error)) { // set vars to new location const QStringList::Iterator end = filesToOpen.end(); for (QStringList::Iterator it = filesToOpen.begin(); it != end; ++it) it->replace(projectDir, targetDir); foreach (const QString &dependency, dependencies) { - QString dirName = QDir(dependency).dirName(); - if (!Utils::FileUtils::copyRecursively(dependency, targetDir + QDir::separator()+ dirName, &error)) { + FileName targetFile = FileName::fromString(targetDir); + targetFile.appendPath(QDir(dependency).dirName()); + if (!FileUtils::copyRecursively(FileName::fromString(dependency), targetFile, + &error)) { QMessageBox::warning(Core::ICore::mainWindow(), tr("Cannot Copy Project"), error); // do not fail, just warn; } diff --git a/src/plugins/qtsupport/profilereader.cpp b/src/plugins/qtsupport/profilereader.cpp index c37e629a1f..5b909d5882 100644 --- a/src/plugins/qtsupport/profilereader.cpp +++ b/src/plugins/qtsupport/profilereader.cpp @@ -39,8 +39,10 @@ using namespace QtSupport; static QString format(const QString &fileName, int lineNo, const QString &msg) { - if (lineNo) + if (lineNo > 0) return QString::fromLatin1("%1(%2): %3").arg(fileName, QString::number(lineNo), msg); + else if (lineNo) + return QString::fromLatin1("%1: %3").arg(fileName, msg); else return msg; } @@ -65,7 +67,7 @@ void ProMessageHandler::fileMessage(const QString &) } -ProFileReader::ProFileReader(QMakeGlobals *option) +ProFileReader::ProFileReader(ProFileGlobals *option) : QMakeParser(ProFileCacheManager::instance()->cache(), this) , ProFileEvaluator(option, this, this) , m_ignoreLevel(0) diff --git a/src/plugins/qtsupport/profilereader.h b/src/plugins/qtsupport/profilereader.h index 0e6ca9b098..f51b71e0fd 100644 --- a/src/plugins/qtsupport/profilereader.h +++ b/src/plugins/qtsupport/profilereader.h @@ -70,7 +70,7 @@ class QTSUPPORT_EXPORT ProFileReader : public ProMessageHandler, public QMakePar Q_OBJECT public: - ProFileReader(QMakeGlobals *option); + ProFileReader(ProFileGlobals *option); ~ProFileReader(); QList<ProFile*> includeFiles() const; diff --git a/src/plugins/qtsupport/qmldumptool.cpp b/src/plugins/qtsupport/qmldumptool.cpp index 5d86596f8f..701862882e 100644 --- a/src/plugins/qtsupport/qmldumptool.cpp +++ b/src/plugins/qtsupport/qmldumptool.cpp @@ -41,6 +41,7 @@ #include <projectexplorer/runconfiguration.h> #include <utils/runextensions.h> #include <qmljs/qmljsmodelmanagerinterface.h> +#include <utils/hostosinfo.h> #include <utils/qtcassert.h> #include <QDesktopServices> #include <QCoreApplication> @@ -244,9 +245,8 @@ static QStringList sourceFileNames() files << QLatin1String("main.cpp") << QLatin1String("qmldump.pro") << QLatin1String("qmlstreamwriter.cpp") << QLatin1String("qmlstreamwriter.h") << QLatin1String("LICENSE.LGPL") << QLatin1String("LGPL_EXCEPTION.TXT"); -#ifdef Q_OS_MAC - files << QLatin1String("Info.plist"); -#endif + if (Utils::HostOsInfo::isMacHost()) + files << QLatin1String("Info.plist"); return files; } diff --git a/src/plugins/qtsupport/qtkitconfigwidget.cpp b/src/plugins/qtsupport/qtkitconfigwidget.cpp index 64b02115b7..c5a3fb033a 100644 --- a/src/plugins/qtsupport/qtkitconfigwidget.cpp +++ b/src/plugins/qtsupport/qtkitconfigwidget.cpp @@ -45,34 +45,21 @@ namespace QtSupport { namespace Internal { -QtKitConfigWidget::QtKitConfigWidget(ProjectExplorer::Kit *k, QWidget *parent) : - ProjectExplorer::KitConfigWidget(parent), - m_kit(k), - m_combo(new QComboBox), - m_manageButton(new QPushButton(this)) +QtKitConfigWidget::QtKitConfigWidget(ProjectExplorer::Kit *k) : + KitConfigWidget(k) { - setToolTip(tr("The Qt library to use for all projects using this kit.<br>" - "A Qt version is required for qmake-based projects and optional when using other build systems.")); - QHBoxLayout *layout = new QHBoxLayout(this); - layout->setMargin(0); - - m_combo->setContentsMargins(0, 0, 0, 0); - m_combo->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); - layout->addWidget(m_combo); - - m_manageButton->setContentsMargins(0, 0, 0, 0); - m_manageButton->setText(tr("Manage...")); + m_combo = new QComboBox; + m_combo->addItem(tr("None"), -1); QtVersionManager *mgr = QtVersionManager::instance(); - - // initially populate combobox: - m_combo->addItem(tr("None"), -1); QList<BaseQtVersion *> versions = mgr->validVersions(); QList<int> versionIds; foreach (BaseQtVersion *v, versions) versionIds.append(v->uniqueId()); versionsChanged(versionIds, QList<int>(), QList<int>()); + m_manageButton = new QPushButton(tr("Manage...")); + refresh(); connect(m_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(currentWasChanged(int))); @@ -87,6 +74,13 @@ QString QtKitConfigWidget::displayName() const return tr("Qt version:"); } +QString QtKitConfigWidget::toolTip() const +{ + return tr("The Qt library to use for all projects using this kit.<br>" + "A Qt version is required for qmake-based projects " + "and optional when using other build systems."); +} + void QtKitConfigWidget::makeReadOnly() { m_combo->setEnabled(false); @@ -97,6 +91,11 @@ void QtKitConfigWidget::refresh() m_combo->setCurrentIndex(findQtVersion(QtKitInformation::qtVersionId(m_kit))); } +QWidget *QtKitConfigWidget::mainWidget() const +{ + return m_combo; +} + QWidget *QtKitConfigWidget::buttonWidget() const { return m_manageButton; diff --git a/src/plugins/qtsupport/qtkitconfigwidget.h b/src/plugins/qtsupport/qtkitconfigwidget.h index 0ee01d6838..d163998df7 100644 --- a/src/plugins/qtsupport/qtkitconfigwidget.h +++ b/src/plugins/qtsupport/qtkitconfigwidget.h @@ -32,14 +32,12 @@ #include <projectexplorer/kitconfigwidget.h> -QT_FORWARD_DECLARE_CLASS(QComboBox) -QT_FORWARD_DECLARE_CLASS(QPushButton) - -namespace ProjectExplorer { class Kit; } +QT_BEGIN_NAMESPACE +class QComboBox; +class QPushButton; +QT_END_NAMESPACE namespace QtSupport { -class BaseQtVersion; - namespace Internal { class QtKitConfigWidget : public ProjectExplorer::KitConfigWidget @@ -47,14 +45,16 @@ class QtKitConfigWidget : public ProjectExplorer::KitConfigWidget Q_OBJECT public: - explicit QtKitConfigWidget(ProjectExplorer::Kit *k, QWidget *parent = 0); + explicit QtKitConfigWidget(ProjectExplorer::Kit *k); QString displayName() const; void makeReadOnly(); void refresh(); + QWidget *mainWidget() const; QWidget *buttonWidget() const; + QString toolTip() const; private slots: void versionsChanged(const QList<int> &added, const QList<int> &removed, const QList<int> &changed); @@ -64,7 +64,6 @@ private slots: private: int findQtVersion(const int id) const; - ProjectExplorer::Kit *m_kit; QComboBox *m_combo; QPushButton *m_manageButton; }; diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp index 40fef3c0aa..b742a7e6dc 100644 --- a/src/plugins/qtsupport/qtkitinformation.cpp +++ b/src/plugins/qtsupport/qtkitinformation.cpp @@ -32,6 +32,7 @@ #include "qtkitconfigwidget.h" #include "qtsupportconstants.h" #include "qtversionmanager.h" +#include "qtparser.h" #include <utils/environment.h> @@ -126,6 +127,13 @@ void QtKitInformation::addToEnvironment(const ProjectExplorer::Kit *k, Utils::En version->addToEnvironment(k, env); } +ProjectExplorer::IOutputParser *QtKitInformation::createOutputParser(const ProjectExplorer::Kit *k) const +{ + if (qtVersion(k)) + return new QtParser; + return 0; +} + int QtKitInformation::qtVersionId(const ProjectExplorer::Kit *k) { if (!k) diff --git a/src/plugins/qtsupport/qtkitinformation.h b/src/plugins/qtsupport/qtkitinformation.h index ac788e4745..508c21f246 100644 --- a/src/plugins/qtsupport/qtkitinformation.h +++ b/src/plugins/qtsupport/qtkitinformation.h @@ -61,6 +61,7 @@ public: ItemList toUserOutput(ProjectExplorer::Kit *k) const; void addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const; + ProjectExplorer::IOutputParser *createOutputParser(const ProjectExplorer::Kit *k) const; static int qtVersionId(const ProjectExplorer::Kit *k); static void setQtVersionId(ProjectExplorer::Kit *k, const int id); diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index af5d0480bc..8cfc89763d 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -48,6 +48,7 @@ #include <projectexplorer/toolchainmanager.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/projectexplorerconstants.h> +#include <utils/hostosinfo.h> #include <utils/runextensions.h> #include <QDir> @@ -616,16 +617,14 @@ static QString filterForQmakeFileDialog() for (int i = 0; i < commands.size(); ++i) { if (i) filter += QLatin1Char(' '); -#ifdef Q_OS_MAC - // work around QTBUG-7739 that prohibits filters that don't start with * - filter += QLatin1Char('*'); -#endif + if (Utils::HostOsInfo::isMacHost()) + // work around QTBUG-7739 that prohibits filters that don't start with * + filter += QLatin1Char('*'); filter += commands.at(i); -#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) - // kde bug, we need at least one wildcard character - // see QTCREATORBUG-7771 - filter += QLatin1Char('*'); -#endif + if (Utils::HostOsInfo::isAnyUnixHost() && !Utils::HostOsInfo::isMacHost()) + // kde bug, we need at least one wildcard character + // see QTCREATORBUG-7771 + filter += QLatin1Char('*'); } filter += QLatin1Char(')'); return filter; diff --git a/src/plugins/qtsupport/qtoutputformatter.cpp b/src/plugins/qtsupport/qtoutputformatter.cpp index fec46be1e5..d670d5a0bd 100644 --- a/src/plugins/qtsupport/qtoutputformatter.cpp +++ b/src/plugins/qtsupport/qtoutputformatter.cpp @@ -43,8 +43,7 @@ using namespace QtSupport; QtOutputFormatter::QtOutputFormatter(ProjectExplorer::Project *project) : OutputFormatter() - , m_qmlError(QLatin1String("^(?:\\[Qt Message\\] )?" // '[Qt Message] ' prefix (optional, on Symbian) - "(file:///.+" // file url + , m_qmlError(QLatin1String("^(file:///.+" // file url ":\\d+" // colon, line "(?::\\d+)?)" // colon, column (optional) ":")) // colon diff --git a/src/plugins/qtsupport/qtoutputformatter.h b/src/plugins/qtsupport/qtoutputformatter.h index 141c471b02..47665bd772 100644 --- a/src/plugins/qtsupport/qtoutputformatter.h +++ b/src/plugins/qtsupport/qtoutputformatter.h @@ -36,7 +36,7 @@ #include <utils/fileinprojectfinder.h> #include <QRegExp> -#include <QWeakPointer> +#include <QPointer> QT_FORWARD_DECLARE_CLASS(QTextCursor) @@ -80,7 +80,7 @@ private: mutable QRegExp m_qtAssert; mutable QRegExp m_qtAssertX; mutable QRegExp m_qtTestFail; - QWeakPointer<ProjectExplorer::Project> m_project; + QPointer<ProjectExplorer::Project> m_project; QString m_lastLine; Utils::FileInProjectFinder m_projectFinder; }; diff --git a/src/plugins/qtsupport/qtparser.cpp b/src/plugins/qtsupport/qtparser.cpp index 56d03ee547..975e84407c 100644 --- a/src/plugins/qtsupport/qtparser.cpp +++ b/src/plugins/qtsupport/qtparser.cpp @@ -41,7 +41,7 @@ using ProjectExplorer::Task; #define FILE_PATTERN "^(([A-Za-z]:)?[^:]+\\.[^:]+)" QtParser::QtParser() : - m_mocRegExp(QLatin1String(FILE_PATTERN"[:\\(](\\d+)\\)?:\\s(Warning|Error):\\s(.+)$")) + m_mocRegExp(QLatin1String(FILE_PATTERN"[:\\(](\\d+)\\)?:\\s([Ww]arning|[Ee]rror):\\s(.+)$")) { setObjectName(QLatin1String("QtParser")); m_mocRegExp.setMinimal(true); @@ -60,7 +60,7 @@ void QtParser::stdError(const QString &line) Utils::FileName::fromUserInput(m_mocRegExp.cap(1)) /* filename */, lineno, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_COMPILE)); - if (m_mocRegExp.cap(4) == QLatin1String("Warning")) + if (m_mocRegExp.cap(4).compare(QLatin1String("Warning"), Qt::CaseInsensitive) == 0) task.type = Task::Warning; emit addTask(task); return; @@ -116,6 +116,15 @@ void QtSupportPlugin::testQtOutputParser_data() "../../scriptbug/main.cpp:22: instantiated from here\n") << QList<ProjectExplorer::Task>() << QString(); + QTest::newRow("qdoc warning") + << QString::fromLatin1("/home/user/dev/qt5/qtscript/src/script/api/qscriptengine.cpp:295: warning: Can't create link to 'Object Trees & Ownership'") + << OutputParserTester::STDERR + << QString() << QString() + << (QList<ProjectExplorer::Task>() << Task(Task::Warning, + QLatin1String("Can't create link to 'Object Trees & Ownership'"), + Utils::FileName::fromUserInput(QLatin1String("/home/user/dev/qt5/qtscript/src/script/api/qscriptengine.cpp")), 295, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_COMPILE))) + << QString(); QTest::newRow("moc warning") << QString::fromLatin1("..\\untitled\\errorfile.h:0: Warning: No relevant classes found. No output generated.") << OutputParserTester::STDERR diff --git a/src/plugins/qtsupport/qtsupport.pri b/src/plugins/qtsupport/qtsupport.pri index a419733faf..e4de26c4ca 100644 --- a/src/plugins/qtsupport/qtsupport.pri +++ b/src/plugins/qtsupport/qtsupport.pri @@ -5,3 +5,4 @@ DEFINES *= QMAKE_AS_LIBRARY DEFINES *= PROPARSER_THREAD_SAFE DEFINES *= PROEVALUATOR_THREAD_SAFE DEFINES *= PROEVALUATOR_CUMULATIVE +DEFINES *= PROEVALUATOR_SETENV diff --git a/src/plugins/qtsupport/qtsupport.pro b/src/plugins/qtsupport/qtsupport.pro index c1a2ad0be6..701aa5dd0e 100644 --- a/src/plugins/qtsupport/qtsupport.pro +++ b/src/plugins/qtsupport/qtsupport.pro @@ -7,7 +7,7 @@ include(../../qtcreatorplugin.pri) include(qtsupport_dependencies.pri) DEFINES += \ QMAKE_AS_LIBRARY QMAKE_LIBRARY \ - PROPARSER_THREAD_SAFE PROEVALUATOR_THREAD_SAFE PROEVALUATOR_CUMULATIVE + PROPARSER_THREAD_SAFE PROEVALUATOR_THREAD_SAFE PROEVALUATOR_CUMULATIVE PROEVALUATOR_SETENV include(../../shared/proparser/proparser.pri) HEADERS += \ diff --git a/src/plugins/qtsupport/qtsupport.qbs b/src/plugins/qtsupport/qtsupport.qbs index e8aed6c497..d513058452 100644 --- a/src/plugins/qtsupport/qtsupport.qbs +++ b/src/plugins/qtsupport/qtsupport.qbs @@ -12,101 +12,104 @@ QtcPlugin { Depends { name: "QmlJS" } Depends { name: "cpp" } - cpp.includePaths: [ - ".", + cpp.includePaths: base.concat([ "../../shared", - "../../shared/proparser", - "..", - "../../libs", - buildDirectory - ] - cpp.defines: { - return base.concat([ - "QT_NO_CAST_FROM_ASCII", - "QT_NO_CAST_TO_ASCII", - "QMAKE_AS_LIBRARY", - "QMAKE_LIBRARY", - "PROPARSER_THREAD_SAFE", - "PROEVALUATOR_THREAD_SAFE", - "PROEVALUATOR_CUMULATIVE", - "QMAKE_BUILTIN_PRFS" - ]) + "../../shared/proparser" + ]) + + cpp.defines: base.concat([ + "QT_NO_CAST_FROM_ASCII", + "QT_NO_CAST_TO_ASCII", + "QMAKE_AS_LIBRARY", + "QMAKE_LIBRARY", + "PROPARSER_THREAD_SAFE", + "PROEVALUATOR_THREAD_SAFE", + "PROEVALUATOR_CUMULATIVE", + "QMAKE_BUILTIN_PRFS", + "PROEVALUATOR_SETENV" + ]) + + Group { + prefix: "../../shared/proparser/" + files: [ + "ioutils.cpp", + "ioutils.h", + "profileevaluator.cpp", + "profileevaluator.h", + "proitems.cpp", + "proitems.h", + "proparser.qrc", + "prowriter.cpp", + "prowriter.h", + "qmake_global.h", + "qmakebuiltins.cpp", + "qmakeevaluator.cpp", + "qmakeevaluator.h", + "qmakeevaluator_p.h", + "qmakeglobals.cpp", + "qmakeglobals.h", + "qmakeparser.cpp", + "qmakeparser.h", + ] } files: [ - "../../shared/proparser/qmakebuiltins.cpp", - "../../shared/proparser/qmakeevaluator.cpp", - "../../shared/proparser/qmakeevaluator.h", - "../../shared/proparser/qmakeevaluator_p.h", - "../../shared/proparser/qmakeglobals.cpp", - "../../shared/proparser/qmakeglobals.h", - "../../shared/proparser/qmakeparser.cpp", - "../../shared/proparser/qmakeparser.h", - "../../shared/proparser/qmake_global.h", - "../../shared/proparser/profileevaluator.cpp", - "../../shared/proparser/profileevaluator.h", - "../../shared/proparser/proitems.cpp", - "../../shared/proparser/proitems.h", - "../../shared/proparser/prowriter.cpp", - "../../shared/proparser/prowriter.h", - "../../shared/proparser/proparser.qrc", - "../../shared/proparser/ioutils.h", - "../../shared/proparser/ioutils.cpp", - "qtversioninfo.ui", - "qtversionmanager.ui", + "baseqtversion.cpp", "baseqtversion.h", + "customexecutableconfigurationwidget.cpp", + "customexecutableconfigurationwidget.h", + "customexecutablerunconfiguration.cpp", + "customexecutablerunconfiguration.h", "debugginghelper.cpp", "debugginghelper.h", "debugginghelper.ui", + "debugginghelperbuildtask.cpp", "debugginghelperbuildtask.h", + "exampleslistmodel.cpp", "exampleslistmodel.h", + "gettingstartedwelcomepage.cpp", "gettingstartedwelcomepage.h", "profilereader.cpp", "profilereader.h", + "qmldebugginglibrary.cpp", "qmldebugginglibrary.h", + "qmldumptool.cpp", "qmldumptool.h", + "qmlobservertool.cpp", "qmlobservertool.h", - "qtoptionspage.h", - "qtoutputformatter.cpp", - "qtoutputformatter.h", - "qtparser.h", "qtkitconfigwidget.cpp", "qtkitconfigwidget.h", "qtkitinformation.cpp", "qtkitinformation.h", + "qtoptionspage.cpp", + "qtoptionspage.h", + "qtoutputformatter.cpp", + "qtoutputformatter.h", + "qtparser.cpp", + "qtparser.h", "qtsupport_global.h", "qtsupportconstants.h", "qtsupportplugin.cpp", "qtsupportplugin.h", + "qtversionfactory.cpp", "qtversionfactory.h", + "qtversioninfo.ui", + "qtversionmanager.cpp", "qtversionmanager.h", + "qtversionmanager.ui", "screenshotcropper.cpp", "screenshotcropper.h", "showbuildlog.ui", - "baseqtversion.cpp", - "customexecutableconfigurationwidget.cpp", - "customexecutableconfigurationwidget.h", - "customexecutablerunconfiguration.cpp", - "customexecutablerunconfiguration.h", - "debugginghelperbuildtask.cpp", - "exampleslistmodel.cpp", - "gettingstartedwelcomepage.cpp", - "qmldebugginglibrary.cpp", - "qmldumptool.cpp", - "qmlobservertool.cpp", - "qtoptionspage.cpp", - "qtparser.cpp", - "qtversionfactory.cpp", - "qtversionmanager.cpp" ] ProductModule { Depends { name: "cpp" } - cpp.includePaths: [ "../../shared" ] + cpp.includePaths: "../../shared" cpp.defines: [ "QMAKE_AS_LIBRARY", "PROEVALUATOR_THREAD_SAFE", - "QMAKE_BUILTIN_PRFS" + "QMAKE_BUILTIN_PRFS", + "PROEVALUATOR_SETENV" ] } } diff --git a/src/plugins/qtsupport/qtsupportplugin.cpp b/src/plugins/qtsupport/qtsupportplugin.cpp index 1b773d1215..08007f9d45 100644 --- a/src/plugins/qtsupport/qtsupportplugin.cpp +++ b/src/plugins/qtsupport/qtsupportplugin.cpp @@ -38,12 +38,19 @@ #include "gettingstartedwelcomepage.h" +#include <coreplugin/variablemanager.h> #include <extensionsystem/pluginmanager.h> #include <projectexplorer/kitmanager.h> +#include <projectexplorer/project.h> +#include <projectexplorer/projectexplorer.h> +#include <projectexplorer/target.h> #include <QtPlugin> #include <QMenu> +static const char kHostBins[] = "CurrentProject:QT_HOST_BINS"; +static const char kInstallBins[] = "CurrentProject:QT_INSTALL_BINS"; + using namespace QtSupport; using namespace QtSupport::Internal; @@ -81,6 +88,15 @@ bool QtSupportPlugin::initialize(const QStringList &arguments, QString *errorMes void QtSupportPlugin::extensionsInitialized() { + Core::VariableManager *vm = Core::VariableManager::instance(); + vm->registerVariable(kHostBins, + tr("Full path to the host bin directory of the current project's Qt version.")); + vm->registerVariable(kInstallBins, + tr("Full path to the target bin directory of the current project's Qt version." + " You probably want %1 instead.").arg(QString::fromLatin1(kHostBins))); + connect(vm, SIGNAL(variableUpdateRequested(QByteArray)), + this, SLOT(updateVariable(QByteArray))); + QtVersionManager::instance()->extensionsInitialized(); ProjectExplorer::KitManager::instance()->registerKitInformation(new QtKitInformation); } @@ -90,4 +106,25 @@ bool QtSupportPlugin::delayedInitialize() return QtVersionManager::instance()->delayedInitialize(); } +void QtSupportPlugin::updateVariable(const QByteArray &variable) +{ + if (variable != kHostBins && variable != kInstallBins) + return; + + ProjectExplorer::Project *project = ProjectExplorer::ProjectExplorerPlugin::currentProject(); + if (!project || !project->activeTarget()) { + Core::VariableManager::instance()->remove(variable); + return; + } + + const BaseQtVersion *qtVersion = QtKitInformation::qtVersion(project->activeTarget()->kit()); + if (!qtVersion) { + Core::VariableManager::instance()->remove(variable); + return; + } + + QString value = qtVersion->qmakeProperty(variable == kHostBins ? "QT_HOST_BINS" : "QT_INSTALL_BINS"); + Core::VariableManager::instance()->insert(variable, value); +} + Q_EXPORT_PLUGIN(QtSupportPlugin) diff --git a/src/plugins/qtsupport/qtsupportplugin.h b/src/plugins/qtsupport/qtsupportplugin.h index b529c5335a..8a5a24eb79 100644 --- a/src/plugins/qtsupport/qtsupportplugin.h +++ b/src/plugins/qtsupport/qtsupportplugin.h @@ -49,6 +49,8 @@ public: bool delayedInitialize(); private slots: + void updateVariable(const QByteArray &variable); + #ifdef WITH_TESTS void testQtOutputParser_data(); void testQtOutputParser(); diff --git a/src/plugins/qtsupport/qtversionfactory.cpp b/src/plugins/qtsupport/qtversionfactory.cpp index f5422d4b82..a0287bb5b8 100644 --- a/src/plugins/qtsupport/qtversionfactory.cpp +++ b/src/plugins/qtsupport/qtversionfactory.cpp @@ -33,6 +33,8 @@ #include "baseqtversion.h" #include <extensionsystem/pluginmanager.h> +#include <utils/environment.h> + #include <QSettings> using namespace QtSupport; @@ -57,12 +59,13 @@ bool sortByPriority(QtVersionFactory *a, QtVersionFactory *b) BaseQtVersion *QtVersionFactory::createQtVersionFromQMakePath(const Utils::FileName &qmakePath, bool isAutoDetected, const QString &autoDetectionSource) { QHash<QString, QString> versionInfo; - bool success = BaseQtVersion::queryQMakeVariables(qmakePath, &versionInfo); + Utils::Environment env = Utils::Environment::systemEnvironment(); + bool success = BaseQtVersion::queryQMakeVariables(qmakePath, env, &versionInfo); if (!success) return 0; Utils::FileName mkspec = BaseQtVersion::mkspecFromVersionInfo(versionInfo); - QMakeGlobals globals; + ProFileGlobals globals; globals.setProperties(versionInfo); ProMessageHandler msgHandler(true); ProFileCacheManager::instance()->incRefCount(); diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index a229e3d570..6159000963 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -473,20 +473,6 @@ bool QtVersionManager::isValidId(int id) const return m_versions.contains(id); } -QString QtVersionManager::popPendingMwcUpdate() -{ - if (m_pendingMwcUpdates.isEmpty()) - return QString(); - return m_pendingMwcUpdates.takeFirst(); -} - -QString QtVersionManager::popPendingGcceUpdate() -{ - if (m_pendingGcceUpdates.isEmpty()) - return QString(); - return m_pendingGcceUpdates.takeFirst(); -} - Core::FeatureSet QtVersionManager::availableFeatures(const QString &platformName) const { Core::FeatureSet features; diff --git a/src/plugins/qtsupport/qtversionmanager.h b/src/plugins/qtsupport/qtversionmanager.h index d391c83323..ea8db4d339 100644 --- a/src/plugins/qtsupport/qtversionmanager.h +++ b/src/plugins/qtsupport/qtversionmanager.h @@ -91,10 +91,6 @@ public: static Utils::FileName findQMakeBinaryFromMakefile(const QString &directory); bool isValidId(int id) const; - // Compatibility with pre-2.2: - QString popPendingMwcUpdate(); - QString popPendingGcceUpdate(); - Core::FeatureSet availableFeatures(const QString &platformName) const; QStringList availablePlatforms() const; QString displayNameForPlatform(const QString &string) const; @@ -122,7 +118,6 @@ private: static BaseQtVersion::QmakeBuildConfigs qmakeBuildConfigFromCmdArgs(QList<QMakeAssignment> *assignments, BaseQtVersion::QmakeBuildConfigs defaultBuildConfig); bool restoreQtVersions(); - bool legacyRestore(); void findSystemQt(); void saveQtVersions(); void updateDocumentation(); @@ -140,10 +135,6 @@ private: // managed by QtProjectManagerPlugin static QtVersionManager *m_self; - // Compatibility with pre-2.2: - QStringList m_pendingMwcUpdates; - QStringList m_pendingGcceUpdates; - Utils::FileSystemWatcher *m_configFileWatcher; QTimer *m_fileWatcherTimer; Utils::PersistentSettingsWriter *m_writer; |