From 35261805d99faaad6401cab9c36254fbc135ca1b Mon Sep 17 00:00:00 2001 From: PathoA Date: Mon, 14 Apr 2025 21:51:58 +0200 Subject: [PATCH] Fixes bug introduced in 730224581dd3cd8762b1f41a2d4e05d9ec99f472, when entire subtrees of dependencies were skipped in preselectInferenceRules leading to incorrect build order of dependencies. Fixed the original performance problem with an extra flag that marks whether a target (and its dependency subtree) has already been visited. --- src/jomlib/makefile.cpp | 1 + src/jomlib/makefile.h | 1 + src/jomlib/parser.cpp | 17 +++++++++-------- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/jomlib/makefile.cpp b/src/jomlib/makefile.cpp index 94ef2d4..e2879b1 100644 --- a/src/jomlib/makefile.cpp +++ b/src/jomlib/makefile.cpp @@ -114,6 +114,7 @@ void Command::evaluateModifiers() DescriptionBlock::DescriptionBlock(Makefile* mkfile) : m_bFileExists(false), m_bVisitedByCycleCheck(false), + m_bVisitedByPreselectInferenceRules(false), m_bNoCyclesRootedHere(false), m_canAddCommands(ACSUnknown), m_pMakefile(mkfile) diff --git a/src/jomlib/makefile.h b/src/jomlib/makefile.h index 84ae63d..064cebb 100644 --- a/src/jomlib/makefile.h +++ b/src/jomlib/makefile.h @@ -104,6 +104,7 @@ class DescriptionBlock : public CommandContainer { bool m_bFileExists; bool m_bVisitedByCycleCheck; bool m_bNoCyclesRootedHere; + bool m_bVisitedByPreselectInferenceRules; QVector m_inferenceRules; enum AddCommandsState { ACSUnknown, ACSEnabled, ACSDisabled }; diff --git a/src/jomlib/parser.cpp b/src/jomlib/parser.cpp index ec21a35..0e8b7cd 100644 --- a/src/jomlib/parser.cpp +++ b/src/jomlib/parser.cpp @@ -726,16 +726,17 @@ QVector Parser::findRulesByTargetName(const QString& targetFileP void Parser::preselectInferenceRules(DescriptionBlock *target) { - if (!target->m_commands.isEmpty()) { - /* If we already have commands for this target, then we've already - * generated all the commands for the dependents already. Nothing - * more to do. */ + if (target->m_bVisitedByPreselectInferenceRules) + // We already processed this target return; - } - QVector rules = findRulesByTargetName(target->targetName()); - if (!rules.isEmpty()) - target->m_inferenceRules = rules; + target->m_bVisitedByPreselectInferenceRules = true; + + if (target->m_commands.isEmpty()) { + QVector rules = findRulesByTargetName(target->targetName()); + if (!rules.isEmpty()) + target->m_inferenceRules = rules; + } foreach (const QString &dependentName, target->m_dependents) { DescriptionBlock *dependent = m_makefile->target(dependentName);