Browse Source

Merge topic 'objc-pch'

e331367a89 PCH: Add support for OBJC/OBJCXX languages

Acked-by: Kitware Robot <[email protected]>
Merge-request: !3983
Brad King 6 years ago
parent
commit
13ea5f06fa

+ 2 - 0
Modules/Compiler/GNU.cmake

@@ -13,6 +13,8 @@ include(Internal/CMakeCheckCompilerFlag)
 
 set(__pch_header_C "c-header")
 set(__pch_header_CXX "c++-header")
+set(__pch_header_OBJC "objective-c-header")
+set(__pch_header_OBJCXX "objective-c++-header")
 
 macro(__compiler_gnu lang)
   # Feature flags.

+ 0 - 3
Modules/Platform/Windows-Clang.cmake

@@ -8,9 +8,6 @@ if(__WINDOWS_CLANG)
 endif()
 set(__WINDOWS_CLANG 1)
 
-set(__pch_header_C "c-header")
-set(__pch_header_CXX "c++-header")
-
 macro(__windows_compiler_clang_gnu lang)
   set(CMAKE_LIBRARY_PATH_FLAG "-L")
   set(CMAKE_LINK_LIBRARY_FLAG "-l")

+ 28 - 6
Source/cmGeneratorTarget.cxx

@@ -3347,9 +3347,11 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetPrecompileHeaders(
 std::string cmGeneratorTarget::GetPchHeader(const std::string& config,
                                             const std::string& language) const
 {
-  if (language != "C" && language != "CXX") {
+  if (language != "C" && language != "CXX" && language != "OBJC" &&
+      language != "OBJCXX") {
     return std::string();
   }
+
   if (this->GetPropertyAsBool("DISABLE_PRECOMPILE_HEADERS")) {
     return std::string();
   }
@@ -3380,8 +3382,15 @@ std::string cmGeneratorTarget::GetPchHeader(const std::string& config,
       filename = generatorTarget->ObjectDirectory;
     }
 
+    const std::map<std::string, std::string> languageToExtension = {
+      { "C", ".h" },
+      { "CXX", ".hxx" },
+      { "OBJC", ".objc.h" },
+      { "OBJCXX", ".objcxx.hxx" }
+    };
+
     filename = cmStrCat(filename, "CMakeFiles/", generatorTarget->GetName(),
-                        ".dir/cmake_pch", ((language == "C") ? ".h" : ".hxx"));
+                        ".dir/cmake_pch", languageToExtension.at(language));
 
     const std::string filename_tmp = cmStrCat(filename, ".tmp");
     if (!pchReuseFrom) {
@@ -3431,7 +3440,8 @@ std::string cmGeneratorTarget::GetPchHeader(const std::string& config,
 std::string cmGeneratorTarget::GetPchSource(const std::string& config,
                                             const std::string& language) const
 {
-  if (language != "C" && language != "CXX") {
+  if (language != "C" && language != "CXX" && language != "OBJC" &&
+      language != "OBJCXX") {
     return std::string();
   }
   const auto inserted =
@@ -3457,9 +3467,20 @@ std::string cmGeneratorTarget::GetPchSource(const std::string& config,
 
     // For GCC the source extension will be tranformed into .h[xx].gch
     if (!this->Makefile->IsOn("CMAKE_LINK_PCH")) {
-      filename += ((language == "C") ? ".h.c" : ".hxx.cxx");
+      const std::map<std::string, std::string> languageToExtension = {
+        { "C", ".h.c" },
+        { "CXX", ".hxx.cxx" },
+        { "OBJC", ".objc.h.m" },
+        { "OBJCXX", ".objcxx.hxx.mm" }
+      };
+
+      filename += languageToExtension.at(language);
     } else {
-      filename += ((language == "C") ? ".c" : ".cxx");
+      const std::map<std::string, std::string> languageToExtension = {
+        { "C", ".c" }, { "CXX", ".cxx" }, { "OBJC", ".m" }, { "OBJCXX", ".mm" }
+      };
+
+      filename += languageToExtension.at(language);
     }
 
     const std::string filename_tmp = cmStrCat(filename, ".tmp");
@@ -3477,7 +3498,8 @@ std::string cmGeneratorTarget::GetPchSource(const std::string& config,
 std::string cmGeneratorTarget::GetPchFileObject(const std::string& config,
                                                 const std::string& language)
 {
-  if (language != "C" && language != "CXX") {
+  if (language != "C" && language != "CXX" && language != "OBJC" &&
+      language != "OBJCXX") {
     return std::string();
   }
   const auto inserted =

+ 1 - 1
Source/cmLocalGenerator.cxx

@@ -2266,7 +2266,7 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target)
   std::vector<cmSourceFile*> sources;
   target->GetSourceFiles(sources, buildType);
 
-  for (const std::string& lang : { "C", "CXX" }) {
+  for (const std::string& lang : { "C", "CXX", "OBJC", "OBJCXX" }) {
     auto langSources =
       std::count_if(sources.begin(), sources.end(), [lang](cmSourceFile* sf) {
         return lang == sf->GetLanguage() &&