diff --git a/src/jomlib/makefile.cpp b/src/jomlib/makefile.cpp index 720be01..a8e3dff 100644 --- a/src/jomlib/makefile.cpp +++ b/src/jomlib/makefile.cpp @@ -115,7 +115,9 @@ DescriptionBlock::DescriptionBlock(Makefile* mkfile) : m_bFileExists(false), m_bVisitedByCycleCheck(false), m_canAddCommands(ACSUnknown), - m_pMakefile(mkfile) + m_pMakefile(mkfile), + m_parseDone(false), + m_ruleDone(false) { } diff --git a/src/jomlib/makefile.h b/src/jomlib/makefile.h index 4199b8a..140fc9c 100644 --- a/src/jomlib/makefile.h +++ b/src/jomlib/makefile.h @@ -104,6 +104,8 @@ public: bool m_bFileExists; bool m_bVisitedByCycleCheck; QVector m_inferenceRules; + bool m_parseDone; + bool m_ruleDone; enum AddCommandsState { ACSUnknown, ACSEnabled, ACSDisabled }; AddCommandsState m_canAddCommands; diff --git a/src/jomlib/parser.cpp b/src/jomlib/parser.cpp index b7b5353..7fb596d 100644 --- a/src/jomlib/parser.cpp +++ b/src/jomlib/parser.cpp @@ -637,6 +637,9 @@ void Parser::checkForCycles(DescriptionBlock* target) if (!target) return; + if (target->m_parseDone) + return; + if (target->m_bVisitedByCycleCheck) { QString msg = QLatin1String("cycle in targets detected: %1"); throw Exception(msg.arg(target->targetName())); @@ -648,6 +651,7 @@ void Parser::checkForCycles(DescriptionBlock* target) checkForCycles(dep); } target->m_bVisitedByCycleCheck = false; + target->m_parseDone = true; } QVector Parser::findRulesByTargetName(const QString& targetFilePath) @@ -681,6 +685,8 @@ QVector Parser::findRulesByTargetName(const QString& targetFileP void Parser::preselectInferenceRules(DescriptionBlock *target) { + if (target->m_ruleDone) + return; if (target->m_commands.isEmpty()) { QVector rules = findRulesByTargetName(target->targetName()); if (!rules.isEmpty()) @@ -700,6 +706,7 @@ void Parser::preselectInferenceRules(DescriptionBlock *target) } } } + target->m_ruleDone = true; } void Parser::error(const QString& msg)