From 4adc1012e19f5e12ab2fb96effc9ea88d2a05eda Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 3 Feb 2017 18:12:52 +0100 Subject: add a bunch of complementary options to -after in particular, -before (just for symmetry, as it's the default), -early (the actual objective), and -late (for symmetry again). Change-Id: I274303582a348b052c3e5106ff360ab4fd7d4ee2 Reviewed-by: Joerg Bornemann --- qmake/generators/projectgenerator.cpp | 8 ++++---- qmake/generators/win32/msvc_vcproj.cpp | 6 +++--- qmake/library/qmakeevaluator.cpp | 12 +++++++++--- qmake/library/qmakeglobals.cpp | 33 ++++++++++++++++----------------- qmake/library/qmakeglobals.h | 13 ++++++++----- qmake/option.cpp | 14 ++++++++++---- 6 files changed, 50 insertions(+), 36 deletions(-) (limited to 'qmake') diff --git a/qmake/generators/projectgenerator.cpp b/qmake/generators/projectgenerator.cpp index e45217cb45..3f6af8fc08 100644 --- a/qmake/generators/projectgenerator.cpp +++ b/qmake/generators/projectgenerator.cpp @@ -326,8 +326,8 @@ ProjectGenerator::writeMakefile(QTextStream &t) t << "######################################################################" << endl; t << "# Automatically generated by qmake (" QMAKE_VERSION_STR ") " << QDateTime::currentDateTime().toString() << endl; t << "######################################################################" << endl << endl; - if (!Option::globals->precmds.isEmpty()) - t << Option::globals->precmds << endl; + if (!Option::globals->extra_cmds[QMakeEvalBefore].isEmpty()) + t << Option::globals->extra_cmds[QMakeEvalBefore] << endl; t << getWritableVar("TEMPLATE_ASSIGN", false); if(project->first("TEMPLATE_ASSIGN") == "subdirs") { t << endl << "# Directories" << "\n" @@ -353,8 +353,8 @@ ProjectGenerator::writeMakefile(QTextStream &t) << getWritableVar("RESOURCES") << getWritableVar("TRANSLATIONS"); } - if (!Option::globals->postcmds.isEmpty()) - t << Option::globals->postcmds << endl; + if (!Option::globals->extra_cmds[QMakeEvalAfter].isEmpty()) + t << Option::globals->extra_cmds[QMakeEvalAfter] << endl; return true; } diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index ef4e9f29b6..a7312d0124 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -664,8 +664,8 @@ void VcprojGenerator::writeSubDirs(QTextStream &t) // Make sure that all temp projects are configured // for release so that the depends are created // without the debug dxxx.lib name mangling - QString old_after_vars = Option::globals->postcmds; - Option::globals->postcmds.append("\nCONFIG+=release"); + QString old_after_vars = Option::globals->extra_cmds[QMakeEvalAfter]; + Option::globals->extra_cmds[QMakeEvalAfter].append("\nCONFIG+=release"); QHash profileLookup; QHash projGuids; @@ -719,7 +719,7 @@ void VcprojGenerator::writeSubDirs(QTextStream &t) t << slnConf; // Restore previous after_user_var options - Option::globals->postcmds = old_after_vars; + Option::globals->extra_cmds[QMakeEvalAfter] = old_after_vars; t << _slnProjConfBeg; for(QList::Iterator it = solution_cleanup.begin(); it != solution_cleanup.end(); ++it) { diff --git a/qmake/library/qmakeevaluator.cpp b/qmake/library/qmakeevaluator.cpp index 38c0cec23f..a5fa0d22a6 100644 --- a/qmake/library/qmakeevaluator.cpp +++ b/qmake/library/qmakeevaluator.cpp @@ -1443,6 +1443,9 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProFile( if (flags & LoadPreFiles) { setupProject(); + if (!m_option->extra_cmds[QMakeEvalEarly].isEmpty()) + evaluateCommand(m_option->extra_cmds[QMakeEvalEarly], fL1S("(command line -early)")); + for (ProValueMap::ConstIterator it = m_extraVars.constBegin(); it != m_extraVars.constEnd(); ++it) m_valuemapStack.first().insert(it.key(), it.value()); @@ -1454,8 +1457,8 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProFile( if ((vr = evaluateFeatureFile(QLatin1String("default_pre.prf"))) == ReturnError) goto failed; - if (!m_option->precmds.isEmpty()) { - evaluateCommand(m_option->precmds, fL1S("(command line)")); + if (!m_option->extra_cmds[QMakeEvalBefore].isEmpty()) { + evaluateCommand(m_option->extra_cmds[QMakeEvalBefore], fL1S("(command line)")); // Again, after user configs, to override them applyExtraConfigs(); @@ -1468,7 +1471,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProFile( debugMsg(1, "done visiting file %s", qPrintable(pro->fileName())); if (flags & LoadPostFiles) { - evaluateCommand(m_option->postcmds, fL1S("(command line -after)")); + evaluateCommand(m_option->extra_cmds[QMakeEvalAfter], fL1S("(command line -after)")); // Again, to ensure the project does not mess with us. // Specifically, do not allow a project to override debug/release within a @@ -1478,6 +1481,9 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProFile( if ((vr = evaluateFeatureFile(QLatin1String("default_post.prf"))) == ReturnError) goto failed; + if (!m_option->extra_cmds[QMakeEvalLate].isEmpty()) + evaluateCommand(m_option->extra_cmds[QMakeEvalLate], fL1S("(command line -late)")); + if ((vr = evaluateConfigFeatures()) == ReturnError) goto failed; } diff --git a/qmake/library/qmakeglobals.cpp b/qmake/library/qmakeglobals.cpp index b282b08d5c..b6dc8b20b6 100644 --- a/qmake/library/qmakeglobals.cpp +++ b/qmake/library/qmakeglobals.cpp @@ -111,10 +111,7 @@ QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments( QString arg = args.at(*pos); switch (argState) { case ArgConfig: - if (state.after) - state.postconfigs << arg; - else - state.preconfigs << arg; + state.configs[state.phase] << arg; break; case ArgSpec: qmakespec = args[*pos] = cleanSpec(state, arg); @@ -141,8 +138,14 @@ QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments( args.erase(args.begin() + *pos, args.end()); return ArgumentsOk; } - if (arg == QLatin1String("-after")) - state.after = true; + if (arg == QLatin1String("-early")) + state.phase = QMakeEvalEarly; + else if (arg == QLatin1String("-before")) + state.phase = QMakeEvalBefore; + else if (arg == QLatin1String("-after")) + state.phase = QMakeEvalAfter; + else if (arg == QLatin1String("-late")) + state.phase = QMakeEvalLate; else if (arg == QLatin1String("-config")) argState = ArgConfig; else if (arg == QLatin1String("-nocache")) @@ -166,10 +169,7 @@ QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments( else return ArgumentUnknown; } else if (arg.contains(QLatin1Char('='))) { - if (state.after) - state.postcmds << arg; - else - state.precmds << arg; + state.cmds[state.phase] << arg; } else { return ArgumentUnknown; } @@ -184,18 +184,17 @@ QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments( void QMakeGlobals::commitCommandLineArguments(QMakeCmdLineParserState &state) { - if (!state.preconfigs.isEmpty()) - state.precmds << (fL1S("CONFIG += ") + state.preconfigs.join(QLatin1Char(' '))); if (!state.extraargs.isEmpty()) { QString extra = fL1S("QMAKE_EXTRA_ARGS ="); for (const QString &ea : qAsConst(state.extraargs)) extra += QLatin1Char(' ') + QMakeEvaluator::quoteValue(ProString(ea)); - state.precmds << extra; + state.cmds[QMakeEvalBefore] << extra; + } + for (int p = 0; p < 4; p++) { + if (!state.configs[p].isEmpty()) + state.cmds[p] << (fL1S("CONFIG += ") + state.configs[p].join(QLatin1Char(' '))); + extra_cmds[p] = state.cmds[p].join(QLatin1Char('\n')); } - precmds = state.precmds.join(QLatin1Char('\n')); - if (!state.postconfigs.isEmpty()) - state.postcmds << (fL1S("CONFIG += ") + state.postconfigs.join(QLatin1Char(' '))); - postcmds = state.postcmds.join(QLatin1Char('\n')); if (xqmakespec.isEmpty()) xqmakespec = qmakespec; diff --git a/qmake/library/qmakeglobals.h b/qmake/library/qmakeglobals.h index 86b1d28da4..000f685b73 100644 --- a/qmake/library/qmakeglobals.h +++ b/qmake/library/qmakeglobals.h @@ -50,6 +50,8 @@ QT_BEGIN_NAMESPACE class QMakeEvaluator; +enum QMakeEvalPhase { QMakeEvalEarly, QMakeEvalBefore, QMakeEvalAfter, QMakeEvalLate }; + class QMakeBaseKey { public: @@ -83,12 +85,13 @@ public: class QMAKE_EXPORT QMakeCmdLineParserState { public: - QMakeCmdLineParserState(const QString &_pwd) : pwd(_pwd), after(false) {} + QMakeCmdLineParserState(const QString &_pwd) : pwd(_pwd), phase(QMakeEvalBefore) {} QString pwd; - QStringList precmds, preconfigs, postcmds, postconfigs, extraargs; - bool after; + QStringList cmds[4], configs[4]; + QStringList extraargs; + QMakeEvalPhase phase; - void flush() { after = false; } + void flush() { phase = QMakeEvalBefore; } }; class QMAKE_EXPORT QMakeGlobals @@ -110,7 +113,7 @@ public: QString qtconf; QString qmakespec, xqmakespec; QString user_template, user_template_prefix; - QString precmds, postcmds; + QString extra_cmds[4]; #ifdef PROEVALUATOR_DEBUG int debugLevel; diff --git a/qmake/option.cpp b/qmake/option.cpp index 9dcd343c8a..52f9cb8a0e 100644 --- a/qmake/option.cpp +++ b/qmake/option.cpp @@ -151,17 +151,23 @@ bool usage(const char *a0) " -Wdeprecated Turn on deprecation warnings (on by default)\n" "\n" "Options:\n" - " * You can place any variable assignment in options and it will be *\n" - " * processed as if it was in [files]. These assignments will be parsed *\n" - " * before [files]. *\n" + " * You can place any variable assignment in options and it will be *\n" + " * processed as if it was in [files]. These assignments will be *\n" + " * processed before [files] by default. *\n" " -o file Write output to file\n" " -d Increase debug level\n" " -t templ Overrides TEMPLATE as templ\n" " -tp prefix Overrides TEMPLATE so that prefix is prefixed into the value\n" " -help This help\n" " -v Version information\n" - " -after All variable assignments after this will be\n" + " -early All subsequent variable assignments will be\n" + " parsed right before default_pre.prf\n" + " -before All subsequent variable assignments will be\n" + " parsed right before [files] (the default)\n" + " -after All subsequent variable assignments will be\n" " parsed after [files]\n" + " -late All subsequent variable assignments will be\n" + " parsed right after default_post.prf\n" " -norecursive Don't do a recursive search\n" " -recursive Do a recursive search\n" " -set Set persistent property\n" -- cgit v1.2.3