ENH: Split part of GetIncludeFlags method into separate GetIncludeDirectories method.

This commit is contained in:
Brad King 2004-10-26 10:15:49 -04:00
parent 2bad658304
commit 16e86a3ea9
2 changed files with 66 additions and 52 deletions

View File

@ -792,7 +792,7 @@ cmLocalGenerator::ConvertToOutputForExisting(const char* p)
}
const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
{
{
if(!lang)
{
return "";
@ -801,11 +801,56 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
{
return m_LanguageToIncludeFlags[lang].c_str();
}
// Output Include paths
cmOStringStream includeFlags;
std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories();
std::vector<std::string> includes;
this->GetIncludeDirectories(includes);
std::vector<std::string>::iterator i;
std::map<cmStdString, cmStdString> implicitIncludes;
std::string flagVar = "CMAKE_INCLUDE_FLAG_";
flagVar += lang;
const char* includeFlag = m_Makefile->GetDefinition(flagVar.c_str());
flagVar = "CMAKE_INCLUDE_FLAG_SEP_";
flagVar += lang;
const char* sep = m_Makefile->GetDefinition(flagVar.c_str());
bool repeatFlag = true; // should the include flag be repeated like ie. -IA -IB
if(!sep)
{
sep = " ";
}
else
{
// if there is a separator then the flag is not repeated but is only given once
// i.e. -classpath a:b:c
repeatFlag = false;
}
bool flagUsed = false;
for(i = includes.begin(); i != includes.end(); ++i)
{
std::string include = *i;
if(!flagUsed || repeatFlag)
{
includeFlags << includeFlag;
flagUsed = true;
}
includeFlags << this->ConvertToOutputForExisting(i->c_str()) << sep;
}
std::string flags = includeFlags.str();
// remove trailing separators
if((sep[0] != ' ') && flags[flags.size()-1] == sep[0])
{
flags[flags.size()-1] = ' ';
}
flags += m_Makefile->GetDefineFlags();
m_LanguageToIncludeFlags[lang] = flags;
return m_LanguageToIncludeFlags[lang].c_str();
}
//----------------------------------------------------------------------------
void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs)
{
// Output Include paths
std::set<cmStdString> implicitIncludes;
// CMake versions below 2.0 would add the source tree to the -I path
// automatically. Preserve compatibility.
@ -838,34 +883,16 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
includeSourceDir = true;
}
}
std::string flagVar = "CMAKE_INCLUDE_FLAG_";
flagVar += lang;
const char* includeFlag = m_Makefile->GetDefinition(flagVar.c_str());
flagVar = "CMAKE_INCLUDE_FLAG_SEP_";
flagVar += lang;
const char* sep = m_Makefile->GetDefinition(flagVar.c_str());
bool repeatFlag = true; // should the include flag be repeated like ie. -IA -IB
if(!sep)
{
sep = " ";
}
else
{
// if there is a separator then the flag is not repeated but is only given once
// i.e. -classpath a:b:c
repeatFlag = false;
}
bool flagUsed = false;
if(includeSourceDir)
{
includeFlags << includeFlag
<< this->ConvertToOutputForExisting(m_Makefile->GetStartDirectory())
<< sep;
flagUsed = true;
dirs.push_back(m_Makefile->GetStartDirectory());
}
implicitIncludes["/usr/include"] = "/usr/include";
// Do not explicitly add the standard include path "/usr/include".
// This can cause problems with certain standard library
// implementations because the wrong headers may be found first.
implicitIncludes.insert("/usr/include");
if(m_Makefile->GetDefinition("CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES"))
{
std::string arg = m_Makefile->GetDefinition("CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES");
@ -873,39 +900,22 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
cmSystemTools::ExpandListArgument(arg, implicitIncludeVec);
for(unsigned int k =0; k < implicitIncludeVec.size(); k++)
{
implicitIncludes[implicitIncludeVec[k]] = implicitIncludeVec[k];
implicitIncludes.insert(implicitIncludeVec[k]);
}
}
for(i = includes.begin(); i != includes.end(); ++i)
// Construct the ordered list.
std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories();
for(std::vector<std::string>::iterator i = includes.begin();
i != includes.end(); ++i)
{
std::string include = *i;
// Don't output a -I for the standard include path "/usr/include".
// This can cause problems with certain standard library
// implementations because the wrong headers may be found first.
if(implicitIncludes.find(include) == implicitIncludes.end())
if(implicitIncludes.find(*i) == implicitIncludes.end())
{
if(!flagUsed || repeatFlag)
{
includeFlags << includeFlag;
flagUsed = true;
}
includeFlags << this->ConvertToOutputForExisting(i->c_str()) << sep;
dirs.push_back(*i);
}
}
std::string flags = includeFlags.str();
// remove trailing separators
if((sep[0] != ' ') && flags[flags.size()-1] == sep[0])
{
flags[flags.size()-1] = ' ';
}
flags += m_Makefile->GetDefineFlags();
m_LanguageToIncludeFlags[lang] = flags;
return m_LanguageToIncludeFlags[lang].c_str();
}
void cmLocalGenerator::GetTargetFlags(std::string& linkLibs,
std::string& flags,
std::string& linkFlags,

View File

@ -105,6 +105,10 @@ protected:
///! Get the include flags for the current makefile and language
const char* GetIncludeFlags(const char* lang);
/** Get the include flags for the current makefile and language. */
void GetIncludeDirectories(std::vector<std::string>& dirs);
///! for existing files convert to output path and short path if spaces
std::string ConvertToOutputForExisting(const char* p);