瀏覽代碼

PCH: Report error when setting COMPILE_PDB_NAME property

Reusable precompile headers require specific COMPILE_PDB_NAME property
values. Report error if the user tries to set a different value.
Cristian Adam 6 年之前
父節點
當前提交
e6e189e02b

+ 40 - 0
Source/cmGlobalGenerator.cxx

@@ -355,6 +355,42 @@ bool cmGlobalGenerator::CheckTargetsForType() const
   return failed;
 }
 
+bool cmGlobalGenerator::CheckTargetsForPchCompilePdb() const
+{
+  if (!this->GetLanguageEnabled("C") && !this->GetLanguageEnabled("CXX")) {
+    return false;
+  }
+  bool failed = false;
+  for (cmLocalGenerator* generator : this->LocalGenerators) {
+    for (cmGeneratorTarget* target : generator->GetGeneratorTargets()) {
+      if (target->GetType() == cmStateEnums::TargetType::GLOBAL_TARGET ||
+          target->GetType() == cmStateEnums::TargetType::INTERFACE_LIBRARY ||
+          target->GetType() == cmStateEnums::TargetType::UTILITY ||
+          cmIsOn(target->GetProperty("ghs_integrity_app"))) {
+        continue;
+      }
+
+      const std::string reuseFrom =
+        target->GetSafeProperty("PRECOMPILE_HEADERS_REUSE_FROM");
+      const std::string compilePdb =
+        target->GetSafeProperty("COMPILE_PDB_NAME");
+
+      if (!reuseFrom.empty() && reuseFrom != compilePdb) {
+        const std::string e = cmStrCat(
+          "PRECOMPILE_HEADERS_REUSE_FROM property is set on target (\"",
+          target->GetName(),
+          "\"). Reusable precompile headers requires the COMPILE_PDB_NAME"
+          " property to have the value \"",
+          reuseFrom, "\"\n");
+        this->GetCMakeInstance()->IssueMessage(MessageType::FATAL_ERROR, e,
+                                               target->GetBacktrace());
+        failed = true;
+      }
+    }
+  }
+  return failed;
+}
+
 bool cmGlobalGenerator::IsExportedTargetsFile(
   const std::string& filename) const
 {
@@ -1398,6 +1434,10 @@ bool cmGlobalGenerator::Compute()
     return false;
   }
 
+  if (this->CheckTargetsForPchCompilePdb()) {
+    return false;
+  }
+
   for (cmLocalGenerator* localGen : this->LocalGenerators) {
     localGen->ComputeHomeRelativeOutputPath();
   }

+ 1 - 0
Source/cmGlobalGenerator.h

@@ -610,6 +610,7 @@ private:
 
   bool CheckTargetsForMissingSources() const;
   bool CheckTargetsForType() const;
+  bool CheckTargetsForPchCompilePdb() const;
 
   void CreateLocalGenerators();
 

+ 1 - 0
Tests/RunCMake/VS10Project/RunCMakeTest.cmake

@@ -26,6 +26,7 @@ run_cmake(VsPackageReferences)
 run_cmake(VsDpiAware)
 run_cmake(VsDpiAwareBadParam)
 run_cmake(VsPrecompileHeaders)
+run_cmake(VsPrecompileHeadersReuseFromCompilePDBName)
 
 if(CMAKE_C_COMPILER_ID STREQUAL "MSVC" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.05)
   run_cmake(VsJustMyCode)

+ 1 - 0
Tests/RunCMake/VS10Project/VsPrecompileHeadersReuseFromCompilePDBName-result.txt

@@ -0,0 +1 @@
+1

+ 7 - 0
Tests/RunCMake/VS10Project/VsPrecompileHeadersReuseFromCompilePDBName-stderr.txt

@@ -0,0 +1,7 @@
+CMake Error at VsPrecompileHeadersReuseFromCompilePDBName.cmake:6 \(add_library\):
+  PRECOMPILE_HEADERS_REUSE_FROM property is set on target \("b"\).  Reusable
+  precompile headers requires the COMPILE_PDB_NAME property to have the value
+  "a"
+
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 9 - 0
Tests/RunCMake/VS10Project/VsPrecompileHeadersReuseFromCompilePDBName.cmake

@@ -0,0 +1,9 @@
+project(VsPrecompileHeadersReuseFromCompilePDBName CXX)
+
+add_library(a SHARED empty.cxx)
+target_precompile_headers(a PRIVATE <windows.h>)
+
+add_library(b SHARED empty.cxx)
+target_precompile_headers(b REUSE_FROM a)
+
+set_target_properties(b PROPERTIES COMPILE_PDB_NAME b)