Forráskód Böngészése

OS X: Encode -F framework search flag in per-language platform variable

Compilers for languages other than C and C++ on OS X may not understand
the -F framework search flag.  Create a new platform information
variable CMAKE_<LANG>_FRAMEWORK_SEARCH_FLAG to hold the flag, and set it
for C and CXX lanugages in the Platform/Darwin module.

Reported-by: Vittorio Giovara <[email protected]>
Brad King 12 éve
szülő
commit
2e13c36211

+ 5 - 0
Modules/Platform/Darwin.cmake

@@ -268,6 +268,11 @@ set(CMAKE_C_CREATE_MACOSX_FRAMEWORK
 set(CMAKE_CXX_CREATE_MACOSX_FRAMEWORK
 set(CMAKE_CXX_CREATE_MACOSX_FRAMEWORK
       "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
       "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
 
 
+# Set default framework search path flag for languages known to use a
+# preprocessor that may find headers in frameworks.
+set(CMAKE_C_FRAMEWORK_SEARCH_FLAG -F)
+set(CMAKE_CXX_FRAMEWORK_SEARCH_FLAG -F)
+set(CMAKE_Fortran_FRAMEWORK_SEARCH_FLAG -F)
 
 
 # default to searching for frameworks first
 # default to searching for frameworks first
 if(NOT DEFINED CMAKE_FIND_FRAMEWORK)
 if(NOT DEFINED CMAKE_FIND_FRAMEWORK)

+ 2 - 0
Source/cmDocumentVariables.cxx

@@ -1977,6 +1977,8 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
                      cmProperty::VARIABLE,0,0);
                      cmProperty::VARIABLE,0,0);
   cm->DefineProperty("CMAKE_<LANG>_FLAGS_RELWITHDEBINFO_INIT",
   cm->DefineProperty("CMAKE_<LANG>_FLAGS_RELWITHDEBINFO_INIT",
                      cmProperty::VARIABLE,0,0);
                      cmProperty::VARIABLE,0,0);
+  cm->DefineProperty("CMAKE_<LANG>_FRAMEWORK_SEARCH_FLAG",
+                     cmProperty::VARIABLE,0,0);
   cm->DefineProperty("CMAKE_<LANG>_INFORMATION_LOADED",
   cm->DefineProperty("CMAKE_<LANG>_INFORMATION_LOADED",
                      cmProperty::VARIABLE,0,0);
                      cmProperty::VARIABLE,0,0);
   cm->DefineProperty("CMAKE_<LANG>_LINK_FLAGS",
   cm->DefineProperty("CMAKE_<LANG>_LINK_FLAGS",

+ 23 - 9
Source/cmLocalGenerator.cxx

@@ -1253,6 +1253,12 @@ std::string cmLocalGenerator::GetIncludeFlags(
     sysIncludeFlag = this->Makefile->GetDefinition(sysFlagVar.c_str());
     sysIncludeFlag = this->Makefile->GetDefinition(sysFlagVar.c_str());
     }
     }
 
 
+  std::string fwSearchFlagVar = "CMAKE_";
+  fwSearchFlagVar += lang;
+  fwSearchFlagVar += "_FRAMEWORK_SEARCH_FLAG";
+  const char* fwSearchFlag =
+    this->Makefile->GetDefinition(fwSearchFlagVar.c_str());
+
   bool flagUsed = false;
   bool flagUsed = false;
   std::set<cmStdString> emitted;
   std::set<cmStdString> emitted;
 #ifdef __APPLE__
 #ifdef __APPLE__
@@ -1261,7 +1267,7 @@ std::string cmLocalGenerator::GetIncludeFlags(
   std::vector<std::string>::const_iterator i;
   std::vector<std::string>::const_iterator i;
   for(i = includes.begin(); i != includes.end(); ++i)
   for(i = includes.begin(); i != includes.end(); ++i)
     {
     {
-    if(this->Makefile->IsOn("APPLE")
+    if(fwSearchFlag && *fwSearchFlag && this->Makefile->IsOn("APPLE")
        && cmSystemTools::IsPathToFramework(i->c_str()))
        && cmSystemTools::IsPathToFramework(i->c_str()))
       {
       {
       std::string frameworkDir = *i;
       std::string frameworkDir = *i;
@@ -1271,8 +1277,8 @@ std::string cmLocalGenerator::GetIncludeFlags(
         {
         {
         OutputFormat format = forResponseFile? RESPONSE : SHELL;
         OutputFormat format = forResponseFile? RESPONSE : SHELL;
         includeFlags
         includeFlags
-          << "-F" << this->Convert(frameworkDir.c_str(),
-                                   START_OUTPUT, format, true)
+          << fwSearchFlag << this->Convert(frameworkDir.c_str(),
+                                           START_OUTPUT, format, true)
           << " ";
           << " ";
         }
         }
       continue;
       continue;
@@ -1770,13 +1776,21 @@ void cmLocalGenerator::OutputLinkLibraries(std::string& linkLibraries,
     }
     }
 
 
   // Append the framework search path flags.
   // Append the framework search path flags.
-  std::vector<std::string> const& fwDirs = cli.GetFrameworkPaths();
-  for(std::vector<std::string>::const_iterator fdi = fwDirs.begin();
-      fdi != fwDirs.end(); ++fdi)
+  std::string fwSearchFlagVar = "CMAKE_";
+  fwSearchFlagVar += linkLanguage;
+  fwSearchFlagVar += "_FRAMEWORK_SEARCH_FLAG";
+  const char* fwSearchFlag =
+    this->Makefile->GetDefinition(fwSearchFlagVar.c_str());
+  if(fwSearchFlag && *fwSearchFlag)
     {
     {
-    frameworkPath += "-F";
-    frameworkPath += this->Convert(fdi->c_str(), NONE, SHELL, false);
-    frameworkPath += " ";
+    std::vector<std::string> const& fwDirs = cli.GetFrameworkPaths();
+    for(std::vector<std::string>::const_iterator fdi = fwDirs.begin();
+        fdi != fwDirs.end(); ++fdi)
+      {
+      frameworkPath += fwSearchFlag;
+      frameworkPath += this->Convert(fdi->c_str(), NONE, SHELL, false);
+      frameworkPath += " ";
+      }
     }
     }
 
 
   // Append the library search path flags.
   // Append the library search path flags.

+ 11 - 3
Source/cmMakefileTargetGenerator.cxx

@@ -291,7 +291,7 @@ std::string cmMakefileTargetGenerator::GetFlags(const std::string &l)
 
 
     // Add include directory flags.
     // Add include directory flags.
     this->LocalGenerator->
     this->LocalGenerator->
-      AppendFlags(flags,this->GetFrameworkFlags().c_str());
+      AppendFlags(flags,this->GetFrameworkFlags(l).c_str());
 
 
     // Add target-specific flags.
     // Add target-specific flags.
     this->LocalGenerator->AddCompileOptions(flags, this->Target,
     this->LocalGenerator->AddCompileOptions(flags, this->Target,
@@ -1518,13 +1518,21 @@ void cmMakefileTargetGenerator::WriteTargetDriverRule(const char* main_output,
 }
 }
 
 
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
-std::string cmMakefileTargetGenerator::GetFrameworkFlags()
+std::string cmMakefileTargetGenerator::GetFrameworkFlags(std::string const& l)
 {
 {
  if(!this->Makefile->IsOn("APPLE"))
  if(!this->Makefile->IsOn("APPLE"))
    {
    {
    return std::string();
    return std::string();
    }
    }
 
 
+  std::string fwSearchFlagVar = "CMAKE_" + l + "_FRAMEWORK_SEARCH_FLAG";
+  const char* fwSearchFlag =
+    this->Makefile->GetDefinition(fwSearchFlagVar.c_str());
+  if(!(fwSearchFlag && *fwSearchFlag))
+    {
+    return std::string();
+    }
+
  std::set<cmStdString> emitted;
  std::set<cmStdString> emitted;
 #ifdef __APPLE__  /* don't insert this when crosscompiling e.g. to iphone */
 #ifdef __APPLE__  /* don't insert this when crosscompiling e.g. to iphone */
   emitted.insert("/System/Library/Frameworks");
   emitted.insert("/System/Library/Frameworks");
@@ -1559,7 +1567,7 @@ std::string cmMakefileTargetGenerator::GetFrameworkFlags()
       {
       {
       if(emitted.insert(*i).second)
       if(emitted.insert(*i).second)
         {
         {
-        flags += "-F";
+        flags += fwSearchFlag;
         flags += this->Convert(i->c_str(),
         flags += this->Convert(i->c_str(),
                                cmLocalGenerator::START_OUTPUT,
                                cmLocalGenerator::START_OUTPUT,
                                cmLocalGenerator::SHELL, true);
                                cmLocalGenerator::SHELL, true);

+ 1 - 1
Source/cmMakefileTargetGenerator.h

@@ -124,7 +124,7 @@ protected:
   void DriveCustomCommands(std::vector<std::string>& depends);
   void DriveCustomCommands(std::vector<std::string>& depends);
 
 
   // Return the a string with -F flags on apple
   // Return the a string with -F flags on apple
-  std::string GetFrameworkFlags();
+  std::string GetFrameworkFlags(std::string const& l);
 
 
   void AppendFortranFormatFlags(std::string& flags, cmSourceFile& source);
   void AppendFortranFormatFlags(std::string& flags, cmSourceFile& source);