diff --git a/Source/cmIfCommand.cxx b/Source/cmIfCommand.cxx index 508a263dc..cbba2d341 100644 --- a/Source/cmIfCommand.cxx +++ b/Source/cmIfCommand.cxx @@ -76,6 +76,10 @@ IsFunctionBlocked(const cmListFileFunction& lff, } else { + // Place this call on the call stack. + cmMakefileCall stack_manager(&mf, this->Functions[c], status); + static_cast(stack_manager); + std::string errorString; std::vector expandedArguments; @@ -98,8 +102,10 @@ IsFunctionBlocked(const cmListFileFunction& lff, err += "("; err += errorString; err += ")."; - cmSystemTools::Error(err.c_str()); - return false; + mf.IssueMessage(cmake::FATAL_ERROR, err); + cmSystemTools::SetFatalErrorOccured(); + mf.RemoveFunctionBlocker(lff); + return true; } if (isTrue) @@ -204,6 +210,7 @@ bool cmIfCommand err += errorString; err += ")."; this->SetError(err.c_str()); + cmSystemTools::SetFatalErrorOccured(); return false; } diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 92d593888..bc013f96d 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -348,26 +348,6 @@ bool cmMakefile::GetBacktrace(cmListFileBacktrace& backtrace) const return true; } -//---------------------------------------------------------------------------- -// Helper class to make sure the call stack is valid. -class cmMakefileCall -{ -public: - cmMakefileCall(cmMakefile* mf, - cmListFileContext const& lfc, - cmExecutionStatus& status): Makefile(mf) - { - cmMakefile::CallStackEntry entry = {&lfc, &status}; - this->Makefile->CallStack.push_back(entry); - } - ~cmMakefileCall() - { - this->Makefile->CallStack.pop_back(); - } -private: - cmMakefile* Makefile; -}; - //---------------------------------------------------------------------------- bool cmMakefile::ExecuteCommand(const cmListFileFunction& lff, cmExecutionStatus &status) diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 77843e848..6a0904255 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -921,5 +921,24 @@ private: void EnforceDirectoryLevelRules(); }; +//---------------------------------------------------------------------------- +// Helper class to make sure the call stack is valid. +class cmMakefileCall +{ +public: + cmMakefileCall(cmMakefile* mf, + cmListFileContext const& lfc, + cmExecutionStatus& status): Makefile(mf) + { + cmMakefile::CallStackEntry entry = {&lfc, &status}; + this->Makefile->CallStack.push_back(entry); + } + ~cmMakefileCall() + { + this->Makefile->CallStack.pop_back(); + } +private: + cmMakefile* Makefile; +}; #endif