From 04bee3be57dbc3b6923f211f7e60f5b8e3bc7714 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Thu, 24 Jun 2010 16:41:33 +0200 Subject: [PATCH] change the way how loading of configs & features is controlled make it an argument of the main entry point instead of a property --- .../qt4projectmanager/qtversionmanager.cpp | 3 +- src/shared/proparser/profileevaluator.cpp | 67 +++++++++---------- src/shared/proparser/profileevaluator.h | 12 +++- 3 files changed, 42 insertions(+), 40 deletions(-) diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index ddc0dccec9a..f0e2d8fe9c9 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -1335,8 +1335,7 @@ void QtVersion::updateToolChainAndMkspec() const ProFileEvaluator evaluator(&option, &parser, &msgHandler); if (ProFile *pro = parser.parsedProFile(m_mkspecFullPath + "/qmake.conf")) { evaluator.setCumulative(false); - evaluator.setParsePreAndPostFiles(false); - evaluator.accept(pro); + evaluator.accept(pro, ProFileEvaluator::LoadProOnly); pro->deref(); } diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index f57d60e6e5a..0a7e33665e9 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -143,7 +143,8 @@ public: static ALWAYS_INLINE void skipHashStr(const ushort *&tokPtr); void skipExpression(const ushort *&tokPtr); - VisitReturn visitProFile(ProFile *pro, ProFileEvaluatorHandler::EvalFileType type); + VisitReturn visitProFile(ProFile *pro, ProFileEvaluatorHandler::EvalFileType type, + ProFileEvaluator::LoadFlags flags); VisitReturn visitProBlock(ProFile *pro, const ushort *tokPtr); VisitReturn visitProBlock(const ushort *tokPtr); VisitReturn visitProLoop(const ProString &variable, const ushort *exprPtr, @@ -177,8 +178,10 @@ public: VisitReturn evaluateConditionalFunction(const ProString &function, const ProString &arguments); VisitReturn evaluateConditionalFunction(const ProString &function, const ushort *&tokPtr); VisitReturn evaluateConditionalFunction(const ProString &function, const ProStringList &args); - bool evaluateFileDirect(const QString &fileName, ProFileEvaluatorHandler::EvalFileType type); - bool evaluateFile(const QString &fileName, ProFileEvaluatorHandler::EvalFileType type); + bool evaluateFileDirect(const QString &fileName, ProFileEvaluatorHandler::EvalFileType type, + ProFileEvaluator::LoadFlags flags); + bool evaluateFile(const QString &fileName, ProFileEvaluatorHandler::EvalFileType type, + ProFileEvaluator::LoadFlags flags); bool evaluateFeatureFile(const QString &fileName); enum EvalIntoMode { EvalProOnly, EvalWithDefaults, EvalWithSetup }; bool evaluateFileInto(const QString &fileName, ProFileEvaluatorHandler::EvalFileType type, @@ -223,7 +226,6 @@ public: QStringList m_addUserConfigCmdArgs; QStringList m_removeUserConfigCmdArgs; - bool m_parsePreAndPostFiles; ProFileOption *m_option; ProFileParser *m_parser; @@ -434,7 +436,6 @@ ProFileEvaluator::Private::Private(ProFileEvaluator *q_, ProFileOption *option, // Configuration, more or less m_cumulative = true; - m_parsePreAndPostFiles = true; // Evaluator state m_skipLevel = 0; @@ -1116,19 +1117,14 @@ void ProFileEvaluator::Private::visitProVariable( } ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::visitProFile( - ProFile *pro, ProFileEvaluatorHandler::EvalFileType type) + ProFile *pro, ProFileEvaluatorHandler::EvalFileType type, + ProFileEvaluator::LoadFlags flags) { m_handler->aboutToEval(currentProFile(), pro, type); m_profileStack.push(pro); - if (m_profileStack.count() == 1) { - // Do this only for the initial profile we visit, since - // that is *the* profile. All the other times we reach this function will be due to - // include(file) or load(file) - - if (m_parsePreAndPostFiles) { - + if (flags & LoadPreFiles) { #ifdef PROEVALUATOR_THREAD_SAFE - { + { QMutexLocker locker(&m_option->mutex); if (m_option->base_inProgress) { QThreadPool::globalInstance()->releaseThread(); @@ -1222,11 +1218,14 @@ ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::visitProFile( m_option->qmakespec = QDir::cleanPath(qmakespec); QString spec = m_option->qmakespec + QLatin1String("/qmake.conf"); - if (!evaluateFileDirect(spec, ProFileEvaluatorHandler::EvalConfigFile)) { + if (!evaluateFileDirect(spec, ProFileEvaluatorHandler::EvalConfigFile, + ProFileEvaluator::LoadProOnly)) { m_handler->configError( fL1S("Could not read qmake configuration file %1").arg(spec)); } else if (!m_option->cachefile.isEmpty()) { - evaluateFileDirect(m_option->cachefile, ProFileEvaluatorHandler::EvalConfigFile); + evaluateFileDirect(m_option->cachefile, + ProFileEvaluatorHandler::EvalConfigFile, + ProFileEvaluator::LoadProOnly); } m_option->qmakespec_name = IoUtils::fileName(m_option->qmakespec).toString(); if (m_option->qmakespec_name == QLatin1String("default")) { @@ -1264,7 +1263,7 @@ ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::visitProFile( goto fresh; } #ifdef PROEVALUATOR_THREAD_SAFE - } + } #endif m_valuemapStack.top() = m_option->base_valuemap; @@ -1280,13 +1279,11 @@ ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::visitProFile( tmp.append(ProString(add, NoHash)); foreach (const QString &remove, m_removeUserConfigCmdArgs) removeAll(&tmp, ProString(remove, NoHash)); - } } visitProBlock(pro, pro->tokPtr()); - if (m_profileStack.count() == 1) { - if (m_parsePreAndPostFiles) { + if (flags & LoadPostFiles) { evaluateFeatureFile(QLatin1String("default_post.prf")); QSet<QString> processed; @@ -1307,7 +1304,6 @@ ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::visitProFile( if (finished) break; } - } } m_profileStack.pop(); m_handler->doneWithEval(currentProFile()); @@ -2683,7 +2679,8 @@ ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::evaluateCondit fn.detach(); bool ok; if (parseInto.isEmpty()) { - ok = evaluateFile(fn, ProFileEvaluatorHandler::EvalIncludeFile); + ok = evaluateFile(fn, ProFileEvaluatorHandler::EvalIncludeFile, + ProFileEvaluator::LoadProOnly); } else { QHash<ProString, ProStringList> symbols; if ((ok = evaluateFileInto(fn, ProFileEvaluatorHandler::EvalAuxFile, @@ -2965,11 +2962,12 @@ ProStringList ProFileEvaluator::Private::values(const ProString &variableName) c } bool ProFileEvaluator::Private::evaluateFileDirect( - const QString &fileName, ProFileEvaluatorHandler::EvalFileType type) + const QString &fileName, ProFileEvaluatorHandler::EvalFileType type, + ProFileEvaluator::LoadFlags flags) { if (ProFile *pro = m_parser->parsedProFile(fileName, true)) { m_locationStack.push(m_current); - bool ok = (visitProFile(pro, type) == ReturnTrue); + bool ok = (visitProFile(pro, type, flags) == ReturnTrue); m_current = m_locationStack.pop(); pro->deref(); return ok; @@ -2979,7 +2977,8 @@ bool ProFileEvaluator::Private::evaluateFileDirect( } bool ProFileEvaluator::Private::evaluateFile( - const QString &fileName, ProFileEvaluatorHandler::EvalFileType type) + const QString &fileName, ProFileEvaluatorHandler::EvalFileType type, + ProFileEvaluator::LoadFlags flags) { if (fileName.isEmpty()) return false; @@ -2988,7 +2987,7 @@ bool ProFileEvaluator::Private::evaluateFile( evalError(fL1S("circular inclusion of %1").arg(fileName)); return false; } - return evaluateFileDirect(fileName, type); + return evaluateFileDirect(fileName, type, flags); } bool ProFileEvaluator::Private::evaluateFeatureFile(const QString &fileName) @@ -3033,7 +3032,8 @@ bool ProFileEvaluator::Private::evaluateFeatureFile(const QString &fileName) m_cumulative = false; // The path is fully normalized already. - bool ok = evaluateFileDirect(fn, ProFileEvaluatorHandler::EvalFeatureFile); + bool ok = evaluateFileDirect(fn, ProFileEvaluatorHandler::EvalFeatureFile, + ProFileEvaluator::LoadProOnly); m_cumulative = cumulative; return ok; @@ -3045,14 +3045,14 @@ bool ProFileEvaluator::Private::evaluateFileInto( { ProFileEvaluator visitor(m_option, m_parser, m_handler); visitor.d->m_cumulative = false; - visitor.d->m_parsePreAndPostFiles = (mode == EvalWithSetup); visitor.d->m_outputDir = m_outputDir; // visitor.d->m_valuemapStack.top() = *values; if (funcs) visitor.d->m_functionDefs = *funcs; if (mode == EvalWithDefaults) visitor.d->evaluateFeatureFile(QLatin1String("default_pre.prf")); - if (!visitor.d->evaluateFile(fileName, type)) + if (!visitor.d->evaluateFile(fileName, type, + (mode == EvalWithSetup) ? ProFileEvaluator::LoadAll : ProFileEvaluator::LoadProOnly)) return false; *values = visitor.d->m_valuemapStack.top(); // if (funcs) @@ -3196,9 +3196,9 @@ ProFileEvaluator::TemplateType ProFileEvaluator::templateType() const return TT_Unknown; } -bool ProFileEvaluator::accept(ProFile *pro) +bool ProFileEvaluator::accept(ProFile *pro, LoadFlags flags) { - return d->visitProFile(pro, ProFileEvaluatorHandler::EvalProjectFile); + return d->visitProFile(pro, ProFileEvaluatorHandler::EvalProjectFile, flags); } QString ProFileEvaluator::propertyValue(const QString &name) const @@ -3222,9 +3222,4 @@ void ProFileEvaluator::setConfigCommandLineArguments(const QStringList &addUserC d->m_removeUserConfigCmdArgs = removeUserConfigCmdArgs; } -void ProFileEvaluator::setParsePreAndPostFiles(bool on) -{ - d->m_parsePreAndPostFiles = on; -} - QT_END_NAMESPACE diff --git a/src/shared/proparser/profileevaluator.h b/src/shared/proparser/profileevaluator.h index f4ef0da356e..a011780e5b9 100644 --- a/src/shared/proparser/profileevaluator.h +++ b/src/shared/proparser/profileevaluator.h @@ -113,9 +113,15 @@ public: // -nocache, -cache, -spec, QMAKESPEC // -set persistent value void setConfigCommandLineArguments(const QStringList &addUserConfigCmdArgs, const QStringList &removeUserConfigCmdArgs); - void setParsePreAndPostFiles(bool on); // Default is true - bool accept(ProFile *pro); + enum LoadFlag { + LoadProOnly = 0, + LoadPreFiles = 1, + LoadPostFiles = 2, + LoadAll = LoadPreFiles|LoadPostFiles + }; + Q_DECLARE_FLAGS(LoadFlags, LoadFlag) + bool accept(ProFile *pro, LoadFlags flags = LoadAll); bool contains(const QString &variableName) const; QString value(const QString &variableName) const; @@ -133,6 +139,8 @@ private: friend struct ProFileOption; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(ProFileEvaluator::LoadFlags) + // This struct is from qmake, but we are not using everything. struct ProFileOption { -- GitLab