From 15c7d45ecd787b74eb4a4dc5cafe69bd92351938 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 26 Apr 2005 11:08:18 -0400 Subject: BUG: Fixed ordering of multiple commands in a custom target when implemented as custom commands. Also added support to execute pre-build rules first to be consistent with makefile generator. --- Source/cmLocalVisualStudio6Generator.cxx | 97 ++++++++++++++++++++++++-------- Source/cmLocalVisualStudio6Generator.h | 3 + 2 files changed, 75 insertions(+), 25 deletions(-) diff --git a/Source/cmLocalVisualStudio6Generator.cxx b/Source/cmLocalVisualStudio6Generator.cxx index 5c73194..ae19cc7 100644 --- a/Source/cmLocalVisualStudio6Generator.cxx +++ b/Source/cmLocalVisualStudio6Generator.cxx @@ -217,35 +217,48 @@ void cmLocalVisualStudio6Generator::WriteDSPFile(std::ostream& fout, this->AddDSPBuildRule(); } - // for utility targets need custom command since post build doesn't - // do anything (Visual Studio 7 seems to do this correctly without - // the hack) - if (target.GetType() == cmTarget::UTILITY && - target.GetPostBuildCommands().size()) + // For utility targets need custom command since pre- and post- + // build does not do anything in Visual Studio 6. In order for the + // rules to run in the correct order as custom commands, we need + // special care for dependencies. The first rule must depend on all + // the dependencies of all the rules. The later rules must each + // depend only on the previous rule. + if (target.GetType() == cmTarget::UTILITY && + (!target.GetPreBuildCommands().empty() || + !target.GetPostBuildCommands().empty())) { + // Accumulate the dependencies of all the commands. + std::vector depends; + for (std::vector::const_iterator cr = + target.GetPreBuildCommands().begin(); + cr != target.GetPreBuildCommands().end(); ++cr) + { + depends.insert(depends.end(), + cr->GetDepends().begin(), cr->GetDepends().end()); + } + for (std::vector::const_iterator cr = + target.GetPostBuildCommands().begin(); + cr != target.GetPostBuildCommands().end(); ++cr) + { + depends.insert(depends.end(), + cr->GetDepends().begin(), cr->GetDepends().end()); + } + + // Add the pre- and post-build commands in order. int count = 1; - for (std::vector::const_iterator cr = - target.GetPostBuildCommands().begin(); + for (std::vector::const_iterator cr = + target.GetPreBuildCommands().begin(); + cr != target.GetPreBuildCommands().end(); ++cr) + { + this->AddUtilityCommandHack(target, count++, depends, + cr->GetCommandLines()); + } + for (std::vector::const_iterator cr = + target.GetPostBuildCommands().begin(); cr != target.GetPostBuildCommands().end(); ++cr) { - char *output = new char [ - strlen(m_Makefile->GetStartOutputDirectory()) + - strlen(libName) + 30]; - sprintf(output,"%s/%s_force_%i", - m_Makefile->GetStartOutputDirectory(), - libName, count); - const char* no_main_dependency = 0; - const char* no_comment = 0; - m_Makefile->AddCustomCommandToOutput(output, - cr->GetDepends(), - no_main_dependency, - cr->GetCommandLines(), - no_comment); - cmSourceFile* outsf = - m_Makefile->GetSourceFileWithOutput(output); - target.GetSourceFiles().push_back(outsf); - count++; - delete [] output; + this->AddUtilityCommandHack(target, count++, depends, + cr->GetCommandLines()); } } @@ -409,6 +422,40 @@ void cmLocalVisualStudio6Generator::WriteDSPFile(std::ostream& fout, } +void +cmLocalVisualStudio6Generator +::AddUtilityCommandHack(cmTarget& target, int count, + std::vector& depends, + const cmCustomCommandLines& commandLines) +{ + // Create a fake output that forces the rule to run. + char* output = new char[(strlen(m_Makefile->GetStartOutputDirectory()) + + strlen(target.GetName()) + 30)]; + sprintf(output,"%s/%s_force_%i", m_Makefile->GetStartOutputDirectory(), + target.GetName(), count); + + // Add the rule with the given dependencies and commands. + const char* no_main_dependency = 0; + const char* no_comment = 0; + m_Makefile->AddCustomCommandToOutput(output, + depends, + no_main_dependency, + commandLines, + no_comment); + + // Replace the dependencies with the output of this rule so that the + // next rule added will run after this one. + depends.clear(); + depends.push_back(output); + + // Add a source file representing this output to the project. + cmSourceFile* outsf = m_Makefile->GetSourceFileWithOutput(output); + target.GetSourceFiles().push_back(outsf); + + // Free the fake output name. + delete [] output; +} + void cmLocalVisualStudio6Generator::WriteCustomRule(std::ostream& fout, const char* source, const char* command, diff --git a/Source/cmLocalVisualStudio6Generator.h b/Source/cmLocalVisualStudio6Generator.h index 6e3d459..c96deb0 100644 --- a/Source/cmLocalVisualStudio6Generator.h +++ b/Source/cmLocalVisualStudio6Generator.h @@ -87,6 +87,9 @@ private: const std::vector& depends, const char* output, const char* flags); + void AddUtilityCommandHack(cmTarget& target, int count, + std::vector& depends, + const cmCustomCommandLines& commandLines); std::string CreateTargetRules(const cmTarget &target, const char *libName); -- cgit v0.12