Improve signature of cmLocalGenerator::GetRealDependency

Allow file-level custom command dependencies to be skipped.
This commit is contained in:
Brad King 2010-12-08 16:51:16 -05:00
parent afc8906468
commit e30a775f68
7 changed files with 51 additions and 33 deletions

View File

@ -1334,11 +1334,13 @@ void cmGlobalXCodeGenerator
cc.GetDepends().begin(); cc.GetDepends().begin();
d != cc.GetDepends().end(); ++d) d != cc.GetDepends().end(); ++d)
{ {
std::string dep = std::string dep;
this->CurrentLocalGenerator->GetRealDependency(d->c_str(), if(this->CurrentLocalGenerator
configName); ->GetRealDependency(d->c_str(), configName, dep))
makefileStream << "\\\n" << this {
->ConvertToRelativeForMake(dep.c_str()); makefileStream << "\\\n" <<
this->ConvertToRelativeForMake(dep.c_str());
}
} }
makefileStream << "\n"; makefileStream << "\n";

View File

@ -1818,8 +1818,9 @@ void cmLocalGenerator::AddLanguageFlags(std::string& flags,
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
std::string cmLocalGenerator::GetRealDependency(const char* inName, bool cmLocalGenerator::GetRealDependency(const char* inName,
const char* config) const char* config,
std::string& dep)
{ {
// Older CMake code may specify the dependency using the target // Older CMake code may specify the dependency using the target
// output file rather than the target name. Such code would have // output file rather than the target name. Such code would have
@ -1855,7 +1856,8 @@ std::string cmLocalGenerator::GetRealDependency(const char* inName,
// it is a full path to a depend that has the same name // 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 // as a target but is in a different location so do not use
// the target as the depend // the target as the depend
return inName; dep = inName;
return true;
} }
} }
switch (target->GetType()) switch (target->GetType())
@ -1869,7 +1871,8 @@ std::string cmLocalGenerator::GetRealDependency(const char* inName,
// Get the location of the target's output file and depend on it. // Get the location of the target's output file and depend on it.
if(const char* location = target->GetLocation(config)) if(const char* location = target->GetLocation(config))
{ {
return location; dep = location;
return true;
} }
} }
break; break;
@ -1877,7 +1880,8 @@ std::string cmLocalGenerator::GetRealDependency(const char* inName,
case cmTarget::GLOBAL_TARGET: case cmTarget::GLOBAL_TARGET:
// Depending on a utility target may not work but just trust // Depending on a utility target may not work but just trust
// the user to have given a valid name. // the user to have given a valid name.
return inName; dep = inName;
return true;
case cmTarget::INSTALL_FILES: case cmTarget::INSTALL_FILES:
case cmTarget::INSTALL_PROGRAMS: case cmTarget::INSTALL_PROGRAMS:
case cmTarget::INSTALL_DIRECTORY: case cmTarget::INSTALL_DIRECTORY:
@ -1889,23 +1893,24 @@ std::string cmLocalGenerator::GetRealDependency(const char* inName,
if(cmSystemTools::FileIsFullPath(inName)) if(cmSystemTools::FileIsFullPath(inName))
{ {
// This is a full path. Return it as given. // This is a full path. Return it as given.
return inName; dep = inName;
return true;
} }
// Check for a source file in this directory that matches the // Check for a source file in this directory that matches the
// dependency. // dependency.
if(cmSourceFile* sf = this->Makefile->GetSource(inName)) if(cmSourceFile* sf = this->Makefile->GetSource(inName))
{ {
name = sf->GetFullPath(); dep = sf->GetFullPath();
return name; return true;
} }
// Treat the name as relative to the source directory in which it // Treat the name as relative to the source directory in which it
// was given. // was given.
name = this->Makefile->GetCurrentDirectory(); dep = this->Makefile->GetCurrentDirectory();
name += "/"; dep += "/";
name += inName; dep += inName;
return name; return true;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -164,8 +164,9 @@ public:
Otherwise the name is treated as a relative path with respect to Otherwise the name is treated as a relative path with respect to
the source directory of this generator. This should only be the source directory of this generator. This should only be
used for dependencies of custom commands. */ used for dependencies of custom commands. */
std::string GetRealDependency(const char* name, const char* config); bool GetRealDependency(const char* name, const char* config,
std::string& dep);
/** Translate a command as given in CMake code to the location of the /** Translate a command as given in CMake code to the location of the
executable if the command is the name of a CMake executable target. executable if the command is the name of a CMake executable target.
If that's not the case, just return the original name. */ If that's not the case, just return the original name. */

View File

@ -902,9 +902,12 @@ cmLocalUnixMakefileGenerator3
d != cc.GetDepends().end(); ++d) d != cc.GetDepends().end(); ++d)
{ {
// Lookup the real name of the dependency in case it is a CMake target. // Lookup the real name of the dependency in case it is a CMake target.
std::string dep = this->GetRealDependency std::string dep;
(d->c_str(), this->ConfigurationName.c_str()); if(this->GetRealDependency(d->c_str(), this->ConfigurationName.c_str(),
depends.push_back(dep); dep))
{
depends.push_back(dep);
}
} }
} }

View File

@ -686,10 +686,12 @@ cmLocalVisualStudio6Generator
++d) ++d)
{ {
// Lookup the real name of the dependency in case it is a CMake target. // Lookup the real name of the dependency in case it is a CMake target.
std::string dep = this->GetRealDependency(d->c_str(), std::string dep;
config.c_str()); if(this->GetRealDependency(d->c_str(), config.c_str(), dep))
fout << "\\\n\t" << {
this->ConvertToOptionallyRelativeOutputPath(dep.c_str()); fout << "\\\n\t" <<
this->ConvertToOptionallyRelativeOutputPath(dep.c_str());
}
} }
fout << "\n"; fout << "\n";

View File

@ -1624,9 +1624,12 @@ WriteCustomRule(std::ostream& fout,
++d) ++d)
{ {
// Get the real name of the dependency in case it is a CMake target. // Get the real name of the dependency in case it is a CMake target.
std::string dep = this->GetRealDependency(d->c_str(), i->c_str()); std::string dep;
fout << this->ConvertToXMLOutputPath(dep.c_str()) if(this->GetRealDependency(d->c_str(), i->c_str(), dep))
<< ";"; {
fout << this->ConvertToXMLOutputPath(dep.c_str())
<< ";";
}
} }
} }
fout << "\"\n"; fout << "\"\n";

View File

@ -386,10 +386,12 @@ cmVisualStudio10TargetGenerator::WriteCustomRule(cmSourceFile* source,
d != command.GetDepends().end(); d != command.GetDepends().end();
++d) ++d)
{ {
std::string dep = this->LocalGenerator-> std::string dep;
GetRealDependency(d->c_str(), i->c_str()); if(this->LocalGenerator->GetRealDependency(d->c_str(), i->c_str(), dep))
this->ConvertToWindowsSlash(dep); {
(*this->BuildFileStream ) << ";" << dep; this->ConvertToWindowsSlash(dep);
(*this->BuildFileStream ) << ";" << dep;
}
} }
(*this->BuildFileStream ) << ";%(AdditionalInputs)</AdditionalInputs>\n"; (*this->BuildFileStream ) << ";%(AdditionalInputs)</AdditionalInputs>\n";
this->WritePlatformConfigTag("Outputs", i->c_str(), 3); this->WritePlatformConfigTag("Outputs", i->c_str(), 3);