Преглед изворни кода

ENH: add checking for NOTFOUND

Bill Hoffman пре 23 година
родитељ
комит
f58d7df66a

+ 3 - 2
Source/cmFindFileCommand.cxx

@@ -56,7 +56,7 @@ bool cmFindFileCommand::InitialPass(std::vector<std::string> const& argsIn)
   // already, if so use that value and don't look for the program
   // already, if so use that value and don't look for the program
   const char* cacheValue
   const char* cacheValue
     = m_Makefile->GetDefinition(define);
     = m_Makefile->GetDefinition(define);
-  if(cacheValue && strcmp(cacheValue, "NOTFOUND"))
+  if(cacheValue && !cmSystemTools::IsNOTFOUND(cacheValue))
     {
     {
     return true;
     return true;
     }
     }
@@ -87,8 +87,9 @@ bool cmFindFileCommand::InitialPass(std::vector<std::string> const& argsIn)
       return true;
       return true;
       }
       }
     }
     }
+  std::string s = args[0] + "-NOTFOUND";
   m_Makefile->AddCacheDefinition(args[0].c_str(),
   m_Makefile->AddCacheDefinition(args[0].c_str(),
-                                 "NOTFOUND",
+                                 s.c_str(),
                                  helpString.c_str(),
                                  helpString.c_str(),
                                  cmCacheManager::FILEPATH);
                                  cmCacheManager::FILEPATH);
   return true;
   return true;

+ 5 - 2
Source/cmFindFileCommand.h

@@ -72,8 +72,11 @@ public:
     return
     return
       "FIND_FILE(NAME file extrapath extrapath ... [DOC docstring])"
       "FIND_FILE(NAME file extrapath extrapath ... [DOC docstring])"
       "Find a file in the system PATH or in any extra paths specified in the command."
       "Find a file in the system PATH or in any extra paths specified in the command."
-      "A cache entry called NAME is created to store the result.   NOTFOUND is the value"
-      " used if the file was not found.  If DOC is specified the next argument is the "
+      "A cache entry called NAME is created to store the result.  "
+      " NAME-NOTFOUND is the value used if the file was not found. "
+      "As long as NOTFOUND is the value each time cmake will continue to "
+      "try and find the file each time it is run. "
+      " If DOC is specified the next argument is the "
       "documentation string for the cache entry NAME.  Since Executables, "
       "documentation string for the cache entry NAME.  Since Executables, "
       "can have different extensions on different platforms, FIND_PROGRAM,"
       "can have different extensions on different platforms, FIND_PROGRAM,"
       " should be used instead of FIND_FILE when looking for and executable.";
       " should be used instead of FIND_FILE when looking for and executable.";

+ 2 - 1
Source/cmFindLibraryCommand.cxx

@@ -135,8 +135,9 @@ bool cmFindLibraryCommand::InitialPass(std::vector<std::string> const& argsIn)
       return true;
       return true;
       } 
       } 
     }
     }
+  std::string s = args[0] + "-NOTFOUND";
   m_Makefile->AddCacheDefinition(args[0].c_str(),
   m_Makefile->AddCacheDefinition(args[0].c_str(),
-                                 "NOTFOUND",
+                                 s.c_str(),
                                  helpString.c_str(),
                                  helpString.c_str(),
                                  cmCacheManager::FILEPATH);
                                  cmCacheManager::FILEPATH);
   return true;
   return true;

+ 1 - 1
Source/cmFindPackageCommand.cxx

@@ -234,7 +234,7 @@ std::string cmFindPackageCommand::SearchForConfig() const
       }
       }
     }
     }
   
   
-  return "NOTFOUND";
+  return this->Variable + "-NOTFOUND";
 }
 }
 
 
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------

+ 2 - 2
Source/cmFindPathCommand.cxx

@@ -50,7 +50,7 @@ bool cmFindPathCommand::InitialPass(std::vector<std::string> const& argsIn)
 
 
   const char* cacheValue
   const char* cacheValue
     = m_Makefile->GetDefinition(args[0].c_str());
     = m_Makefile->GetDefinition(args[0].c_str());
-  if(cacheValue && strcmp(cacheValue, "NOTFOUND"))
+  if(cacheValue && !cmSystemTools::IsNOTFOUND(cacheValue))
     { 
     { 
     return true;
     return true;
     }
     }
