Browse Source

VS: Restore support for VS 2019 with toolset v142 versions before 14.29

Since commit 7db3dbddb2 (VS: Suppress MSBuild default flags not
specified by project or user, 2025-06-02, v4.1.0-rc1~69^2) we suppress
the `-Zc:inline` default flag when the project/user does not specify it.
That triggers an apparent bug in VS 2019 with v142 toolset versions
before 14.29 in which MSBuild fails when both `-Zc:inline` and `-nologo`
are suppressed.  This happens when `CMAKE_VERBOSE_MAKEFILE` is enabled,
such as in `try_compile` projects like our builtin compiler inspection.

Since `-nologo` is incidental, avoid suppressing it if `-Zc:inline` is
also suppressed.  Limit this workaround to relevant toolset versions.

Fixes: #27439
Brad King 1 month ago
parent
commit
8c332a3c7f
1 changed files with 13 additions and 0 deletions
  1. 13 0
      Source/cmVisualStudio10TargetGenerator.cxx

+ 13 - 0
Source/cmVisualStudio10TargetGenerator.cxx

@@ -170,11 +170,17 @@ public:
       std::string const cond =
         this->TargetGenerator->CalcCondition(this->GetConfiguration());
       this->Parent->WritePlatformConfigTag(tag, cond, content);
+    } else if (!this->SuppressStartupBannerCondition.empty() &&
+               tag == "SuppressStartupBanner"_s) {
+      this->Parent->WritePlatformConfigTag(
+        tag, this->SuppressStartupBannerCondition, content);
     } else {
       this->Parent->Element(tag, content);
     }
   }
 
+  std::string SuppressStartupBannerCondition;
+
 private:
   cmVisualStudio10TargetGenerator* const TargetGenerator;
   Elem* Parent = nullptr;
@@ -3656,6 +3662,13 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
     }
     if (!clOptions.HasFlag("RemoveUnreferencedCodeData")) {
       clOptions.AddFlag("RemoveUnreferencedCodeData", "");
+      // Visual Studio 2019 with toolset v142 versions 14.20 to 14.28.16.9
+      // fails if both RemoveUnreferencedCodeData and SuppressStartupBanner
+      // are empty.  Since the latter is incidental, make it conditional.
+      if (this->GlobalGenerator->GetPlatformToolsetString() == "v142"_s) {
+        clOptions.SuppressStartupBannerCondition =
+          "'$(VCToolsVersion)' >= '14.29'";
+      }
     }
     if (!clOptions.HasFlag("RuntimeLibrary")) {
       clOptions.AddFlag("RuntimeLibrary", "");