-improve crosscompiling from Linux to iphone (#10526)

Patch by Karol Krizka

Alex
This commit is contained in:
Alex Neundorf 2010-05-01 14:29:13 +02:00
parent 42c40884d2
commit 3901e0408c
7 changed files with 33 additions and 19 deletions

View File

@ -423,3 +423,17 @@ void cmFindCommon::AddTrailingSlashes(std::vector<std::string>& paths)
}
}
}
//----------------------------------------------------------------------------
void cmFindCommon::SetMakefile(cmMakefile* makefile)
{
cmCommand::SetMakefile(makefile);
// If we are building for Apple (OSX or also iphone), make sure
// that frameworks and bundles are searched first.
if(this->Makefile->IsOn("APPLE"))
{
this->SearchFrameworkFirst = true;
this->SearchAppBundleFirst = true;
}
}

View File

@ -61,6 +61,8 @@ protected:
PathType pathType);
void AddPathInternal(std::string const& in_path, PathType pathType);
void SetMakefile(cmMakefile* makefile);
bool NoDefaultPath;
bool NoCMakePath;
bool NoCMakeEnvironmentPath;

View File

@ -712,9 +712,7 @@ void cmLocalGenerator::AddBuildTargetRule(const char* llang, cmTarget& target)
std::string langFlags;
this->AddLanguageFlags(langFlags, llang, 0);
#ifdef __APPLE__
this->AddArchitectureFlags(langFlags, &target, llang, 0);
#endif /* __APPLE__ */
vars.LanguageCompileFlags = langFlags.c_str();
cmCustomCommandLines commandLines;
@ -1272,8 +1270,8 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
#endif
for(i = includes.begin(); i != includes.end(); ++i)
{
#ifdef __APPLE__
if(cmSystemTools::IsPathToFramework(i->c_str()))
if(this->Makefile->IsOn("APPLE")
&& cmSystemTools::IsPathToFramework(i->c_str()))
{
std::string frameworkDir = *i;
frameworkDir += "/../";
@ -1288,7 +1286,7 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
}
continue;
}
#endif
std::string include = *i;
if(!flagUsed || repeatFlag)
{
@ -1766,12 +1764,17 @@ void cmLocalGenerator::OutputLinkLibraries(std::ostream& fout,
//----------------------------------------------------------------------------
#ifdef __APPLE__
void cmLocalGenerator::AddArchitectureFlags(std::string& flags,
cmTarget* target,
const char *lang,
const char* config)
{
// Only add Mac OS X specific flags on Darwin platforms (OSX and iphone):
if(!this->Makefile->IsOn("APPLE"))
{
return;
}
if(this->EmitUniversalBinaryFlags)
{
std::vector<std::string> archs;
@ -1828,7 +1831,6 @@ void cmLocalGenerator::AddArchitectureFlags(std::string& flags,
}
}
}
#endif /* __APPLE__ */
//----------------------------------------------------------------------------

View File

@ -133,10 +133,8 @@ public:
std::vector<cmLocalGenerator*>& GetChildren() { return this->Children; };
#ifdef __APPLE__
void AddArchitectureFlags(std::string& flags, cmTarget* target,
const char *lang, const char* config);
#endif /* __APPLE__ */
void AddLanguageFlags(std::string& flags, const char* lang,
const char* config);

View File

@ -229,10 +229,8 @@ void cmMakefileExecutableTargetGenerator::WriteExecutableRule(bool relink)
// Add language feature flags.
this->AddFeatureFlags(flags, linkLanguage);
#ifdef __APPLE__
this->LocalGenerator->AddArchitectureFlags(flags, this->Target,
linkLanguage, this->ConfigName);
#endif /* __APPLE__ */
// Add target-specific linker flags.
this->LocalGenerator->AppendFlags

View File

@ -682,10 +682,8 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules
std::string langFlags;
this->AddFeatureFlags(langFlags, linkLanguage);
#ifdef __APPLE__
this->LocalGenerator->AddArchitectureFlags(langFlags, this->Target,
linkLanguage, this->ConfigName);
#endif /* __APPLE__ */
// remove any language flags that might not work with the
// particular os

View File

@ -294,10 +294,8 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags()
// Add language feature flags.
this->AddFeatureFlags(flags, lang);
#ifdef __APPLE__
this->LocalGenerator->AddArchitectureFlags(flags, this->Target,
lang, this->ConfigName);
#endif /* __APPLE__ */
// Fortran-specific flags computed for this target.
if(*l == "Fortran")
@ -1439,11 +1437,15 @@ void cmMakefileTargetGenerator::WriteTargetDriverRule(const char* main_output,
//----------------------------------------------------------------------------
std::string cmMakefileTargetGenerator::GetFrameworkFlags()
{
#ifndef __APPLE__
if(!this->Makefile->IsOn("APPLE"))
{
return std::string();
#else
}
std::set<cmStdString> emitted;
#ifdef __APPLE__ /* don't insert this when crosscompiling e.g. to iphone */
emitted.insert("/System/Library/Frameworks");
#else
std::vector<std::string> includes;
this->LocalGenerator->GetIncludeDirectories(includes);
std::vector<std::string>::iterator i;