CMake: Eliminate cmMakefile::IncludeDirectories
Instead, re-implement it in terms of the directory property INCLUDE_DIRECTORIES.
This commit is contained in:
parent
7620932d82
commit
8adaee2b0b
@ -1399,7 +1399,7 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the project-specified include directories.
|
// Get the project-specified include directories.
|
||||||
std::vector<std::string>& includes =
|
const std::vector<std::string>& includes =
|
||||||
this->Makefile->GetIncludeDirectories();
|
this->Makefile->GetIncludeDirectories();
|
||||||
|
|
||||||
// Support putting all the in-project include directories first if
|
// Support putting all the in-project include directories first if
|
||||||
@ -1408,7 +1408,7 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
|
|||||||
{
|
{
|
||||||
const char* topSourceDir = this->Makefile->GetHomeDirectory();
|
const char* topSourceDir = this->Makefile->GetHomeDirectory();
|
||||||
const char* topBinaryDir = this->Makefile->GetHomeOutputDirectory();
|
const char* topBinaryDir = this->Makefile->GetHomeOutputDirectory();
|
||||||
for(std::vector<std::string>::iterator i = includes.begin();
|
for(std::vector<std::string>::const_iterator i = includes.begin();
|
||||||
i != includes.end(); ++i)
|
i != includes.end(); ++i)
|
||||||
{
|
{
|
||||||
// Emit this directory only if it is a subdirectory of the
|
// Emit this directory only if it is a subdirectory of the
|
||||||
@ -1427,7 +1427,7 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Construct the final ordered include directory list.
|
// Construct the final ordered include directory list.
|
||||||
for(std::vector<std::string>::iterator i = includes.begin();
|
for(std::vector<std::string>::const_iterator i = includes.begin();
|
||||||
i != includes.end(); ++i)
|
i != includes.end(); ++i)
|
||||||
{
|
{
|
||||||
if(emitted.insert(*i).second)
|
if(emitted.insert(*i).second)
|
||||||
|
@ -116,7 +116,6 @@ cmMakefile::cmMakefile(const cmMakefile& mf): Internal(new Internals)
|
|||||||
this->Targets = mf.Targets;
|
this->Targets = mf.Targets;
|
||||||
this->SourceFiles = mf.SourceFiles;
|
this->SourceFiles = mf.SourceFiles;
|
||||||
this->Tests = mf.Tests;
|
this->Tests = mf.Tests;
|
||||||
this->IncludeDirectories = mf.IncludeDirectories;
|
|
||||||
this->LinkDirectories = mf.LinkDirectories;
|
this->LinkDirectories = mf.LinkDirectories;
|
||||||
this->SystemIncludeDirectories = mf.SystemIncludeDirectories;
|
this->SystemIncludeDirectories = mf.SystemIncludeDirectories;
|
||||||
this->ListFiles = mf.ListFiles;
|
this->ListFiles = mf.ListFiles;
|
||||||
@ -278,8 +277,6 @@ void cmMakefile::Print()
|
|||||||
this->cmHomeDirectory.c_str() << std::endl;
|
this->cmHomeDirectory.c_str() << std::endl;
|
||||||
std::cout << " this->ProjectName; "
|
std::cout << " this->ProjectName; "
|
||||||
<< this->ProjectName.c_str() << std::endl;
|
<< this->ProjectName.c_str() << std::endl;
|
||||||
this->PrintStringVector("this->IncludeDirectories;",
|
|
||||||
this->IncludeDirectories);
|
|
||||||
this->PrintStringVector("this->LinkDirectories", this->LinkDirectories);
|
this->PrintStringVector("this->LinkDirectories", this->LinkDirectories);
|
||||||
#if defined(CMAKE_BUILD_WITH_CMAKE)
|
#if defined(CMAKE_BUILD_WITH_CMAKE)
|
||||||
for( std::vector<cmSourceGroup>::const_iterator i =
|
for( std::vector<cmSourceGroup>::const_iterator i =
|
||||||
@ -1478,7 +1475,8 @@ void cmMakefile::InitializeFromParent()
|
|||||||
this->Internal->VarStack.top() = parent->Internal->VarStack.top().Closure();
|
this->Internal->VarStack.top() = parent->Internal->VarStack.top().Closure();
|
||||||
|
|
||||||
// copy include paths
|
// copy include paths
|
||||||
this->IncludeDirectories = parent->IncludeDirectories;
|
this->SetProperty("INCLUDE_DIRECTORIES",
|
||||||
|
parent->GetProperty("INCLUDE_DIRECTORIES"));
|
||||||
this->SystemIncludeDirectories = parent->SystemIncludeDirectories;
|
this->SystemIncludeDirectories = parent->SystemIncludeDirectories;
|
||||||
|
|
||||||
// define flags
|
// define flags
|
||||||
@ -1603,43 +1601,77 @@ void cmMakefile::AddSubDirectory(const char* srcPath, const char *binPath,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void AddStringToProperty(cmProperty *prop, const char* name, const char* s,
|
||||||
|
bool before)
|
||||||
|
{
|
||||||
|
if (!prop)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't worry about duplicates at this point. We eliminate them when
|
||||||
|
// we convert the property to a vector in GetIncludeDirectories.
|
||||||
|
|
||||||
|
if (before)
|
||||||
|
{
|
||||||
|
const char *val = prop->GetValue();
|
||||||
|
cmOStringStream oss;
|
||||||
|
|
||||||
|
if(val && *val)
|
||||||
|
{
|
||||||
|
oss << s << ";" << val;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
oss << s;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string newVal = oss.str();
|
||||||
|
prop->Set(name, newVal.c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prop->Append(name, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
void cmMakefile::AddIncludeDirectory(const char* inc, bool before)
|
void cmMakefile::AddIncludeDirectory(const char* inc, bool before)
|
||||||
{
|
{
|
||||||
// if there is a newline then break it into multiple arguments
|
|
||||||
if (!inc)
|
if (!inc)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't add an include directory that is already present. Yes,
|
// Directory property:
|
||||||
// this linear search results in n^2 behavior, but n won't be
|
cmProperty *prop =
|
||||||
// getting much bigger than 20. We cannot use a set because of
|
this->GetProperties().GetOrCreateProperty("INCLUDE_DIRECTORIES");
|
||||||
// order dependency of the include path.
|
AddStringToProperty(prop, "INCLUDE_DIRECTORIES", inc, before);
|
||||||
std::vector<std::string>::iterator i =
|
}
|
||||||
std::find(this->IncludeDirectories.begin(),
|
|
||||||
this->IncludeDirectories.end(), inc);
|
//----------------------------------------------------------------------------
|
||||||
if(i == this->IncludeDirectories.end())
|
std::vector<std::string> cmMakefile::GetIncludeDirectories()
|
||||||
|
{
|
||||||
|
std::vector<std::string> includes;
|
||||||
|
const char *val = this->GetProperty("INCLUDE_DIRECTORIES");
|
||||||
|
if(val)
|
||||||
{
|
{
|
||||||
if (before)
|
cmSystemTools::ExpandListArgument(val, includes);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::set<std::string> uniqueIncludes;
|
||||||
|
std::vector<std::string> orderedAndUniqueIncludes;
|
||||||
|
for(std::vector<std::string>::const_iterator
|
||||||
|
li = includes.begin(); li != includes.end(); ++li)
|
||||||
|
{
|
||||||
|
if(uniqueIncludes.insert(*li).second)
|
||||||
{
|
{
|
||||||
// WARNING: this *is* expensive (linear time) since it's a vector
|
orderedAndUniqueIncludes.push_back(*li);
|
||||||
this->IncludeDirectories.insert(this->IncludeDirectories.begin(), inc);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this->IncludeDirectories.push_back(inc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(before)
|
|
||||||
{
|
|
||||||
// if this before and already in the path then remove it
|
|
||||||
this->IncludeDirectories.erase(i);
|
|
||||||
// WARNING: this *is* expensive (linear time) since it's a vector
|
|
||||||
this->IncludeDirectories.insert(this->IncludeDirectories.begin(), inc);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return orderedAndUniqueIncludes;
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@ -2093,17 +2125,23 @@ void cmMakefile::AddExtraDirectory(const char* dir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// expance CMAKE_BINARY_DIR and CMAKE_SOURCE_DIR in the
|
// expand CMAKE_BINARY_DIR and CMAKE_SOURCE_DIR in the
|
||||||
// include and library directories.
|
// include and library directories.
|
||||||
|
|
||||||
void cmMakefile::ExpandVariables()
|
void cmMakefile::ExpandVariables()
|
||||||
{
|
{
|
||||||
// Now expand variables in the include and link strings
|
// Now expand variables in the include and link strings
|
||||||
for(std::vector<std::string>::iterator d = this->IncludeDirectories.begin();
|
|
||||||
d != this->IncludeDirectories.end(); ++d)
|
// May not be necessary anymore... But may need a policy for strict
|
||||||
|
// backwards compatibility
|
||||||
|
const char *includeDirs = this->GetProperty("INCLUDE_DIRECTORIES");
|
||||||
|
if (includeDirs)
|
||||||
{
|
{
|
||||||
this->ExpandVariablesInString(*d, true, true);
|
std::string dirs = includeDirs;
|
||||||
|
this->ExpandVariablesInString(dirs, true, true);
|
||||||
|
this->SetProperty("INCLUDE_DIRECTORIES", dirs.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
for(std::vector<std::string>::iterator d = this->LinkDirectories.begin();
|
for(std::vector<std::string>::iterator d = this->LinkDirectories.begin();
|
||||||
d != this->LinkDirectories.end(); ++d)
|
d != this->LinkDirectories.end(); ++d)
|
||||||
{
|
{
|
||||||
@ -3317,16 +3355,6 @@ void cmMakefile::SetProperty(const char* prop, const char* value)
|
|||||||
|
|
||||||
// handle special props
|
// handle special props
|
||||||
std::string propname = prop;
|
std::string propname = prop;
|
||||||
if ( propname == "INCLUDE_DIRECTORIES" )
|
|
||||||
{
|
|
||||||
std::vector<std::string> varArgsExpanded;
|
|
||||||
if(value)
|
|
||||||
{
|
|
||||||
cmSystemTools::ExpandListArgument(value, varArgsExpanded);
|
|
||||||
}
|
|
||||||
this->SetIncludeDirectories(varArgsExpanded);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( propname == "LINK_DIRECTORIES" )
|
if ( propname == "LINK_DIRECTORIES" )
|
||||||
{
|
{
|
||||||
@ -3368,17 +3396,6 @@ void cmMakefile::AppendProperty(const char* prop, const char* value,
|
|||||||
|
|
||||||
// handle special props
|
// handle special props
|
||||||
std::string propname = prop;
|
std::string propname = prop;
|
||||||
if ( propname == "INCLUDE_DIRECTORIES" )
|
|
||||||
{
|
|
||||||
std::vector<std::string> varArgsExpanded;
|
|
||||||
cmSystemTools::ExpandListArgument(value, varArgsExpanded);
|
|
||||||
for(std::vector<std::string>::const_iterator vi = varArgsExpanded.begin();
|
|
||||||
vi != varArgsExpanded.end(); ++vi)
|
|
||||||
{
|
|
||||||
this->AddIncludeDirectory(vi->c_str());
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( propname == "LINK_DIRECTORIES" )
|
if ( propname == "LINK_DIRECTORIES" )
|
||||||
{
|
{
|
||||||
@ -3474,23 +3491,6 @@ const char *cmMakefile::GetProperty(const char* prop,
|
|||||||
output += this->DefineFlagsOrig;
|
output += this->DefineFlagsOrig;
|
||||||
return output.c_str();
|
return output.c_str();
|
||||||
}
|
}
|
||||||
else if (!strcmp("INCLUDE_DIRECTORIES",prop) )
|
|
||||||
{
|
|
||||||
cmOStringStream str;
|
|
||||||
for (std::vector<std::string>::const_iterator
|
|
||||||
it = this->GetIncludeDirectories().begin();
|
|
||||||
it != this->GetIncludeDirectories().end();
|
|
||||||
++ it )
|
|
||||||
{
|
|
||||||
if ( it != this->GetIncludeDirectories().begin())
|
|
||||||
{
|
|
||||||
str << ";";
|
|
||||||
}
|
|
||||||
str << it->c_str();
|
|
||||||
}
|
|
||||||
output = str.str();
|
|
||||||
return output.c_str();
|
|
||||||
}
|
|
||||||
else if (!strcmp("LINK_DIRECTORIES",prop))
|
else if (!strcmp("LINK_DIRECTORIES",prop))
|
||||||
{
|
{
|
||||||
cmOStringStream str;
|
cmOStringStream str;
|
||||||
|
@ -524,18 +524,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Get a list of include directories in the build.
|
* Get a list of include directories in the build.
|
||||||
*/
|
*/
|
||||||
std::vector<std::string>& GetIncludeDirectories()
|
std::vector<std::string> GetIncludeDirectories();
|
||||||
{
|
|
||||||
return this->IncludeDirectories;
|
|
||||||
}
|
|
||||||
const std::vector<std::string>& GetIncludeDirectories() const
|
|
||||||
{
|
|
||||||
return this->IncludeDirectories;
|
|
||||||
}
|
|
||||||
void SetIncludeDirectories(const std::vector<std::string>& vec)
|
|
||||||
{
|
|
||||||
this->IncludeDirectories = vec;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mark include directories as system directories.
|
* Mark include directories as system directories.
|
||||||
@ -880,9 +869,7 @@ protected:
|
|||||||
// Tests
|
// Tests
|
||||||
std::map<cmStdString, cmTest*> Tests;
|
std::map<cmStdString, cmTest*> Tests;
|
||||||
|
|
||||||
// The include and link-library paths. These may have order
|
// The link-library paths. Order matters, use std::vector (not std::set).
|
||||||
// dependency, so they must be vectors (not set).
|
|
||||||
std::vector<std::string> IncludeDirectories;
|
|
||||||
std::vector<std::string> LinkDirectories;
|
std::vector<std::string> LinkDirectories;
|
||||||
|
|
||||||
// The set of include directories that are marked as system include
|
// The set of include directories that are marked as system include
|
||||||
|
Loading…
x
Reference in New Issue
Block a user