@@ -100,7 +100,7 @@ bool cmFindPathCommand::InitialPass(std::vector<std::string> const& argsIn)
     }
     }
   
   
   m_Makefile->AddCacheDefinition(args[0].c_str(),
   m_Makefile->AddCacheDefinition(args[0].c_str(),
-                                 "NOTFOUND",
+                                 (args[0] + "-NOTFOUND").c_str(),
                                  helpString.c_str(),
                                  helpString.c_str(),
                                  cmCacheManager::PATH);
                                  cmCacheManager::PATH);
   return true;
   return true;

+ 2 - 2
Source/cmFindProgramCommand.cxx

@@ -55,7 +55,7 @@ bool cmFindProgramCommand::InitialPass(std::vector<std::string> const& argsIn)
   // already, if so use that value and don't look for the program
   // already, if so use that value and don't look for the program
   const char* cacheValue
   const char* cacheValue
     = m_Makefile->GetDefinition(define);
     = m_Makefile->GetDefinition(define);
-  if(cacheValue && strcmp(cacheValue, "NOTFOUND"))
+  if(cacheValue && !cmSystemTools::IsNOTFOUND(cacheValue))
     {
     {
     return true;
     return true;
     }
     }
@@ -141,7 +141,7 @@ bool cmFindProgramCommand::InitialPass(std::vector<std::string> const& argsIn)
       }
       }
     }
     }
   m_Makefile->AddCacheDefinition(args[0].c_str(),
   m_Makefile->AddCacheDefinition(args[0].c_str(),
-                                 "NOTFOUND",
+                                 (args[0] + "-NOTFOUND").c_str(),
                                  doc.c_str(),
                                  doc.c_str(),
                                  cmCacheManager::FILEPATH);
                                  cmCacheManager::FILEPATH);
   return true;
   return true;

+ 3 - 2
Source/cmFindProgramCommand.h

@@ -72,8 +72,9 @@ public:
     return
     return
       "FIND_PROGRAM(DEFINE_NAME executableName [NAMES name1 name2 name3...] [PATHS path1 path2 path3...] [NO_SYSTEM_PATH] [DOC helpstring]) "
       "FIND_PROGRAM(DEFINE_NAME executableName [NAMES name1 name2 name3...] [PATHS path1 path2 path3...] [NO_SYSTEM_PATH] [DOC helpstring]) "
       "Find the executable in the system PATH or in any extra paths specified in the command."
       "Find the executable in the system PATH or in any extra paths specified in the command."
-      "A cache entry called DEFILE_NAME is created to store the result. NOTFOUND is the value"
-      " used if the program was not found.  If DOC is specified the next argument is the "
+      "A cache entry called DEFILE_NAME is created to store the result. DEFILE_NAME-NOTFOUND is the value"
+      " used if the program was not found.  CMake will continue to look as long as the value "
+      "is NOTFOUND If DOC is specified the next argument is the "
       "documentation string for the cache entry NAME."
       "documentation string for the cache entry NAME."
       "If NO_SYSTEM_PATH is specified the contents of system PATH is not used";
       "If NO_SYSTEM_PATH is specified the contents of system PATH is not used";
     }
     }

+ 1 - 1
Source/cmGetFilenameComponentCommand.cxx

