From ce167b546d078d9f699248688ff5f16c7ecf15c7 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 14 May 2015 21:18:06 +0200 Subject: [PATCH] cmMakefile: Handle CMP0014 before configuring the generator. --- Source/cmLocalGenerator.cxx | 44 ++++++------------------------------- Source/cmLocalGenerator.h | 2 ++ Source/cmMakefile.cxx | 37 ++++++++++++++++++++++++++++++- 3 files changed, 45 insertions(+), 38 deletions(-) diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 492ea9da9..74362aeda 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -192,43 +192,8 @@ void cmLocalGenerator::ReadInputFile() // Look for the CMakeLists.txt file. std::string currentStart = this->StateSnapshot.GetCurrentSourceDirectory(); currentStart += "/CMakeLists.txt"; - if(cmSystemTools::FileExists(currentStart.c_str(), true)) - { - this->Makefile->ProcessBuildsystemFile(currentStart.c_str()); - return; - } - - assert(this->Parent); - - // The file is missing. Check policy CMP0014. - cmMakefile* mf = this->Parent->GetMakefile(); - std::ostringstream e; - e << "The source directory\n" - << " " << this->StateSnapshot.GetCurrentSourceDirectory() << "\n" - << "does not contain a CMakeLists.txt file."; - switch (mf->GetPolicyStatus(cmPolicies::CMP0014)) - { - case cmPolicies::WARN: - // Print the warning. - e << "\n" - << "CMake does not support this case but it used " - << "to work accidentally and is being allowed for " - << "compatibility." - << "\n" - << cmPolicies::GetPolicyWarning(cmPolicies::CMP0014); - mf->IssueMessage(cmake::AUTHOR_WARNING, e.str()); - case cmPolicies::OLD: - // OLD behavior does not warn. - return; - case cmPolicies::REQUIRED_IF_USED: - case cmPolicies::REQUIRED_ALWAYS: - e << "\n" - << cmPolicies::GetRequiredPolicyError(cmPolicies::CMP0014); - case cmPolicies::NEW: - // NEW behavior prints the error. - mf->IssueMessage(cmake::FATAL_ERROR, e.str()); - break; - } + assert(cmSystemTools::FileExists(currentStart.c_str(), true)); + this->Makefile->ProcessBuildsystemFile(currentStart.c_str()); } void cmLocalGenerator::SetupPathConversions() @@ -3340,6 +3305,11 @@ bool cmLocalGenerator::IsNMake() const return this->GlobalGenerator->NMake; } +void cmLocalGenerator::SetConfiguredCMP0014(bool configured) +{ + this->Configured = configured; +} + //---------------------------------------------------------------------------- std::string cmLocalGenerator diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index 3459c2a0c..fa2f712b4 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -391,6 +391,8 @@ public: bool IsMinGWMake() const; bool IsNMake() const; + void SetConfiguredCMP0014(bool configured); + protected: ///! put all the libraries for a target on into the given stream virtual void OutputLinkLibraries(std::string& linkLibraries, diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 61ada2df6..7b8d3afa5 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1642,12 +1642,47 @@ void cmMakefile::InitializeFromParent() void cmMakefile::ConfigureSubDirectory(cmLocalGenerator *lg2) { lg2->GetMakefile()->InitializeFromParent(); + std::string currentStart = lg2->GetMakefile()->GetCurrentSourceDirectory(); if (this->GetCMakeInstance()->GetDebugOutput()) { std::string msg=" Entering "; - msg += lg2->GetMakefile()->GetCurrentSourceDirectory(); + msg += currentStart; cmSystemTools::Message(msg.c_str()); } + + currentStart += "/CMakeLists.txt"; + if(!cmSystemTools::FileExists(currentStart.c_str(), true)) + { + // The file is missing. Check policy CMP0014. + std::ostringstream e; + e << "The source directory\n" + << " " << currentStart << "\n" + << "does not contain a CMakeLists.txt file."; + switch (this->GetPolicyStatus(cmPolicies::CMP0014)) + { + case cmPolicies::WARN: + // Print the warning. + e << "\n" + << "CMake does not support this case but it used " + << "to work accidentally and is being allowed for " + << "compatibility." + << "\n" + << cmPolicies::GetPolicyWarning(cmPolicies::CMP0014); + this->IssueMessage(cmake::AUTHOR_WARNING, e.str()); + case cmPolicies::OLD: + // OLD behavior does not warn. + break; + case cmPolicies::REQUIRED_IF_USED: + case cmPolicies::REQUIRED_ALWAYS: + e << "\n" + << cmPolicies::GetRequiredPolicyError(cmPolicies::CMP0014); + case cmPolicies::NEW: + // NEW behavior prints the error. + this->IssueMessage(cmake::FATAL_ERROR, e.str()); + } + lg2->SetConfiguredCMP0014(true); + return; + } // finally configure the subdir lg2->Configure(); if (this->GetCMakeInstance()->GetDebugOutput())