ソースを参照

ENH: small simple projects do not need to specify cmake minimum required

Ken Martin 17 年 前
コミット
a568a8552d
1 ファイル変更35 行追加1 行削除
  1. 35 1
      Source/cmListFileCache.cxx

+ 35 - 1
Source/cmListFileCache.cxx

@@ -134,8 +134,41 @@ bool cmListFile::ParseFile(const char* filename,
         break;
       }
     }
-    // if no version command is found this is a warning or error
+    // 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 (this->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 
+              = this->Functions.begin();
+            i != this->Functions.end(); ++i)
+        {
+          std::string name = cmSystemTools::LowerCase(i->Name);
+          if (allowedCommands.find(name) == allowedCommands.end())
+          {
+          isProblem = true;
+          }       
+        }
+      }
+      
+      if (isProblem)
       {
       cmOStringStream msg;
       msg << "No cmake_minimum_required command is present.  "
@@ -162,6 +195,7 @@ bool cmListFile::ParseFile(const char* filename,
           return false;
         }
       }
+    }
   }
 
   if(topLevel)