浏览代码

Introduce a cmGlobalGenerator::ResolveLanguageCompiler function

It is factored out of cmGlobalUnixMakefileGenerator3::EnableLanguage,
and may be used by other generators to resolve CMAKE_*_COMPILER
settings.
Peter Collingbourne 14 年之前
父节点
当前提交
557956f348
共有 3 个文件被更改,包括 81 次插入69 次删除
  1. 73 0
      Source/cmGlobalGenerator.cxx
  2. 7 0
      Source/cmGlobalGenerator.h
  3. 1 69
      Source/cmGlobalUnixMakefileGenerator3.cxx

+ 73 - 0
Source/cmGlobalGenerator.cxx

@@ -77,6 +77,79 @@ cmGlobalGenerator::~cmGlobalGenerator()
   this->ClearExportSets();
 }
 
+void cmGlobalGenerator::ResolveLanguageCompiler(const std::string &lang,
+                                                cmMakefile *mf,
+                                                bool optional) {
+  std::string langComp = "CMAKE_";
+  langComp += lang;
+  langComp += "_COMPILER";
+
+  if(!mf->GetDefinition(langComp.c_str()))
+    {
+    if(!optional)
+      {
+      cmSystemTools::Error(langComp.c_str(),
+                           " not set, after EnableLanguage");
+      }
+    return;
+    }
+  const char* name = mf->GetRequiredDefinition(langComp.c_str());
+  std::string path;
+  if(!cmSystemTools::FileIsFullPath(name))
+    {
+    path = cmSystemTools::FindProgram(name);
+    }
+  else
+    {
+    path = name;
+    }
+  if((path.size() == 0 || !cmSystemTools::FileExists(path.c_str()))
+      && (optional==false))
+    {
+    std::string message = "your ";
+    message += lang;
+    message += " compiler: \"";
+    message +=  name;
+    message += "\" was not found.   Please set ";
+    message += langComp;
+    message += " to a valid compiler path or name.";
+    cmSystemTools::Error(message.c_str());
+    path = name;
+    }
+  std::string doc = lang;
+  doc += " compiler.";
+  const char* cname = this->GetCMakeInstance()->
+    GetCacheManager()->GetCacheValue(langComp.c_str());
+  std::string changeVars;
+  if(cname && (path != cname) && (optional==false))
+    {
+    std::string cnameString = cname;
+    std::string pathString = path;
+    // get rid of potentially multiple slashes:
+    cmSystemTools::ConvertToUnixSlashes(cnameString);
+    cmSystemTools::ConvertToUnixSlashes(pathString);
+    if (cnameString != pathString)
+      {
+      const char* cvars =
+        this->GetCMakeInstance()->GetProperty(
+          "__CMAKE_DELETE_CACHE_CHANGE_VARS_");
+      if(cvars)
+        {
+        changeVars += cvars;
+        changeVars += ";";
+        }
+      changeVars += langComp;
+      changeVars += ";";
+      changeVars += cname;
+      this->GetCMakeInstance()->SetProperty(
+        "__CMAKE_DELETE_CACHE_CHANGE_VARS_",
+        changeVars.c_str());
+      }
+    }
+  mf->AddCacheDefinition(langComp.c_str(), path.c_str(),
+                         doc.c_str(), cmCacheManager::FILEPATH);
+}
+
 // Find the make program for the generator, required for try compiles
 void cmGlobalGenerator::FindMakeProgram(cmMakefile* mf)
 {

+ 7 - 0
Source/cmGlobalGenerator.h

@@ -76,6 +76,13 @@ public:
   virtual void EnableLanguage(std::vector<std::string>const& languages,
                               cmMakefile *, bool optional);
 
+  /**
+   * Resolve the CMAKE_<lang>_COMPILER setting for the given language.
+   * Intended to be called from EnableLanguage.
+   */
+  void ResolveLanguageCompiler(const std::string &lang, cmMakefile *mf,
+                               bool optional);
+
   /**
    * Try to determine system infomation, get it from another generator
    */

+ 1 - 69
Source/cmGlobalUnixMakefileGenerator3.cxx

@@ -39,7 +39,6 @@ void cmGlobalUnixMakefileGenerator3
                  bool optional)
 {
   this->cmGlobalGenerator::EnableLanguage(languages, mf, optional);
-  std::string path;
   for(std::vector<std::string>::const_iterator l = languages.begin();
       l != languages.end(); ++l)
     {
@@ -47,74 +46,7 @@ void cmGlobalUnixMakefileGenerator3
       {
       continue;
       }
-    const char* lang = l->c_str();
-    std::string langComp = "CMAKE_";
-    langComp += lang;
-    langComp += "_COMPILER";
-
-    if(!mf->GetDefinition(langComp.c_str()))
-      {
-      if(!optional)
-        {
-        cmSystemTools::Error(langComp.c_str(),
-                             " not set, after EnableLanguage");
-        }
-      continue;
-      }
-    const char* name = mf->GetRequiredDefinition(langComp.c_str());
-    if(!cmSystemTools::FileIsFullPath(name))
-      {
-      path = cmSystemTools::FindProgram(name);
-      }
-    else
-      {
-      path = name;
-      }
-    if((path.size() == 0 || !cmSystemTools::FileExists(path.c_str()))
-        && (optional==false))
-      {
-      std::string message = "your ";
-      message += lang;
-      message += " compiler: \"";
-      message +=  name;
-      message += "\" was not found.   Please set ";
-      message += langComp;
-      message += " to a valid compiler path or name.";
-      cmSystemTools::Error(message.c_str());
-      path = name;
-      }
-    std::string doc = lang;
-    doc += " compiler.";
-    const char* cname = this->GetCMakeInstance()->
-      GetCacheManager()->GetCacheValue(langComp.c_str());
-    std::string changeVars;
-    if(cname && (path != cname) && (optional==false))
-      {
-      std::string cnameString = cname;
-      std::string pathString = path;
-      // get rid of potentially multiple slashes:
-      cmSystemTools::ConvertToUnixSlashes(cnameString);
-      cmSystemTools::ConvertToUnixSlashes(pathString);
-      if (cnameString != pathString)
-        {
-        const char* cvars =
-          this->GetCMakeInstance()->GetProperty(
-            "__CMAKE_DELETE_CACHE_CHANGE_VARS_");
-        if(cvars)
-          {
-          changeVars += cvars;
-          changeVars += ";";
-          }
-        changeVars += langComp;
-        changeVars += ";";
-        changeVars += cname;
-        this->GetCMakeInstance()->SetProperty(
-          "__CMAKE_DELETE_CACHE_CHANGE_VARS_",
-          changeVars.c_str());
-        }
-      }
-    mf->AddCacheDefinition(langComp.c_str(), path.c_str(),
-                           doc.c_str(), cmCacheManager::FILEPATH);
+    this->ResolveLanguageCompiler(*l, mf, optional);
     }
 }