@@ -31,7 +31,7 @@ bool cmGetFilenameComponentCommand::InitialPass(std::vector<std::string> const&
   if(args.size() == 4 && args[3] == "CACHE")
   if(args.size() == 4 && args[3] == "CACHE")
     {
     {
     const char* cacheValue = m_Makefile->GetDefinition(args[0].c_str());
     const char* cacheValue = m_Makefile->GetDefinition(args[0].c_str());
-    if(cacheValue && strcmp(cacheValue, "NOTFOUND"))
+    if(cacheValue && !cmSystemTools::IsNOTFOUND(cacheValue))
       {
       {
       return true;
       return true;
       }
       }

+ 55 - 1
Source/cmGlobalGenerator.cxx

@@ -284,12 +284,66 @@ void cmGlobalGenerator::Configure()
   // now do it
   // now do it
   this->RecursiveConfigure(lg,0.0f,0.9f);
   this->RecursiveConfigure(lg,0.0f,0.9f);
 
 
+  std::set<std::string> notFoundMap;
   // after it is all done do a ConfigureFinalPass
   // after it is all done do a ConfigureFinalPass
+  cmCacheManager* manager = 0;
   for (i = 0; i < m_LocalGenerators.size(); ++i)
   for (i = 0; i < m_LocalGenerators.size(); ++i)
     {
     {
+    manager = m_LocalGenerators[i]->GetMakefile()->GetCacheManager();
     m_LocalGenerators[i]->ConfigureFinalPass();
     m_LocalGenerators[i]->ConfigureFinalPass();
-    m_CMakeInstance->UpdateProgress("Configuring", 
+    cmTargets const& targets = m_LocalGenerators[i]->GetMakefile()->GetTargets(); 
+    for (cmTargets::const_iterator l = targets.begin();
+         l != targets.end(); l++)
+      {
+      cmTarget::LinkLibraries libs = l->second.GetLinkLibraries();
+      for(cmTarget::LinkLibraries::iterator lib = libs.begin();
+          lib != libs.end(); ++lib)
+        {
+        if(cmSystemTools::IsNOTFOUND(lib->first.c_str()))
+          {
+          std::string not = lib->first.substr(0, lib->first.size()-9);
+          notFoundMap.insert(not);
+          }
+        }
+      std::vector<std::string>& incs = 
+        m_LocalGenerators[i]->GetMakefile()->GetIncludeDirectories();
+      
+      for( std::vector<std::string>::iterator lib = incs.begin();
+           lib != incs.end(); ++lib)
+        {
+        if(cmSystemTools::IsNOTFOUND(lib->c_str()))
+          {
+          std::string not = lib->substr(0, lib->size()-9); 
+          notFoundMap.insert(not);
+          }
+        }
+      m_CMakeInstance->UpdateProgress("Configuring", 
                                     0.9f+0.1f*(i+1.0f)/m_LocalGenerators.size());
                                     0.9f+0.1f*(i+1.0f)/m_LocalGenerators.size());
+      }
+    }
+
+  if(notFoundMap.size())
+    {
+    std::string notFoundVars;
+    for(std::set<std::string>::iterator i = notFoundMap.begin();
+        i != notFoundMap.end(); ++i)
+      { 
+      notFoundVars += *i;
+      if(manager)
+        {
+        cmCacheManager::CacheIterator it = 
+          manager->GetCacheIterator(i->c_str());
+        if(it.GetPropertyAsBool("ADVANCED"))
+          {
+          notFoundVars += " (ADVANCED)";
+          }
+        }
+      notFoundVars += "\n";
+      }
+    cmSystemTools::Error("This project requires some variables to be set,\n"
+                         "and cmake can not find them.\n"
+                         "Please set the following variables:\n",
+                         notFoundVars.c_str());
     }
     }
   m_CMakeInstance->UpdateProgress("Configuring done", -1);
   m_CMakeInstance->UpdateProgress("Configuring done", -1);
 }
 }

+ 2 - 2
Source/cmITKWrapTclCommand.cxx

@@ -222,8 +222,8 @@ std::string cmITKWrapTclCommand::GetCableFromCache() const
     { return cable; }
     { return cable; }
 
 
   m_Makefile->AddCacheDefinition("CABLE",
   m_Makefile->AddCacheDefinition("CABLE",
-                                 "NOTFOUND",
+                                 "CABLE-NOTFOUND",
                                  "Path to CABLE executable.",
                                  "Path to CABLE executable.",
                                  cmCacheManager::FILEPATH);
                                  cmCacheManager::FILEPATH);
-  return "NOTFOUND";
+  return "CABLE-NOTFOUND";
 }
 }

+ 0 - 5
Source/cmIncludeDirectoryCommand.cxx

