diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp index 12cbf8ab28b3dc4cb9fb45144bc1f4d4afd3d172..0125273668ab5de2c47d59f1cc2a74ff184b8616 100644 --- a/src/plugins/qt4projectmanager/qmakestep.cpp +++ b/src/plugins/qt4projectmanager/qmakestep.cpp @@ -179,7 +179,7 @@ bool QMakeStep::init() Qt4Project *pro = qt4BuildConfiguration()->qt4Target()->qt4Project(); QString proFile = pro->file()->fileName(); - m_tasks = qt4BuildConfiguration()->qtVersion()->reportIssues(proFile); + m_tasks = qt4BuildConfiguration()->qtVersion()->reportIssues(proFile, workingDirectory); m_scriptTemplate = pro->rootProjectNode()->projectType() == ScriptTemplate; return AbstractProcessStep::init(); diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp index 3aacc1bde2906589c0ca79e8bdfd7158b6a846b4..b999cc31d8a07f237876f9f4656903f14e5d04d6 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp @@ -341,18 +341,32 @@ void Qt4ProjectConfigWidget::updateImportLabel() } } - QString sourceDirectory = - m_buildConfiguration->target()->project()->projectDirectory(); - if (!sourceDirectory.endsWith('/')) - sourceDirectory.append('/'); - bool invalidBuildDirectory = m_buildConfiguration->shadowBuild() - && m_buildConfiguration->buildDirectory().startsWith(sourceDirectory); - - if (invalidBuildDirectory) { + QString buildDirectory = m_buildConfiguration->target()->project()->projectDirectory();; + if (m_buildConfiguration->shadowBuild()) + buildDirectory = m_buildConfiguration->buildDirectory(); + QList<ProjectExplorer::Task> issues = m_buildConfiguration->qtVersion()->reportIssues(m_buildConfiguration->target()->project()->file()->fileName(), + buildDirectory); + + if (!issues.isEmpty()) { m_ui->problemLabel->setVisible(true); m_ui->warningLabel->setVisible(true); m_ui->importLabel->setVisible(visible); - m_ui->problemLabel->setText(tr("Building in subdirectories of the source directory is not supported by qmake.")); + QString text = "<nobr>"; + foreach (const ProjectExplorer::Task &task, issues) { + QString type; + switch (task.type) { + case ProjectExplorer::Task::Error: + type = tr("Error: "); + break; + case ProjectExplorer::Task::Warning: + type = tr("Warning: "); + break; + } + if (!text.endsWith(QLatin1String("br>"))) + text.append(QLatin1String("<br>")); + text.append(type + task.description); + } + m_ui->problemLabel->setText(text); } else if (targetMatches) { m_ui->problemLabel->setVisible(false); m_ui->warningLabel->setVisible(false); diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index 02246c7c98bf24d35fe444621c0d565cd9c632ae..33b310249697363fb4c97f5d5205f6360c4e45ca 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -638,10 +638,14 @@ bool QtVersion::supportsShadowBuilds() const } QList<ProjectExplorer::Task> -QtVersion::reportIssues(const QString &proFile) +QtVersion::reportIssues(const QString &proFile, const QString &buildDir) { QList<ProjectExplorer::Task> results; + QString tmpBuildDir = buildDir; + if (!buildDir.endsWith(QChar('/'))) + tmpBuildDir.append(QChar('/')); + if (!isValid()) { //: %1: Reason for being invalid const QString msg = QCoreApplication::translate("Qt4ProjectManager::QtVersion", "The Qt version is invalid: %1").arg(invalidReason()); @@ -659,6 +663,22 @@ QtVersion::reportIssues(const QString &proFile) QLatin1String(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); } + QString sourcePath = QFileInfo(proFile).absolutePath(); + if (!sourcePath.endsWith(QChar('/'))) + sourcePath.append(QChar('/')); + + 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, QString(), -1, + QLatin1String(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + } else if (tmpBuildDir.count(QChar('/')) != sourcePath.count(QChar('/'))) { + 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, QString(), -1, + QLatin1String(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + } + QSet<QString> targets = supportedTargetIds(); if (targets.contains(Constants::S60_DEVICE_TARGET_ID) || targets.contains(Constants::S60_EMULATOR_TARGET_ID)) diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h index 6ccacad40614f1d8445f2a18031ea5d7ede8173e..3716635d140be3150784d6c370676692aac837bf 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.h +++ b/src/plugins/qt4projectmanager/qtversionmanager.h @@ -147,7 +147,7 @@ public: /// its symbian setup. /// @return a list of tasks, ordered on severity (errors first, then /// warnings and finally info items. - QList<ProjectExplorer::Task> reportIssues(const QString &proFile); + QList<ProjectExplorer::Task> reportIssues(const QString &proFile, const QString &buildDir); private: QList<QSharedPointer<ProjectExplorer::ToolChain> > toolChains() const; diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp index 91872791f90c86b0a5ff9ddb9802b0dadcc34a48..491a6a5c2b2d7e0d2bdcf1ddda493da67845e567 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp @@ -130,10 +130,20 @@ void TargetSetupPage::setImportInfos(const QList<ImportInfo> &infos) foreach (const ImportInfo &i, m_infos) { ++pos; + QString buildDir; + if (i.directory.isEmpty()) { + if (i.version->supportsShadowBuilds()) + buildDir = Qt4Target::defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(m_proFilePath), t); + else + buildDir = Qt4Project::projectDirectory(m_proFilePath); + } else { + buildDir = i.directory; + } + if (!i.version->supportsTargetId(t)) continue; QTreeWidgetItem *versionItem = new QTreeWidgetItem(targetItem); - QPair<QIcon, QString> issues = reportIssues(i.version); + QPair<QIcon, QString> issues = reportIssues(i.version, buildDir); QString toolTip = i.version->displayName(); if (!issues.second.isEmpty()) @@ -168,17 +178,9 @@ void TargetSetupPage::setImportInfos(const QList<ImportInfo> &infos) versionItem->setToolTip(1, status); // Column 2 (directory): - QString dir; - if (i.directory.isEmpty()) { - if (i.version->supportsShadowBuilds()) - dir = QDir::toNativeSeparators(Qt4Target::defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(m_proFilePath), t)); - else - dir = QDir::toNativeSeparators(Qt4Project::projectDirectory(m_proFilePath)); - } else { - dir = QDir::toNativeSeparators(i.directory); - } - versionItem->setText(2, dir); - versionItem->setToolTip(2, dir); + buildDir = QDir::toNativeSeparators(buildDir); + versionItem->setText(2, buildDir); + versionItem->setToolTip(2, buildDir); } } @@ -441,7 +443,8 @@ void TargetSetupPage::resetInfos() m_infos.clear(); } -QPair<QIcon, QString> TargetSetupPage::reportIssues(Qt4ProjectManager::QtVersion *version) +QPair<QIcon, QString> TargetSetupPage::reportIssues(Qt4ProjectManager::QtVersion *version, + const QString &buildDir) { if (m_proFilePath.isEmpty()) return qMakePair(QIcon(), QString()); @@ -450,7 +453,7 @@ QPair<QIcon, QString> TargetSetupPage::reportIssues(Qt4ProjectManager::QtVersion ->getObject<ProjectExplorer::TaskWindow>(); QTC_ASSERT(taskWindow, return qMakePair(QIcon(), QString())); - QList<ProjectExplorer::Task> issues = version->reportIssues(m_proFilePath); + QList<ProjectExplorer::Task> issues = version->reportIssues(m_proFilePath, buildDir); QString text; diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h index 27985d76227458fbb40572572ea223ca848a0122..9749422638314b5f54a120ce4578de62b3154ac4 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h @@ -121,7 +121,7 @@ private slots: private: void resetInfos(); - QPair<QIcon, QString> reportIssues(QtVersion *version); + QPair<QIcon, QString> reportIssues(QtVersion *version, const QString &buildDir); QList<ImportInfo> m_infos; bool m_preferMobile;