diff --git a/Modules/Platform/Darwin.cmake b/Modules/Platform/Darwin.cmake index 72844b531..8ab3e2c12 100644 --- a/Modules/Platform/Darwin.cmake +++ b/Modules/Platform/Darwin.cmake @@ -268,6 +268,11 @@ set(CMAKE_C_CREATE_MACOSX_FRAMEWORK set(CMAKE_CXX_CREATE_MACOSX_FRAMEWORK " -o ") +# 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 if(NOT DEFINED CMAKE_FIND_FRAMEWORK) diff --git a/Source/cmDocumentVariables.cxx b/Source/cmDocumentVariables.cxx index 58634ea13..dbe1b0475 100644 --- a/Source/cmDocumentVariables.cxx +++ b/Source/cmDocumentVariables.cxx @@ -1977,6 +1977,8 @@ void cmDocumentVariables::DefineVariables(cmake* cm) cmProperty::VARIABLE,0,0); cm->DefineProperty("CMAKE__FLAGS_RELWITHDEBINFO_INIT", cmProperty::VARIABLE,0,0); + cm->DefineProperty("CMAKE__FRAMEWORK_SEARCH_FLAG", + cmProperty::VARIABLE,0,0); cm->DefineProperty("CMAKE__INFORMATION_LOADED", cmProperty::VARIABLE,0,0); cm->DefineProperty("CMAKE__LINK_FLAGS", diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 9174e260b..3dde19faa 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -1253,6 +1253,12 @@ std::string cmLocalGenerator::GetIncludeFlags( 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; std::set emitted; #ifdef __APPLE__ @@ -1261,7 +1267,7 @@ std::string cmLocalGenerator::GetIncludeFlags( std::vector::const_iterator 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())) { std::string frameworkDir = *i; @@ -1271,8 +1277,8 @@ std::string cmLocalGenerator::GetIncludeFlags( { OutputFormat format = forResponseFile? RESPONSE : SHELL; includeFlags - << "-F" << this->Convert(frameworkDir.c_str(), - START_OUTPUT, format, true) + << fwSearchFlag << this->Convert(frameworkDir.c_str(), + START_OUTPUT, format, true) << " "; } continue; @@ -1770,13 +1776,21 @@ void cmLocalGenerator::OutputLinkLibraries(std::string& linkLibraries, } // Append the framework search path flags. - std::vector const& fwDirs = cli.GetFrameworkPaths(); - for(std::vector::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 const& fwDirs = cli.GetFrameworkPaths(); + for(std::vector::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. diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index 42091e305..9ca91497d 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx @@ -291,7 +291,7 @@ std::string cmMakefileTargetGenerator::GetFlags(const std::string &l) // Add include directory flags. this->LocalGenerator-> - AppendFlags(flags,this->GetFrameworkFlags().c_str()); + AppendFlags(flags,this->GetFrameworkFlags(l).c_str()); // Add target-specific flags. 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")) { 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 emitted; #ifdef __APPLE__ /* don't insert this when crosscompiling e.g. to iphone */ emitted.insert("/System/Library/Frameworks"); @@ -1559,7 +1567,7 @@ std::string cmMakefileTargetGenerator::GetFrameworkFlags() { if(emitted.insert(*i).second) { - flags += "-F"; + flags += fwSearchFlag; flags += this->Convert(i->c_str(), cmLocalGenerator::START_OUTPUT, cmLocalGenerator::SHELL, true); diff --git a/Source/cmMakefileTargetGenerator.h b/Source/cmMakefileTargetGenerator.h index f7a1e2e56..ec2af1cdb 100644 --- a/Source/cmMakefileTargetGenerator.h +++ b/Source/cmMakefileTargetGenerator.h @@ -124,7 +124,7 @@ protected: void DriveCustomCommands(std::vector& depends); // 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);