summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrans van Dorsselaer <frans.vandorsselaer@foxcrypto.com>2019-05-28 15:53:13 +0200
committerBrad King <brad.king@kitware.com>2019-05-30 13:57:03 -0400
commit42bc67bd43ca67c98dc33f8cb8e2f4ee3884697f (patch)
tree1daa54a05775a5f07d85f9942c950d8c35ec0ab2
parentd03a6fc8578ac2b4191a74c8638d58b7f92ec6f1 (diff)
downloadcmake-42bc67bd43ca67c98dc33f8cb8e2f4ee3884697f.tar.gz
VS: De-duplicate custom command dependencies
Avoid listing the same input more than once in custom commands generated in `.vcxproj` and `.csproj` files. In the case of a `.vcxproj` file additionally avoid listing the source to which the command is attached since it is already implicitly a dependency. This is a nice cleanup and also works around a VS 2019 16.1 regression in MSBuild dependency checking. Starting with that version, MSBuild now re-builds custom commands when the list of dependencies has changed. However, its check is confused by duplicate dependencies. De-duplicating them avoids this problem. Co-Author: Brad King <brad.king@kitware.com> Fixes: #19303
-rw-r--r--Source/cmVisualStudio10TargetGenerator.cxx28
1 files changed, 24 insertions, 4 deletions
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 04052220ed..f2f5e3f63d 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -18,6 +18,7 @@
#include <iterator>
#include <memory> // IWYU pragma: keep
+#include <set>
static void ConvertToWindowsSlash(std::string& s);
@@ -1355,14 +1356,34 @@ void cmVisualStudio10TargetGenerator::WriteCustomRule(
// input files for custom command
std::stringstream additional_inputs;
{
- additional_inputs << source->GetFullPath();
+ 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 << ";" << dep;
+ additional_inputs << sep << dep;
+ sep = ";";
}
}
+ if (this->ProjectType != csproj) {
+ additional_inputs << sep << "%(AdditionalInputs)";
+ }
}
// output files for custom command
std::stringstream outputs;
@@ -1395,8 +1416,7 @@ void cmVisualStudio10TargetGenerator::WriteCustomRuleCpp(
const std::string cond = this->CalcCondition(config);
e2.WritePlatformConfigTag("Message", cond, comment);
e2.WritePlatformConfigTag("Command", cond, script);
- e2.WritePlatformConfigTag("AdditionalInputs", cond,
- additional_inputs + ";%(AdditionalInputs)");
+ e2.WritePlatformConfigTag("AdditionalInputs", cond, additional_inputs);
e2.WritePlatformConfigTag("Outputs", cond, outputs);
if (this->LocalGenerator->GetVersion() >
cmGlobalVisualStudioGenerator::VS10) {