diff options
author | Christian Kandeler <[email protected]> | 2020-09-08 10:32:17 +0200 |
---|---|---|
committer | Christian Kandeler <[email protected]> | 2020-09-09 11:34:23 +0000 |
commit | 1e452f1ad33c6201f4c863de264b5be36dc17f6e (patch) | |
tree | 5f3f96e32f5f1bd7e7f6d5248ff5ce8f146453d1 /src/plugins/qmakeprojectmanager/makefileparse.cpp | |
parent | d7229d4afca8da42762054ae41b9da611f44b5bd (diff) |
QmakeProjectManager: Compare the right set of arguments
... when determining whether to re-run qmake.
We need to look at the effective arguments, not the user arguments.
Of course, the whole approach is still a shaky heuristic, but it should
be more correct now than it was before.
Fixes: QTCREATORBUG-24538
Change-Id: I763f8095becacde0f9549890161b8a47c6344b6b
Reviewed-by: Orgad Shaneh <[email protected]>
Diffstat (limited to 'src/plugins/qmakeprojectmanager/makefileparse.cpp')
-rw-r--r-- | src/plugins/qmakeprojectmanager/makefileparse.cpp | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/src/plugins/qmakeprojectmanager/makefileparse.cpp b/src/plugins/qmakeprojectmanager/makefileparse.cpp index 206270f481f..17e140f82e4 100644 --- a/src/plugins/qmakeprojectmanager/makefileparse.cpp +++ b/src/plugins/qmakeprojectmanager/makefileparse.cpp @@ -126,13 +126,12 @@ void dumpQMakeAssignments(const QList<QMakeAssignment> &list) } } -void MakeFileParse::parseAssignments(QList<QMakeAssignment> *assignments) +QList<QMakeAssignment> MakeFileParse::parseAssignments(const QList<QMakeAssignment> &assignments) { bool foundSeparateDebugInfo = false; bool foundForceDebugInfo = false; - QList<QMakeAssignment> oldAssignments = *assignments; - assignments->clear(); - foreach (const QMakeAssignment &qa, oldAssignments) { + QList<QMakeAssignment> filteredAssignments; + foreach (const QMakeAssignment &qa, assignments) { if (qa.variable == QLatin1String("CONFIG")) { QStringList values = qa.value.split(QLatin1Char(' ')); QStringList newValues; @@ -218,10 +217,10 @@ void MakeFileParse::parseAssignments(QList<QMakeAssignment> *assignments) if (!newValues.isEmpty()) { QMakeAssignment newQA = qa; newQA.value = newValues.join(QLatin1Char(' ')); - assignments->append(newQA); + filteredAssignments.append(newQA); } } else { - assignments->append(qa); + filteredAssignments.append(qa); } } @@ -233,15 +232,16 @@ void MakeFileParse::parseAssignments(QList<QMakeAssignment> *assignments) newQA.variable = QLatin1String("CONFIG"); newQA.op = QLatin1String("+="); newQA.value = QLatin1String("force_debug_info"); - assignments->append(newQA); + filteredAssignments.append(newQA); } else if (foundSeparateDebugInfo) { // Found only separate_debug_info, so readd it QMakeAssignment newQA; newQA.variable = QLatin1String("CONFIG"); newQA.op = QLatin1String("+="); newQA.value = QLatin1String("separate_debug_info"); - assignments->append(newQA); + filteredAssignments.append(newQA); } + return filteredAssignments; } static FilePath findQMakeBinaryFromMakefile(const QString &makefile) @@ -270,7 +270,7 @@ static FilePath findQMakeBinaryFromMakefile(const QString &makefile) return FilePath(); } -MakeFileParse::MakeFileParse(const QString &makefile) +MakeFileParse::MakeFileParse(const QString &makefile, Mode mode) : m_mode(mode) { qCDebug(logging()) << "Parsing makefile" << makefile; if (!QFileInfo::exists(makefile)) { @@ -367,9 +367,9 @@ void MakeFileParse::parseCommandLine(const QString &command, const QString &proj dumpQMakeAssignments(assignments); // Filter out CONFIG arguments we know into m_qmakeBuildConfig and m_config - parseAssignments(&assignments); + const QList<QMakeAssignment> filteredAssignments = parseAssignments(assignments); qCDebug(logging()) << " After parsing"; - dumpQMakeAssignments(assignments); + dumpQMakeAssignments(filteredAssignments); qCDebug(logging()) << " Explicit Debug" << m_qmakeBuildConfig.explicitDebug; qCDebug(logging()) << " Explicit Release" << m_qmakeBuildConfig.explicitRelease; @@ -385,7 +385,9 @@ void MakeFileParse::parseCommandLine(const QString &command, const QString &proj << (m_config.separateDebugInfo == TriState::Enabled); // Create command line of all unfiltered arguments - foreach (const QMakeAssignment &qa, assignments) + const QList<QMakeAssignment> &assignmentsToUse = m_mode == Mode::FilterKnownConfigValues + ? filteredAssignments : assignments; + foreach (const QMakeAssignment &qa, assignmentsToUse) QtcProcess::addArg(&m_unparsedArguments, qa.variable + qa.op + qa.value); if (!afterAssignments.isEmpty()) { QtcProcess::addArg(&m_unparsedArguments, QLatin1String("-after")); @@ -517,7 +519,7 @@ void QmakeProjectManagerPlugin::testMakefileParser() QFETCH(bool, separateDebugInfo); QFETCH(int, effectiveBuildConfig); - MakeFileParse parser("/tmp/something"); + MakeFileParse parser("/tmp/something", MakeFileParse::Mode::FilterKnownConfigValues); parser.parseCommandLine(command, project); QCOMPARE(Utils::QtcProcess::splitArgs(parser.unparsedArguments()), |