@@ -35,11 +35,6 @@ bool cmIncludeDirectoryCommand::InitialPass(std::vector<std::string> const& args
 
 
   for(; i != args.end(); ++i)
   for(; i != args.end(); ++i)
     {
     {
-    if ( *i == "NOTFOUND" )
-      {
-      this->SetError("CMake attempted to put directory that was not found to the list of include directories.");
-      return false;
-      }
     m_Makefile->AddIncludeDirectory((*i).c_str(), before);
     m_Makefile->AddIncludeDirectory((*i).c_str(), before);
     }
     }
   return true;
   return true;

+ 0 - 5
Source/cmLinkLibrariesCommand.cxx

@@ -28,11 +28,6 @@ bool cmLinkLibrariesCommand::InitialPass(std::vector<std::string> const& args)
   for(std::vector<std::string>::const_iterator i = args.begin();
   for(std::vector<std::string>::const_iterator i = args.begin();
       i != args.end(); ++i)
       i != args.end(); ++i)
     {
     {
-    if ( *i == "NOTFOUND" )
-      {
-      this->SetError("CMake attempted to put directory that was not found to the list of include directories.");
-      return false;
-      }
     if (*i == "debug")
     if (*i == "debug")
       {
       {
       ++i;
       ++i;

+ 1 - 0
Source/cmMakefile.cxx

@@ -385,6 +385,7 @@ void cmMakefile::ConfigureFinalPass()
   bool oldVersion = (!versionValue || atof(versionValue) < 1.4);
   bool oldVersion = (!versionValue || atof(versionValue) < 1.4);
   // merge libraries
   // merge libraries
   
   
+  std::string notFoundVars;
   for (cmTargets::iterator l = m_Targets.begin();
   for (cmTargets::iterator l = m_Targets.begin();
        l != m_Targets.end(); l++)
        l != m_Targets.end(); l++)
     {
     {

+ 2 - 2
Source/cmSourceFile.cxx

@@ -163,8 +163,8 @@ void cmSourceFile::SetProperty(const char* prop, const char* value)
     }
     }
   if (!value)
   if (!value)
     {
     {
-        value = "NOTFOUND";
-        }
+    value = "NOTFOUND";
+    }
   m_Properties[prop] = value;
   m_Properties[prop] = value;
 }
 }
 
 

+ 12 - 1
Source/cmSystemTools.cxx

@@ -1188,6 +1188,17 @@ bool cmSystemTools::IsOn(const char* val)
   return (v == "ON" || v == "1" || v == "YES" || v == "TRUE" || v == "Y");
   return (v == "ON" || v == "1" || v == "YES" || v == "TRUE" || v == "Y");
 }
 }
 
 
+bool cmSystemTools::IsNOTFOUND(const char* val)
+{
+  cmRegularExpression reg("-NOTFOUND$");
+  if(reg.find(val))
+    {
+    return true;
+    }
+  return std::string("NOTFOUND") == val;
+}
+
+
 bool cmSystemTools::IsOff(const char* val)
 bool cmSystemTools::IsOff(const char* val)
 {
 {
   if (!val || strlen(val) == 0)
   if (!val || strlen(val) == 0)
@@ -1202,7 +1213,7 @@ bool cmSystemTools::IsOff(const char* val)
     *c = toupper(*c);
     *c = toupper(*c);
     }
     }
   return (v == "OFF" || v == "0" || v == "NO" || v == "FALSE" || 
   return (v == "OFF" || v == "0" || v == "NO" || v == "FALSE" || 
-          v == "N" || v == "NOTFOUND" || v == "IGNORE");
+          v == "N" || cmSystemTools::IsNOTFOUND(v.c_str()) || v == "IGNORE");
 }
 }
 
 
 
 

+ 4 - 1
Source/cmSystemTools.h

@@ -213,10 +213,13 @@ public:
    * not the same as !IsOn(...) because there are a number of
    * not the same as !IsOn(...) because there are a number of
    * ambiguous values such as "/usr/local/bin" a path will result in
    * ambiguous values such as "/usr/local/bin" a path will result in
    * IsON and IsOff both returning false. Note that the special path
    * IsON and IsOff both returning false. Note that the special path
-   * NOTFOUND or IGNORE will cause IsOff to return true. 
+   * NOTFOUND, *-NOTFOUND or IGNORE will cause IsOff to return true. 
    */
    */
   static bool IsOff(const char* val);
   static bool IsOff(const char* val);
 
 
+  ///! Return true if value is NOTFOUND or ends in -NOTFOUND.
+  static bool IsNOTFOUND(const char* value);
+  
   ///! Find a file in the system PATH, with optional extra paths.
   ///! Find a file in the system PATH, with optional extra paths.
   static std::string FindFile(const char* name,
   static std::string FindFile(const char* name,
                                  const std::vector<std::string>& path= std::vector<std::string>());
                                  const std::vector<std::string>& path= std::vector<std::string>());

+ 0 - 6
Source/cmTargetLinkLibrariesCommand.cxx

@@ -36,12 +36,6 @@ bool cmTargetLinkLibrariesCommand::InitialPass(std::vector<std::string> const& a
   
   
   for(++i; i != args.end(); ++i)
   for(++i; i != args.end(); ++i)
     {
     {
-    if ( *i == "NOTFOUND" )
-      {
-      this->SetError("CMake attempted to put library that was not found to the list of libraries.");
-      return false;
-      }
- 
     if (*i == "debug")
     if (*i == "debug")
       {
       {
       ++i;
       ++i;