|
@@ -426,7 +426,7 @@ bool cmMakefile::ReadDependentFile(const char* filename, bool noPolicyScope)
|
|
|
IncludeScope incScope(this, filenametoread, noPolicyScope);
|
|
|
|
|
|
cmListFile listFile;
|
|
|
- if (!listFile.ParseFile(filenametoread.c_str(), false, this)) {
|
|
|
+ if (!listFile.ParseFile(filenametoread.c_str(), this)) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -475,7 +475,7 @@ bool cmMakefile::ReadListFile(const char* filename)
|
|
|
ListFileScope scope(this, filenametoread);
|
|
|
|
|
|
cmListFile listFile;
|
|
|
- if (!listFile.ParseFile(filenametoread.c_str(), false, this)) {
|
|
|
+ if (!listFile.ParseFile(filenametoread.c_str(), this)) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -1423,10 +1423,81 @@ void cmMakefile::Configure()
|
|
|
this->AddDefinition("CMAKE_PARENT_LIST_FILE", currentStart.c_str());
|
|
|
|
|
|
cmListFile listFile;
|
|
|
- if (!listFile.ParseFile(currentStart.c_str(), this->IsRootMakefile(),
|
|
|
- this)) {
|
|
|
+ if (!listFile.ParseFile(currentStart.c_str(), this)) {
|
|
|
return;
|
|
|
}
|
|
|
+ if (this->IsRootMakefile()) {
|
|
|
+ bool hasVersion = false;
|
|
|
+ // search for the right policy command
|
|
|
+ for (std::vector<cmListFileFunction>::iterator i =
|
|
|
+ listFile.Functions.begin();
|
|
|
+ i != listFile.Functions.end(); ++i) {
|
|
|
+ if (cmSystemTools::LowerCase(i->Name) == "cmake_minimum_required") {
|
|
|
+ hasVersion = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // if no policy command is found this is an error if they use any
|
|
|
+ // non advanced functions or a lot of functions
|
|
|
+ if (!hasVersion) {
|
|
|
+ bool isProblem = true;
|
|
|
+ if (listFile.Functions.size() < 30) {
|
|
|
+ // the list of simple commands DO NOT ADD TO THIS LIST!!!!!
|
|
|
+ // these commands must have backwards compatibility forever and
|
|
|
+ // and that is a lot longer than your tiny mind can comprehend mortal
|
|
|
+ std::set<std::string> allowedCommands;
|
|
|
+ allowedCommands.insert("project");
|
|
|
+ allowedCommands.insert("set");
|
|
|
+ allowedCommands.insert("if");
|
|
|
+ allowedCommands.insert("endif");
|
|
|
+ allowedCommands.insert("else");
|
|
|
+ allowedCommands.insert("elseif");
|
|
|
+ allowedCommands.insert("add_executable");
|
|
|
+ allowedCommands.insert("add_library");
|
|
|
+ allowedCommands.insert("target_link_libraries");
|
|
|
+ allowedCommands.insert("option");
|
|
|
+ allowedCommands.insert("message");
|
|
|
+ isProblem = false;
|
|
|
+ for (std::vector<cmListFileFunction>::iterator i =
|
|
|
+ listFile.Functions.begin();
|
|
|
+ i != listFile.Functions.end(); ++i) {
|
|
|
+ std::string name = cmSystemTools::LowerCase(i->Name);
|
|
|
+ if (allowedCommands.find(name) == allowedCommands.end()) {
|
|
|
+ isProblem = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isProblem) {
|
|
|
+ // Tell the top level cmMakefile to diagnose
|
|
|
+ // this violation of CMP0000.
|
|
|
+ this->SetCheckCMP0000(true);
|
|
|
+
|
|
|
+ // Implicitly set the version for the user.
|
|
|
+ this->SetPolicyVersion("2.4");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ bool hasProject = false;
|
|
|
+ // search for a project command
|
|
|
+ for (std::vector<cmListFileFunction>::iterator i =
|
|
|
+ listFile.Functions.begin();
|
|
|
+ i != listFile.Functions.end(); ++i) {
|
|
|
+ if (cmSystemTools::LowerCase(i->Name) == "project") {
|
|
|
+ hasProject = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // if no project command is found, add one
|
|
|
+ if (!hasProject) {
|
|
|
+ cmListFileFunction project;
|
|
|
+ project.Name = "PROJECT";
|
|
|
+ cmListFileArgument prj("Project", cmListFileArgument::Unquoted, 0);
|
|
|
+ project.Arguments.push_back(prj);
|
|
|
+ listFile.Functions.insert(listFile.Functions.begin(), project);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
this->ReadListFile(listFile, currentStart);
|
|
|
if (cmSystemTools::GetFatalErrorOccured()) {
|
|
|
scope.Quiet();
|