Parcourir la source

VS: Restore support for PCH in CXX but not C within once target

Fix logic from commit 9df1f33c9a (VisualStudio: move PCH rules to
projects when possible., 2020-10-15, v3.20.0-rc1~638^2) to explicitly
disable PCH on sources that should not use the target-wide PCH rules.

Fixes: #21827
Brad King il y a 4 ans
Parent
commit
9945b3b565

+ 5 - 1
Source/cmVisualStudio10TargetGenerator.cxx

@@ -2423,8 +2423,10 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
     const bool makePCH = (sf.GetFullPath() == pchSource);
     const bool useSharedPCH = !skipPCH && (lang == linkLanguage);
     const bool useDifferentLangPCH = !skipPCH && (lang != linkLanguage);
+    const bool useNoPCH = skipPCH && (lang != linkLanguage) &&
+      !this->GeneratorTarget->GetPchHeader(config, linkLanguage).empty();
     const bool needsPCHFlags =
-      (makePCH || useSharedPCH || useDifferentLangPCH);
+      (makePCH || useSharedPCH || useDifferentLangPCH || useNoPCH);
 
     // if we have flags or defines for this config then
     // use them
@@ -2471,6 +2473,8 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
         if (makePCH) {
           pchOptions =
             this->GeneratorTarget->GetPchCreateCompileOptions(config, lang);
+        } else if (useNoPCH) {
+          clOptions.AddFlag("PrecompiledHeader", "NotUsing");
         } else if (useSharedPCH) {
           std::string pchHeader =
             this->GeneratorTarget->GetPchHeader(config, lang);

+ 15 - 0
Tests/RunCMake/PrecompileHeaders/CXXnotC.cmake

@@ -0,0 +1,15 @@
+enable_language(C)
+enable_language(CXX)
+
+add_executable(main
+  no_pch.c
+  use_pch.cxx
+)
+
+target_include_directories(main PUBLIC include)
+target_precompile_headers(main PRIVATE
+  "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/include/cxx_pch.h>"
+  )
+
+enable_testing()
+add_test(NAME main COMMAND main)

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

@@ -14,6 +14,7 @@ run_cmake(PchDebugGenex)
 run_test(PchInterface)
 run_cmake(PchPrologueEpilogue)
 run_test(SkipPrecompileHeaders)
+run_test(CXXnotC)
 run_test(PchReuseFrom)
 run_test(PchReuseFromPrefixed)
 run_test(PchReuseFromSubdir)

+ 1 - 0
Tests/RunCMake/PrecompileHeaders/include/cxx_pch.h

@@ -0,0 +1 @@
+#define CXX_PCH

+ 7 - 0
Tests/RunCMake/PrecompileHeaders/no_pch.c

@@ -0,0 +1,7 @@
+#ifdef CXX_PCH
+#  error "CXX PCH included in C source."
+#endif
+int no_pch(void)
+{
+  return 0;
+}

+ 9 - 0
Tests/RunCMake/PrecompileHeaders/use_pch.cxx

@@ -0,0 +1,9 @@
+#include "cxx_pch.h"
+#ifndef CXX_PCH
+#  error "CXX PCH not included in CXX source."
+#endif
+extern "C" int no_pch(void);
+int main()
+{
+  return no_pch();
+}