summaryrefslogtreecommitdiffstats
path: root/qmake
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-02-03 18:12:52 +0100
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-02-06 16:34:17 +0000
commit4adc1012e19f5e12ab2fb96effc9ea88d2a05eda (patch)
tree585b19485d52f94295adc64c08bed44a95a11f8d /qmake
parentad51c8aa0a00c1bbec7386472ca454079e284051 (diff)
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 <joerg.bornemann@qt.io>
Diffstat (limited to 'qmake')
-rw-r--r--qmake/generators/projectgenerator.cpp8
-rw-r--r--qmake/generators/win32/msvc_vcproj.cpp6
-rw-r--r--qmake/library/qmakeevaluator.cpp12
-rw-r--r--qmake/library/qmakeglobals.cpp33
-rw-r--r--qmake/library/qmakeglobals.h13
-rw-r--r--qmake/option.cpp14
6 files changed, 50 insertions, 36 deletions
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 <lib>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<QString, QString> profileLookup;
QHash<QString, QString> 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<VcsolutionDepend*>::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 <prop> <value> Set persistent property\n"