diff options
author | Brad King <brad.king@kitware.com> | 2019-05-31 13:03:25 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2019-05-31 13:04:47 (GMT) |
commit | 82fec3784b8b89bd98ddf2c7462bfab11e6cbca4 (patch) | |
tree | 1f2ddeb4fa9cdd1778854dae353dcc84e41d594f /Source/cmVisualStudio10TargetGenerator.cxx | |
parent | 0d025f75c14c0f5a7b7199a0712c958f5703c24e (diff) | |
parent | 42bc67bd43ca67c98dc33f8cb8e2f4ee3884697f (diff) | |
download | CMake-82fec3784b8b89bd98ddf2c7462bfab11e6cbca4.zip CMake-82fec3784b8b89bd98ddf2c7462bfab11e6cbca4.tar.gz CMake-82fec3784b8b89bd98ddf2c7462bfab11e6cbca4.tar.bz2 |
Merge topic 'vs-depends-dedup'
42bc67bd43 VS: De-duplicate custom command dependencies
d03a6fc857 VS: Clarify name of custom commands AdditionalInputs variable
fcedf8e552 VS: Isolate custom command input/output generation scopes
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !3388
Diffstat (limited to 'Source/cmVisualStudio10TargetGenerator.cxx')
-rw-r--r-- | Source/cmVisualStudio10TargetGenerator.cxx | 62 |
1 files changed, 43 insertions, 19 deletions
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index d328a8c..3db3813 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -20,6 +20,7 @@ #include <iterator> #include <memory> // IWYU pragma: keep +#include <set> static void ConvertToWindowsSlash(std::string& s); @@ -1373,46 +1374,69 @@ void cmVisualStudio10TargetGenerator::WriteCustomRule( comment = cmVS10EscapeComment(comment); std::string script = lg->ConstructScript(ccg); // input files for custom command - std::stringstream inputs; - inputs << source->GetFullPath(); - for (std::string const& d : ccg.GetDepends()) { - std::string dep; - if (lg->GetRealDependency(d, c, dep)) { - ConvertToWindowsSlash(dep); - inputs << ";" << dep; + std::stringstream additional_inputs; + { + const char* sep = ""; + if (this->ProjectType == csproj) { + // csproj files do not attach the command to a specific file + // so the primary input must be listed explicitly. + additional_inputs << source->GetFullPath(); + sep = ";"; + } + + // Avoid listing an input more than once. + std::set<std::string> unique_inputs; + // The source is either implicit an input or has been added above. + unique_inputs.insert(source->GetFullPath()); + + for (std::string const& d : ccg.GetDepends()) { + std::string dep; + if (lg->GetRealDependency(d, c, dep)) { + if (!unique_inputs.insert(dep).second) { + // already listed + continue; + } + ConvertToWindowsSlash(dep); + additional_inputs << sep << dep; + sep = ";"; + } + } + if (this->ProjectType != csproj) { + additional_inputs << sep << "%(AdditionalInputs)"; } } // output files for custom command std::stringstream outputs; - const char* sep = ""; - for (std::string const& o : ccg.GetOutputs()) { - std::string out = o; - ConvertToWindowsSlash(out); - outputs << sep << out; - sep = ";"; + { + const char* sep = ""; + for (std::string const& o : ccg.GetOutputs()) { + std::string out = o; + ConvertToWindowsSlash(out); + outputs << sep << out; + sep = ";"; + } } if (this->ProjectType == csproj) { std::string name = "CustomCommand_" + c + "_" + cmSystemTools::ComputeStringMD5(sourcePath); - this->WriteCustomRuleCSharp(e0, c, name, script, inputs.str(), + this->WriteCustomRuleCSharp(e0, c, name, script, additional_inputs.str(), outputs.str(), comment); } else { - this->WriteCustomRuleCpp(*spe2, c, script, inputs.str(), outputs.str(), - comment); + this->WriteCustomRuleCpp(*spe2, c, script, additional_inputs.str(), + outputs.str(), comment); } } } void cmVisualStudio10TargetGenerator::WriteCustomRuleCpp( Elem& e2, std::string const& config, std::string const& script, - std::string const& inputs, std::string const& outputs, + std::string const& additional_inputs, std::string const& outputs, std::string const& comment) { const std::string cond = this->CalcCondition(config); e2.WritePlatformConfigTag("Message", cond, comment); e2.WritePlatformConfigTag("Command", cond, script); - e2.WritePlatformConfigTag("AdditionalInputs", cond, - inputs + ";%(AdditionalInputs)"); + e2.WritePlatformConfigTag("AdditionalInputs", cond, additional_inputs); e2.WritePlatformConfigTag("Outputs", cond, outputs); if (this->LocalGenerator->GetVersion() > cmGlobalVisualStudioGenerator::VS10) { |