Optimize custom command full-path dependency lookup
In the common case of custom command dependencies specified via full path optimize the implementation of GetSourceFileWithOutput using a (hash) map. This is significantly faster than the existing linear search. In the non-full-path case fall back to the existing linear suffix search.
This commit is contained in:
parent
eccb39d7f4
commit
2268c41a05
|
@ -150,6 +150,7 @@ cmMakefile::cmMakefile(const cmMakefile& mf): Internal(new Internals)
|
|||
this->Initialize();
|
||||
this->CheckSystemVars = mf.CheckSystemVars;
|
||||
this->ListFileStack = mf.ListFileStack;
|
||||
this->OutputToSource = mf.OutputToSource;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
@ -1010,10 +1011,31 @@ cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs,
|
|||
cc->SetEscapeOldStyle(escapeOldStyle);
|
||||
cc->SetEscapeAllowMakeVars(true);
|
||||
file->SetCustomCommand(cc);
|
||||
this->UpdateOutputToSourceMap(outputs, file);
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void
|
||||
cmMakefile::UpdateOutputToSourceMap(std::vector<std::string> const& outputs,
|
||||
cmSourceFile* source)
|
||||
{
|
||||
for(std::vector<std::string>::const_iterator o = outputs.begin();
|
||||
o != outputs.end(); ++o)
|
||||
{
|
||||
this->UpdateOutputToSourceMap(*o, source);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void
|
||||
cmMakefile::UpdateOutputToSourceMap(std::string const& output,
|
||||
cmSourceFile* source)
|
||||
{
|
||||
this->OutputToSource[output] = source;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
cmSourceFile*
|
||||
cmMakefile::AddCustomCommandToOutput(const char* output,
|
||||
|
@ -1994,7 +2016,7 @@ cmMakefile::AddNewTarget(cmTarget::TargetType type, const char* name)
|
|||
return &it->second;
|
||||
}
|
||||
|
||||
cmSourceFile *cmMakefile::GetSourceFileWithOutput(const char *cname)
|
||||
cmSourceFile *cmMakefile::LinearGetSourceFileWithOutput(const char *cname)
|
||||
{
|
||||
std::string name = cname;
|
||||
std::string out;
|
||||
|
@ -2030,6 +2052,25 @@ cmSourceFile *cmMakefile::GetSourceFileWithOutput(const char *cname)
|
|||
return 0;
|
||||
}
|
||||
|
||||
cmSourceFile *cmMakefile::GetSourceFileWithOutput(const char *cname)
|
||||
{
|
||||
std::string name = cname;
|
||||
|
||||
// If the queried path is not absolute we use the backward compatible
|
||||
// linear-time search for an output with a matching suffix.
|
||||
if(!cmSystemTools::FileIsFullPath(cname))
|
||||
{
|
||||
return LinearGetSourceFileWithOutput(cname);
|
||||
}
|
||||
// Otherwise we use an efficient lookup map.
|
||||
OutputToSourceMap::iterator o = this->OutputToSource.find(name);
|
||||
if (o != this->OutputToSource.end())
|
||||
{
|
||||
return (*o).second;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CMAKE_BUILD_WITH_CMAKE)
|
||||
cmSourceGroup* cmMakefile::GetSourceGroup(const std::vector<std::string>&name)
|
||||
{
|
||||
|
|
|
@ -29,6 +29,9 @@
|
|||
|
||||
#include <cmsys/auto_ptr.hxx>
|
||||
#include <cmsys/RegularExpression.hxx>
|
||||
#if defined(CMAKE_BUILD_WITH_CMAKE)
|
||||
# include <cmsys/hash_map.hxx>
|
||||
#endif
|
||||
|
||||
class cmFunctionBlocker;
|
||||
class cmCommand;
|
||||
|
@ -1039,6 +1042,26 @@ private:
|
|||
|
||||
bool GeneratingBuildSystem;
|
||||
|
||||
/**
|
||||
* Old version of GetSourceFileWithOutput(const char*) kept for
|
||||
* backward-compatibility. It implements a linear search and support
|
||||
* relative file paths. It is used as a fall back by
|
||||
* GetSourceFileWithOutput(const char*).
|
||||
*/
|
||||
cmSourceFile *LinearGetSourceFileWithOutput(const char *cname);
|
||||
|
||||
// A map for fast output to input look up.
|
||||
#if defined(CMAKE_BUILD_WITH_CMAKE)
|
||||
typedef cmsys::hash_map<std::string, cmSourceFile*> OutputToSourceMap;
|
||||
#else
|
||||
typedef std::map<std::string, cmSourceFile*> OutputToSourceMap;
|
||||
#endif
|
||||
OutputToSourceMap OutputToSource;
|
||||
|
||||
void UpdateOutputToSourceMap(std::vector<std::string> const& outputs,
|
||||
cmSourceFile* source);
|
||||
void UpdateOutputToSourceMap(std::string const& output,
|
||||
cmSourceFile* source);
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue