BUG: fix problem when a target name is the same as the output of a custom command
This commit is contained in:
parent
3ad6f7e880
commit
9baa760315
|
@ -1857,6 +1857,22 @@ std::string cmLocalGenerator::GetRealDependency(const char* inName,
|
|||
// Look for a CMake target with the given name.
|
||||
if(cmTarget* target = this->GlobalGenerator->FindTarget(0, name.c_str()))
|
||||
{
|
||||
// make sure it is not just a coincidence that the target name
|
||||
// found is part of the inName
|
||||
if(cmSystemTools::FileIsFullPath(inName))
|
||||
{
|
||||
std::string tLocation = target->GetLocation(config);
|
||||
tLocation = cmSystemTools::GetFilenamePath(tLocation);
|
||||
std::string depLocation = cmSystemTools::GetFilenamePath(
|
||||
std::string(inName));
|
||||
if(depLocation != tLocation)
|
||||
{
|
||||
// it is a full path to a depend that has the same name
|
||||
// as a target but is in a different location so do not use
|
||||
// the target as the depend
|
||||
return inName;
|
||||
}
|
||||
}
|
||||
switch (target->GetType())
|
||||
{
|
||||
case cmTarget::EXECUTABLE:
|
||||
|
|
|
@ -229,16 +229,42 @@ void cmTarget::TraceVSDependencies(std::string projFile,
|
|||
// add its dependencies to the list to check
|
||||
unsigned int i;
|
||||
for (i = 0; i < outsf->GetCustomCommand()->GetDepends().size(); ++i)
|
||||
{
|
||||
{
|
||||
std::string dep = cmSystemTools::GetFilenameName(
|
||||
outsf->GetCustomCommand()->GetDepends()[i]);
|
||||
if (cmSystemTools::GetFilenameLastExtension(dep) == ".exe")
|
||||
{
|
||||
dep = cmSystemTools::GetFilenameWithoutLastExtension(dep);
|
||||
}
|
||||
// watch for target dependencies,
|
||||
if(this->Makefile->GetLocalGenerator()->
|
||||
GetGlobalGenerator()->FindTarget(0, dep.c_str()))
|
||||
bool isUtility = false;
|
||||
// see if we can find a target with this name
|
||||
cmTarget* t = this->Makefile->GetLocalGenerator()->
|
||||
GetGlobalGenerator()->FindTarget(0, dep.c_str());
|
||||
if(t)
|
||||
{
|
||||
// if we find the target and the dep was given as a full
|
||||
// path, then make sure it was not a full path to something
|
||||
// else, and the fact that the name matched a target was
|
||||
// just a coincident
|
||||
if(cmSystemTools::FileIsFullPath(
|
||||
outsf->GetCustomCommand()->GetDepends()[i].c_str()))
|
||||
{
|
||||
std::string tLocation = t->GetLocation(0);
|
||||
tLocation = cmSystemTools::GetFilenamePath(tLocation);
|
||||
std::string depLocation = cmSystemTools::GetFilenamePath(
|
||||
std::string(outsf->GetCustomCommand()->GetDepends()[i].c_str()));
|
||||
if(depLocation == tLocation)
|
||||
{
|
||||
isUtility = true;
|
||||
}
|
||||
}
|
||||
// if it was not a full path then it must be a target
|
||||
else
|
||||
{
|
||||
isUtility = true;
|
||||
}
|
||||
}
|
||||
if(isUtility)
|
||||
{
|
||||
// add the depend as a utility on the target
|
||||
this->AddUtility(dep.c_str());
|
||||
|
|
Loading…
Reference in New Issue