浏览代码

Merge topic 'pch-reuse-no-prop'

bb4c2781ce PCH: Do not issue an error on duplicate target_precompile_headers call

Acked-by: Kitware Robot <[email protected]>
Merge-request: !4046
Brad King 6 年之前
父节点
当前提交
e14c9af013

+ 5 - 4
Source/cmGeneratorTarget.cxx

@@ -3360,19 +3360,20 @@ std::string cmGeneratorTarget::GetPchHeader(const std::string& config,
   if (this->GetPropertyAsBool("DISABLE_PRECOMPILE_HEADERS")) {
     return std::string();
   }
+  const cmGeneratorTarget* generatorTarget = this;
+  const char* pchReuseFrom =
+    generatorTarget->GetProperty("PRECOMPILE_HEADERS_REUSE_FROM");
+
   const auto inserted =
     this->PchHeaders.insert(std::make_pair(language + config, ""));
   if (inserted.second) {
     const std::vector<BT<std::string>> headers =
       this->GetPrecompileHeaders(config, language);
-    if (headers.empty()) {
+    if (headers.empty() && !pchReuseFrom) {
       return std::string();
     }
     std::string& filename = inserted.first->second;
 
-    const cmGeneratorTarget* generatorTarget = this;
-    const char* pchReuseFrom =
-      generatorTarget->GetProperty("PRECOMPILE_HEADERS_REUSE_FROM");
     if (pchReuseFrom) {
       generatorTarget =
         this->GetGlobalGenerator()->FindGeneratorTarget(pchReuseFrom);

+ 2 - 5
Source/cmTarget.cxx

@@ -1288,11 +1288,8 @@ void cmTarget::SetProperty(const std::string& prop, const char* value)
     reusedTarget->SetProperty("COMPILE_PDB_OUTPUT_DIRECTORY",
                               cmStrCat(reusedFrom, ".dir/").c_str());
 
-    for (auto p : { "COMPILE_PDB_NAME", "PRECOMPILE_HEADERS",
-                    "INTERFACE_PRECOMPILE_HEADERS" }) {
-      this->SetProperty(p, reusedTarget->GetProperty(p));
-    }
-
+    this->SetProperty("COMPILE_PDB_NAME",
+                      reusedTarget->GetProperty("COMPILE_PDB_NAME"));
     this->AddUtility(reusedFrom, impl->Makefile);
   } else {
     impl->Properties.SetProperty(prop, value);

+ 8 - 1
Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake

@@ -1,8 +1,12 @@
 cmake_minimum_required(VERSION 3.15)
 project(PchReuseFrom C)
 
+if(CMAKE_C_COMPILE_OPTIONS_USE_PCH)
+  add_definitions(-DHAVE_PCH_SUPPORT)
+endif()
+
 add_library(empty empty.c)
-target_precompile_headers(empty PUBLIC
+target_precompile_headers(empty PRIVATE
   <stdio.h>
   <string.h>
 )
@@ -12,6 +16,9 @@ add_library(foo foo.c)
 target_include_directories(foo PUBLIC include)
 target_precompile_headers(foo REUSE_FROM empty)
 
+# should not cause problems if configured multiple times
+target_precompile_headers(foo REUSE_FROM empty)
+
 add_executable(foobar foobar.c)
 target_link_libraries(foobar foo )
 set_target_properties(foobar PROPERTIES PRECOMPILE_HEADERS_REUSE_FROM foo)

+ 7 - 1
Tests/RunCMake/PrecompileHeaders/foobar.c

@@ -4,5 +4,11 @@
 
 int main()
 {
-  return foo() + foo2() + bar();
+  int zeroSize = 0;
+
+#ifdef HAVE_PCH_SUPPORT
+  zeroSize = (int)strlen("");
+#endif
+
+  return foo() + foo2() + bar() + zeroSize;
 }