Răsfoiți Sursa

ENH: make sure -F is not duplicated

Bill Hoffman 20 ani în urmă
părinte
comite
552842d11f

+ 8 - 5
Source/cmFindFileCommand.cxx

@@ -70,6 +70,8 @@ bool cmFindFileCommand::InitialPass(std::vector<std::string> const& argsIn)
     cmSystemTools::GlobDirs(args[j].c_str(), path);
     }
 
+  cmSystemTools::GetPath(path, "CMAKE_LIBRARY_PATH");
+
   // add the standard path
   cmSystemTools::GetPath(path);
   for(unsigned int k=0; k < path.size(); k++)
@@ -88,7 +90,7 @@ bool cmFindFileCommand::InitialPass(std::vector<std::string> const& argsIn)
       }
     }
 #if defined (__APPLE__)
-  cmStdString fpath = this->FindHeaderInFrameworks(args[0].c_str(), args[1].c_str());
+  cmStdString fpath = this->FindHeaderInFrameworks(path, args[0].c_str(), args[1].c_str());
   if(fpath.size())
     {
     m_Makefile->AddCacheDefinition(args[0].c_str(),
@@ -106,8 +108,10 @@ bool cmFindFileCommand::InitialPass(std::vector<std::string> const& argsIn)
   return true;
 }
 
-cmStdString cmFindFileCommand::FindHeaderInFrameworks(const char* defineVar,
-                                                      const char* file)
+cmStdString cmFindFileCommand::FindHeaderInFrameworks(
+  std::vector<std::string> path,
+  const char* defineVar,
+  const char* file)
 {
 #ifndef __APPLE__
   return cmStdString("");
@@ -130,12 +134,11 @@ cmStdString cmFindFileCommand::FindHeaderInFrameworks(const char* defineVar,
       frameWorkName = "";
       }
     }
-  std::vector<cmStdString> path;
   path.push_back("~/Library/Frameworks");
   path.push_back("/Library/Frameworks");
   path.push_back("/System/Library/Frameworks");
   path.push_back("/Network/Library/Frameworks");
-  for(  std::vector<cmStdString>::iterator i = path.begin();
+  for(  std::vector<std::string>::iterator i = path.begin();
         i != path.end(); ++i)
     {
     if(frameWorkName.size())

+ 2 - 1
Source/cmFindFileCommand.h

@@ -79,7 +79,8 @@ public:
       "different extensions on different platforms, FIND_PROGRAM "
       "should be used instead of FIND_FILE when looking for them.";
     }
-  cmStdString FindHeaderInFrameworks(const char* var, const char* file);
+  cmStdString FindHeaderInFrameworks( std::vector<std::string> path,
+                                      const char* var, const char* file);
   cmTypeMacro(cmFindFileCommand, cmCommand);
 };
 

+ 24 - 4
Source/cmLocalUnixMakefileGenerator3.cxx

@@ -513,14 +513,34 @@ cmLocalUnixMakefileGenerator3
 #ifndef __APPLE__
   return std::string();
 #else
+  std::set<cmStdString> emitted;
+  std::vector<std::string> includes;
+  this->GetIncludeDirectories(includes);
+  std::vector<std::string>::iterator i;
+  // check all include directories for frameworks as this
+  // will already have added a -F for the framework
+  for(i = includes.begin(); i != includes.end(); ++i)
+    {
+    if(cmSystemTools::IsPathToFramework(i->c_str()))
+      {
+      std::string frameworkDir = *i;
+      frameworkDir += "/../";
+      frameworkDir = cmSystemTools::CollapseFullPath(frameworkDir.c_str());
+      emitted.insert(frameworkDir);
+      }
+    }
+
   std::string flags;
   std::vector<std::string>& frameworks = target.GetFrameworks();
-  for(std::vector<std::string>::iterator i = frameworks.begin();
+  for(i = frameworks.begin();
       i != frameworks.end(); ++i)
     {
-    flags += "-F";
-    flags += this->ConvertToOutputForExisting(i->c_str());
-    flags += " ";
+    if(emitted.insert(*i).second)
+      {
+      flags += "-F";
+      flags += this->ConvertToOutputForExisting(i->c_str());
+      flags += " ";
+      }
     }
   return flags;
 #endif