summaryrefslogtreecommitdiffstats
path: root/Source/cmTarget.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2007-05-23 17:27:00 (GMT)
committerBrad King <brad.king@kitware.com>2007-05-23 17:27:00 (GMT)
commitc288da754a3f1221ca4ebfd9c9efb8c935d499d6 (patch)
tree998d24826c3e2e32158b8255d5c1c8715139761c /Source/cmTarget.cxx
parent702d785c9ae49015a770530a9c5f27e7bfaff716 (diff)
downloadCMake-c288da754a3f1221ca4ebfd9c9efb8c935d499d6.zip
CMake-c288da754a3f1221ca4ebfd9c9efb8c935d499d6.tar.gz
CMake-c288da754a3f1221ca4ebfd9c9efb8c935d499d6.tar.bz2
BUG: Target names in the COMMAND part of a custom command should not create a file-level dependency that forces the command to rerun when the executable target rebuilds, but the target-level dependency should still be created. Target names in a DEPENDS should do both a target-level and file-level dependency. Updated the BuildDepends test to check that this works.
Diffstat (limited to 'Source/cmTarget.cxx')
-rw-r--r--Source/cmTarget.cxx70
1 files changed, 32 insertions, 38 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 6ae0aef..da33e07 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -409,7 +409,29 @@ void cmTarget::SetMakefile(cmMakefile* mf)
}
-void
+void cmTarget::CheckForTargetsAsCommand(const cmCustomCommand& cc)
+{
+ for(cmCustomCommandLines::const_iterator cit = cc.GetCommandLines().begin();
+ cit != cc.GetCommandLines().end(); ++cit )
+ {
+ std::string const& command = *cit->begin();
+ // Look for a non-imported target with this name.
+ if(cmTarget* t = this->Makefile->GetLocalGenerator()->
+ GetGlobalGenerator()->FindTarget(0, command.c_str(), false))
+ {
+ if(t->GetType() == cmTarget::EXECUTABLE)
+ {
+ // The command refers to an executable target built in
+ // this project. Add the target-level dependency to make
+ // sure the executable is up to date before this custom
+ // command possibly runs.
+ this->AddUtility(command.c_str());
+ }
+ }
+ }
+}
+
+void
cmTarget
::CheckForTargetsAsCommand(const std::vector<cmCustomCommand>& commands)
{
@@ -417,20 +439,7 @@ cmTarget
cli != commands.end();
++cli )
{
- for(cmCustomCommandLines::const_iterator cit =
- cli->GetCommandLines().begin();
- cit!=cli->GetCommandLines().end();
- ++cit )
- {
- std::string command = *cit->begin();
- // see if we can find a target with this name
- cmTarget* t = this->Makefile->GetLocalGenerator()->
- GetGlobalGenerator()->FindTarget(0, command.c_str(), false);
- if ( ( t ) && ( t->GetType() ==cmTarget::EXECUTABLE ) )
- {
- this->AddUtility ( command.c_str() );
- }
- }
+ this->CheckForTargetsAsCommand(*cli);
}
}
@@ -566,24 +575,8 @@ void cmTarget::TraceVSDependencies(std::string projFile,
}
}
- // check if commands for this custom commands are names of targets and
- // if that's the case add these targets as dependencies
- std::vector<std::string> automaticTargetDepends;
- for(cmCustomCommandLines::const_iterator it=
- outsf->GetCustomCommand()->GetCommandLines().begin();
- it!=outsf->GetCustomCommand()->GetCommandLines().end();
- ++it)
- {
- const std::string& currentCommand = (*it)[0];
- // see if we can find a target with this name
- cmTarget* t = this->Makefile->GetLocalGenerator()->
- GetGlobalGenerator()->FindTarget(0, currentCommand.c_str(), false);
- if (( t) && (t->GetType()==cmTarget::EXECUTABLE))
- {
- automaticTargetDepends.push_back(currentCommand);
- }
- }
- outsf->GetCustomCommand()->AppendDepends(automaticTargetDepends);
+ // Add target-level dependencies for the commands.
+ this->CheckForTargetsAsCommand(*outsf->GetCustomCommand());
// add its dependencies to the list to check
for (unsigned int i = 0;
@@ -598,10 +591,9 @@ void cmTarget::TraceVSDependencies(std::string projFile,
dep = cmSystemTools::GetFilenameWithoutLastExtension(dep);
}
bool isUtility = false;
- // see if we can find a target with this name
- cmTarget* t = this->Makefile->GetLocalGenerator()->
- GetGlobalGenerator()->FindTarget(0, dep.c_str(), false);
- if(t)
+ // Check for a non-imported target with this name.
+ if(cmTarget* t = this->Makefile->GetLocalGenerator()->
+ GetGlobalGenerator()->FindTarget(0, dep.c_str(), false))
{
// 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
@@ -629,7 +621,9 @@ void cmTarget::TraceVSDependencies(std::string projFile,
}
if(isUtility)
{
- // add the depend as a utility on the target
+ // The dependency refers to a target built in this project.
+ // Add the target-level dependency to make sure the target
+ // is up to date before this custom command possibly runs.
this->AddUtility(dep.c_str());
}
else