diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index bef480cb5524f72694054659cca01e84b0f8fe10..dfb5a89877e39e905fbfe70dfe0d08768da1e432 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -2112,24 +2112,65 @@ TargetInformation Qt4ProFileNode::targetInformation(QtSupport::ProFileReader *re if (!reader) return result; + QtSupport::ProFileReader *readerBP = 0; + QStringList builds = reader->values("BUILDS"); + QString buildTarget; + if (!builds.isEmpty()) { + QString build = builds.first(); + buildTarget = reader->value(build + ".target"); + + QHash<QString, QStringList> basevars; + QStringList basecfgs = reader->values(build + QLatin1String(".CONFIG")); + basecfgs += build; + basecfgs += "build_pass"; + basevars["BUILD_PASS"] = QStringList(build); + QStringList buildname = reader->values(build + QLatin1String(".name")); + basevars["BUILD_NAME"] = (buildname.isEmpty() ? QStringList(build) : buildname); + + readerBP = m_project->createProFileReader(this); + readerBP->setExtraVars(basevars); + readerBP->setExtraConfigs(basecfgs); + + EvalResult evalResult = EvalOk; + if (ProFile *pro = readerBP->parsedProFile(m_projectFilePath)) { + if (!readerBP->accept(pro, QMakeEvaluator::LoadAll)) + evalResult = EvalPartial; + pro->deref(); + } else { + evalResult = EvalFail; + } + + if (evalResult != EvalOk) + return result; + + reader = readerBP; + } + + // BUILD DIR result.buildDir = buildDir(); const QString baseDir = result.buildDir; // qDebug() << "base build dir is:"<<baseDir; - // Working Directory - const QString destDir = QLatin1String("DESTDIR"); - if (reader->contains(destDir)) { - //qDebug() << "reader contains destdir:" << reader->value("DESTDIR"); - result.workingDir = reader->value(destDir); - if (QDir::isRelativePath(result.workingDir)) { - result.workingDir = baseDir + QLatin1Char('/') + result.workingDir; - //qDebug() << "was relative and expanded to" << result.workingDir; - } + QString destDir; + if (reader->contains(QLatin1String("DESTDIR"))) { + destDir = reader->value(QLatin1String("DESTDIR")); + bool workingDirIsBaseDir = false; + if (destDir == buildTarget) // special case for "debug" or "release" + workingDirIsBaseDir = true; + + if (QDir::isRelativePath(destDir)) + destDir = baseDir + QLatin1Char('/') + destDir; + + if (workingDirIsBaseDir) + result.workingDir = baseDir; + else + result.workingDir = destDir; } else { - //qDebug() << "reader didn't contain DESTDIR, setting to " << baseDir; + destDir = baseDir; result.workingDir = baseDir; } + // Target result.target = reader->value(QLatin1String("TARGET")); if (result.target.isEmpty()) result.target = QFileInfo(m_projectFilePath).baseName(); @@ -2143,31 +2184,16 @@ TargetInformation Qt4ProFileNode::targetInformation(QtSupport::ProFileReader *re result.workingDir = QDir::cleanPath(result.workingDir); - QString wd = result.workingDir; - if ( (!reader->contains(destDir) || reader->value(destDir) == QLatin1String("."))) { - const QStringList configValues = reader->values(QLatin1String("CONFIG")); - if (configValues.contains(QLatin1String("debug_and_release")) - && configValues.contains(QLatin1String("debug_and_release_target"))) { - // If we don't have a destdir and debug and release is set - // then the executable is in a debug/release folder - //qDebug() << "reader has debug_and_release_target"; - - // Hmm can we find out whether it's debug or release in a saner way? - // Theoretically it's in CONFIG - QString qmakeBuildConfig = QLatin1String("release"); - ProjectExplorer::Target *target = m_project->activeTarget(); - Qt4BuildConfiguration *bc = target ? qobject_cast<Qt4BuildConfiguration *>(target->activeBuildConfiguration()) : 0; - if (!target || !bc || bc->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild) - qmakeBuildConfig = QLatin1String("debug"); - wd += QLatin1Char('/') + qmakeBuildConfig; - } - } - - result.executable = QDir::cleanPath(wd + QLatin1Char('/') + result.target); + /// should this really be in this method? + result.executable = QDir::cleanPath(destDir + QLatin1Char('/') + result.target); //qDebug() << "##### updateTarget sets:" << result.workingDir << result.executable; Utils::HostOsInfo::appendExecutableSuffix(result.executable); result.valid = true; + + if (readerBP) + m_project->destroyProFileReader(readerBP); + return result; } diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 0bedee49b6763a3f47ea167de50700667f81538d..2212a7b9fe6d687df3b10be60e26a4b5d7fb0c59 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -959,7 +959,7 @@ void Qt4Project::proFileParseError(const QString &errorMessage) Core::ICore::messageManager()->printToOutputPanePopup(errorMessage); } -QtSupport::ProFileReader *Qt4Project::createProFileReader(Qt4ProFileNode *qt4ProFileNode, Qt4BuildConfiguration *bc) +QtSupport::ProFileReader *Qt4Project::createProFileReader(const Qt4ProFileNode *qt4ProFileNode, Qt4BuildConfiguration *bc) { if (!m_qmakeGlobals) { m_qmakeGlobals = new ProFileGlobals; diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index b0c45ff4392ddb7fadf87d16e4c9e8de99f5a86e..10767cf90da16447c6a3d8b3375f219402ed8ee8 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -102,7 +102,7 @@ public: void notifyChanged(const QString &name); /// \internal - QtSupport::ProFileReader *createProFileReader(Qt4ProFileNode *qt4ProFileNode, Qt4BuildConfiguration *bc = 0); + QtSupport::ProFileReader *createProFileReader(const Qt4ProFileNode *qt4ProFileNode, Qt4BuildConfiguration *bc = 0); /// \internal ProFileGlobals *qmakeGlobals(); /// \internal diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index 0fdbac0141b4e95bfddfef0e48146c843ee86ef4..6e3b995f859232c9c6fce00a48596bb1bd53d26c 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -215,6 +215,21 @@ void ProFileEvaluator::setCumulative(bool on) } #endif +void ProFileEvaluator::setExtraVars(const QHash<QString, QStringList> &extraVars) +{ + ProValueMap map; + QHash<QString, QStringList>::const_iterator it = extraVars.constBegin(); + QHash<QString, QStringList>::const_iterator end = extraVars.constEnd(); + for ( ; it != end; ++it) + map.insert(ProKey(it.key()), ProStringList(it.value())); + d->setExtraVars(map); +} + +void ProFileEvaluator::setExtraConfigs(const QStringList &extraConfigs) +{ + d->setExtraConfigs(ProStringList(extraConfigs)); +} + void ProFileEvaluator::setOutputDir(const QString &dir) { d->m_outputDir = dir; diff --git a/src/shared/proparser/profileevaluator.h b/src/shared/proparser/profileevaluator.h index 819c9c46ddae59426722d8d26337d08c9085e584..c1a963a2ef144fdcb9e60d548054145439482b64 100644 --- a/src/shared/proparser/profileevaluator.h +++ b/src/shared/proparser/profileevaluator.h @@ -72,6 +72,8 @@ public: #ifdef PROEVALUATOR_CUMULATIVE void setCumulative(bool on); // Default is false #endif + void setExtraVars(const QHash<QString, QStringList> &extraVars); + void setExtraConfigs(const QStringList &extraConfigs); void setOutputDir(const QString &dir); // Default is empty bool loadNamedSpec(const QString &specDir, bool hostSpec); diff --git a/src/shared/proparser/qmakeevaluator.cpp b/src/shared/proparser/qmakeevaluator.cpp index 3fea77b926576285924ca6101228cfc95e54b430..663be73f582cb637e5aba679224d9303807ea8b0 100644 --- a/src/shared/proparser/qmakeevaluator.cpp +++ b/src/shared/proparser/qmakeevaluator.cpp @@ -1316,11 +1316,9 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProFile( loadDefaults(); } -#ifdef QT_BUILD_QMAKE for (ProValueMap::ConstIterator it = m_extraVars.constBegin(); it != m_extraVars.constEnd(); ++it) m_valuemapStack.first().insert(it.key(), it.value()); -#endif m_handler->aboutToEval(currentProFile(), pro, type); m_profileStack.push(pro); @@ -1332,11 +1330,9 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProFile( evaluateCommand(m_option->precmds, fL1S("(command line)")); -#ifdef QT_BUILD_QMAKE // After user configs, to override them if (!m_extraConfigs.isEmpty()) - evaluateCommand("CONFIG += " + m_extraConfigs.join(" "), fL1S("(extra configs)")); -#endif + evaluateCommand(fL1S("CONFIG += ") + m_extraConfigs.join(fL1S(" ")), fL1S("(extra configs)")); } debugMsg(1, "visiting file %s", qPrintable(pro->fileName())); @@ -1346,13 +1342,11 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProFile( if (flags & LoadPostFiles) { evaluateCommand(m_option->postcmds, fL1S("(command line -after)")); -#ifdef QT_BUILD_QMAKE // Again, to ensure the project does not mess with us. // Specifically, do not allow a project to override debug/release within a // debug_and_release build pass - it's too late for that at this point anyway. if (!m_extraConfigs.isEmpty()) - evaluateCommand("CONFIG += " + m_extraConfigs.join(" "), fL1S("(extra configs)")); -#endif + evaluateCommand(fL1S("CONFIG += ") + m_extraConfigs.join(fL1S(" ")), fL1S("(extra configs)")); evaluateFeatureFile(QLatin1String("default_post.prf")); diff --git a/src/shared/proparser/qmakeevaluator.h b/src/shared/proparser/qmakeevaluator.h index 4840591313fc50d9d0ecb33269e6a7b5fea09447..2fa84ac05c3b22c20fbd1fe8b3aeb32cd9657350 100644 --- a/src/shared/proparser/qmakeevaluator.h +++ b/src/shared/proparser/qmakeevaluator.h @@ -100,10 +100,8 @@ public: QMakeHandler *handler); ~QMakeEvaluator(); -#ifdef QT_BUILD_QMAKE void setExtraVars(const ProValueMap &extraVars) { m_extraVars = extraVars; } void setExtraConfigs(const ProStringList &extraConfigs) { m_extraConfigs = extraConfigs; } -#endif void setOutputDir(const QString &outputDir) { m_outputDir = outputDir; } ProStringList values(const ProKey &variableName) const; @@ -256,10 +254,8 @@ public: QStack<Location> m_locationStack; // All execution location changes QStack<ProFile *> m_profileStack; // Includes only -#ifdef QT_BUILD_QMAKE ProValueMap m_extraVars; ProStringList m_extraConfigs; -#endif QString m_outputDir; int m_listCount;